本文将介绍xss-labs1-20关的解题思路和通关答案
level-1
第一关开始的URL为
http://localhost/xss-labs/level1.php?name=test观察页面源代码可以发现,test被放在h2标题上,直接被显示出来的,所以直接在URL上修改name=<script>alert(1)</script>就可以弹窗了
level-2
第二关是使用了input标签,也就是输入框,将关键词keyword的值value从输入端传回后端,因为后端没有过滤,直接把用户输入放进了 value 属性里,所以只要用双引号闭合 value=",再用 > 闭合 <input> 标签,后面的 <script> 就能独立执行。
在输入框输入将value闭合,弹窗跳出,即为成功
"><script>alert(1)<script>level-3
第三关还是keyword和value,不过闭合的是单引号而不是双引号,跟上一关一样,先闭合value值就行,但是输入<script>alert(1)</script>时不会弹窗,看源码发现<和>都被过滤成<和>,这两个不会被浏览器识别为<和>,所以要使用没有括号的οnclick=alert(1),意为当点击这个input时会执行alert(1)弹窗
' onclicl='alert(1)level-4
与第三关一样,这也是过滤<>,不同的只是将单引号改为双引号
level-5
第五关源码乍一看跟第四关一样,当使用第四关的答案时发现对onclick进行过滤了,转为了o_nclick,明显不起作用,既然script标签和onclick事件不起作用,那就使用javascript:alert(1)伪协议和a标签组成一个伪链接,点击后执行伪协议
先闭合>和"
"><a href=javascript:alert(1)>1</a>level-6
第六关又把a标签的href过滤了,尝试一下大小写混写,看看有没有过滤大小写,发现大写的没有被过滤掉,那就直接可以了
"><a Href=javascript:alert(1)>a</a>level-7
第7关不像上一关还留个hr_ef给你,直接把href,script删掉了,既然是删掉,那就用双写绕过
"><scrscriptipt>alert(1)</scrscriptipt>level-8
第八关直接甩了个a标签给我们,输入会到href标签里,但是javascript标签被过滤了,包括<,>,",href,script都被过滤了,可以使用HTML实体编码绕过检测,让后端检测不到javascript关键词
这是javascript:alert(1)的十进制编码,在控制台输入代码即可得到
javascript:alert(1)function toDecimal(str) { return str.split('').map(ch => '&#' + ch.charCodeAt(0) + ';').join(''); } toDecimal('javascript:alert(1)');level-9
第九关也是输入到链接上,不过他在上一关的基础上,会检测你的链接合不合法,不合法就会被过滤,判断合不合法的关键就是有没有http://,有就是合法的,再将http://过滤,让后端检测后输出的是javascript:alert(1)
javascript:alert(1)//http://level-10
第十关观察源码,发现多了三个input,3个参数,给三个参数一起传输值111,发现就t_sort参数可以传输,现在修改t_sort,闭合value,让输入框不再隐藏,同时使用点击事件或者滑动事件来弹窗
level10.php?t_sort=" type="text" onclick="alert(1)level-11
第十一比第十关多了个t_ref参数,使用第十关的方法发现双引号被转义了,所以要从第四个参数入手,应该是referer请求头,在浏览器上安装hackbar插件或者使用burp抓包,我这边使用浏览器的HackBar插件
打开F12,点击HackBar,勾选Referer,随便修改个1,发现确实改变了,证明猜想没错
与上一关一样,修改参数,闭合value,让输入框不再隐藏,同时使用点击事件或者滑动事件来弹窗,然后点击excute执行
" type="text" onclick="alert(1)level-12
第十二跟第十一比,少了t_ref参数,多了个t_ua参数,既然ref是referer,那ua能不能猜到是user agent,跟上一关一样,使用HackBar插件来修改,发现确实改变了,那就没猜错了
在输入框输入后,使用excute执行
" type="text" onclick="alert(1)level-13
第十三关看源码,又改成了t_cook,按规律应该是cookie,但是我尝试传输1给cookie,发现没有输出到input上,是不是说明不是cookie的值?是因为cookie需要user=才能传输,后端写死的cookie的名字,改其他的都不行,只能用user=
与前两关一样,打开F12的HackBar,然后勾选cookie框,输入后执行excute
user=" type="text" onclick="alert(1)level-14
14关解不了,因为src上的链接已经失效了
level-15
第15关的源码里出现了ng-include代码,ng-include就是引用这个1.gif的内容,那我们把1.gif改成前面关卡可以弹出弹窗的内容,不就可以跳过了吗
我使用了第4关的页面,在URL里输入第4关的答案,因为第3关有单引号,会提前闭合单引号,解析失败
?src='level4.php?keyword=" onclick="alert(1)'level-16
第16关第一眼看也是keyword,而且看源码发现keyword值裸露在外,我就尝试最简单的script标签,发现script标签被过滤成一段 ,再尝试更多标签,发现a标签,input标签等等常用标签都被过滤,试试不常用的,发现svg,math标签都没被过滤,刚好svg标签可以用来弹窗,空格也被过滤了,所以用%0a代替
keyword=<svg%0aonload=alert(1)>level-17-20
17到20关都依赖Flash插件,但是现在市面上的浏览器都不太支持flash插件,所以这边只简单讲解通关方法进入后URL有出现arg01=a&arg02=b,a和b是flash的参数,只需要后面加上οnmοuseοver=alert(1)就行。然后鼠标划过flash区域就会弹窗