【Vulfocus】XSS-labs通关总结

XSS-labs通关总结

基础知识 https://www.cnblogs.com/-meditation-/p/16168961.html

Level 1

第一关很明显输入test在 <h2>中显示,看过上面链接的文章,就知道这是HTML标签<h2>之间的输出,直接使用<script>alert(1)</script> 就可以弹窗。

源码分析:下面的代码,str获取name的值,直接返回前端使用。说明源码是完全没有对GET请求到的name变量进行过滤,原封不动地发送到浏览器的,所以才会被执行。

Payload

<script>alert(1)</script>  

Level 2

同样是HTML标签之间的输出,输入<script>alert(1)</script> 发现未弹窗

右键查看源代码,发现< > 被转义了,所以不会执行,而<input>标签内也被写入了脚本语句,但是被闭合了。无法弹窗

所以我们可以在<input>标签处下手,利用闭合,输入我们的恶意代码。

Payload

"> <script>alert("1")</script>
"> <script>alert("1")</script//


源码分析:下面的代码str 获取了 keyword的值,返回时,将获取的值转换成html实体,然后输出。但是<input>标签则没有转换成html实体。可以被恶意利用。

htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体
预定义的字符是:
	& (和号) 成为&amp;
	" (双引号) 成为 &quot;
	' (单引号) 成为 &apos;
	< (小于) 成为 &lt;
	> (大于) 成为 &gt;


查看弹窗时的恶意代码 F12-调试器,可以看到插入了弹窗语句。

Level 3

和上一关很相似,尝试上一关的语句,并没有弹窗

查看源代码,发现都被实体编码了。添加事件触发。

根据第二关源码分析,猜测服务器在这两处都用htmlspecialchars()函数进行了处理,此时已经没办法通过闭合,跳出当前这个<input>标签,可以认为是输出在属性内,基础知识的文章里写了,无法<input>闭合标签,同时< >被转义,可以使用如下事件触发型的语句:

' autofocus onfocus=alert(1) '


源码分析:两处都用htmlspecialchars()函数进行了处理,但是<input>标签可以越过< > 进行弹窗

Level 4

尝试普通的<script>alert("1")</script> ,并未弹窗

查看源代码,<h2> 已被转义,<input>标签过滤了< >

用上一关的方法,闭合方式是双引号

" autofocus onfocus=alert(1) "


源码分析:关键点是将 < > 替换成空字符 " "

str_replace(find,replace,string,count) 替换字符串中匹配的值

参数 描述
find 必需。规定要查找的值。
replace 必需。规定替换 find 中的值的值。
string 必需。规定被搜索的字符串。
count 可选。一个变量,对替换数进行计数。

Level 5

尝试普通的<script>alert("1")</script> ,并未弹窗

观察搜索框内并未对符号<,>进行操作,可以利用,但是script无法使用,尝试别的标签

"> <svg onload="alert("xss")">  //onload 不可用 o_nload
"> <img src=1 onmouseover=alert('xss')> //onmouseover不可用 o_nmouseover
...
可用标签
"><a href="javascript:alert(1);">xss</a>


源码分析:过滤了<script 和 on,全部替换成对应的<scr_ipt 和 o_n

Level 6

用上一关的语句,发现href被替换了

经过测试前一关过滤的,这一关依旧过滤,此时我没找到其他标签使用,这个时候考虑大小写转换进行绕过

"> <sCRiPt>alert(1);</sCrIpT>


源码分析:过滤了<script 、on、src、data、href,全部替换成对应的<scr_ipt 、 o_n、da_ta、hr_ef


这里我没有见过 data的XSS,趁机学习一下,Data流的形式输入数据

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></iframe>
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4=">test<a>

Level 7

用上一关的语句测试,"> <sCRiPt>alert(1);</sCrIpT>,发现script,data都被直接去掉了。关键字过滤绕过有大小写,双写关键字和字符串拼接绕过。这里采用双写绕过,字符串拼接适用于标签内的关键字绕过

双写绕过

"><scrscriptipt>alert(1);</scrscriptipt>

源码分析:strtolower() 函数把字符串转换为小写。过滤script、on、src、data、href

Level 8

输入普通的弹窗语句"> <script>alert(1);</script>,双引号和标签关键字都被处理了。


考虑到是a标签,使用javascript:alert(1);但是也被替换了

考虑到写在href里,直接对它进行HTML实体编码绕过

javascript:alert(1);
编码后
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;

源码分析:对输入的字符串进行html实体编码后在进行字符的替换,由于href内属于属性值状态中的字符引用,就是src,herf这样的属性值中的HTML实体,他也是会先进行HTML解码的。

经过我们HTML实体编码的xss攻击语句不会被htmlspecialchars()再次实体编码,返回浏览器后href内的数据再次进行HTML实体解码

Level 9

探测过滤情况

' " < > 
剩下个没有用的单引号。


我估摸着写个正确的链接www.baidu.com,但我又想到会不会只是匹配了协议http://。成功写上

和上一关一样实体编码加上http:// 注释掉http:// 即可

javascript:alert(1);//http://
编码后
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#59;//http://

源码分析:比上一关加了strpos 函数,返回字符串在另一个字符串中第一次出现的位置。果然匹配了http://

strpos(string,find,start)
参数 描述
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定开始搜索的位置。

Level 10

测试过滤情况 ' " >< script onclick 发现只过滤了" 和<>, 发现3个input隐藏域


探测隐藏域接收参数情况,发现t_sort被服务器接收返回前端

well done&t_link=1&t_history=2&t_sort=3

过滤< > 使用第一个语句,不能触发,因为没有可以聚焦的组件。改变type成功弹窗

well done&t_sort=" autofocus onfocus=alert(1)//

well done&t_sort=" type="text" autofocus onfocus=alert(1)//


源码分析:主要就是把t_sort 的 type改成text

Level 11

进入到本页面查看其前端源码,发现又多了一个参数t_ref,一看就知道获取了HTTP的referer字段

用上关的语句,抓包修改referer

" type="text" autofocus onfocus=alert(1)//

源码分析:获取referer字段,过滤< >

Level 12

查看源代码,一看就User-Agent头

" type="text" autofocus onfocus=alert(1)//

源码分析:没啥分析,同上

Level 13

Cookie头,同上没啥写了

" type="text" autofocus onfocus=alert(1)//


Level 14


代码少了,没有办法做下去

Level 15

查看页面源码发现了一个新属性,ng-include,ng-include指令一般用于包含外部HTML文件,ng-include属性的值可以是一个表达式,返回一个文件名,但是默认情况下,包含的文件需要包含在同一域名下,也就是要调用同一域名下的其他网页。


使用语句,过滤< > 给语句使本页面包含了同域名level1.php返回的HTML文件,并将name的字段传入,虽然尖括号被编码了,但是level1的name处是没有任何括号之内的东西的,所以可行。

src='level1.php?name=<img src=1 onerror=alert(/111/)>'
连接多写了个src= 不影响

源码分析:获取src赋值给str,在进行html实体编码返回

Level 16

尝试"> <script>alert(1);</script>

发现尖括号没变,倒是/script还有空格也被干掉了。

但是在html中是可以将%0a%0d作为空格使用的,因为尖括号没被干掉,我们就用<a>标签,因此我们构造语句

<a%0dhref="javas%0acript:alert("1")">xss
<a%0donclick='alert(1)'>xss
<a%0donmouseover='alert(1)'>xss


源码分析:过滤了/ 只能是使用a标签了

Level 17

查看前端代码

发现其两个变量使用=符号拼接的形式被加入到<embed>标签中,该标签用于一些插件如flash等的插入

常规加尖括号的语句会被转为html实体字符,那就只有用事件触发来写,而且事件触发刚好是用等号来连接。

所以我们在b的后边加入onclick(点击后触发)或onmouseover(鼠标移动到上方触发)触发器来进行恶意语句利用

onclick=alert('1')
onmouseover=alert('1')

火狐用不了,换成了谷歌浏览器加载了插件,onclick=alert('1')加载了但是点击不然出。

onmouseover=alert('1')成功


源码:

Level 18

用上一关语句可以成功 onmouseover=alert('1')

源码分析:和上一关一样

Level 19

用上一关的语句无法弹窗,查看源代码,src的值使用双引号括起来的。

实在搞不出来 找了网上的攻击语句<a href="javascript:alert(1)">123</a> 也没成功

Level 20

没成功

总结

1.无过滤机制
2.闭合标签
3.单引号闭合 + 添加事件
4.双引号闭合 + 添加事件
5.双引号闭合 + 新建标签
6.大小写绕过
7.双写绕过
8.编码绕过
9.检测关键字
10.隐藏域打XSS
11.Referer字段打XSS
12.User-Agent字段打XSS
13.Cookie字段打XSS
14.代码不全做不了
15.ng-include 属性
16.空格实体转义
17.embed参数拼接
18.embed参数拼接
19-20 Flash xss 没搞出来
posted @ 2022-04-22 11:11  九天揽月丶  阅读(563)  评论(0编辑  收藏  举报