XSS-labs通关记

    科技2022-08-14  101


    title: XSS-labs通关记

    目录

    title: XSS-labs通关记 level1level2level3level5level6level7level8level9level10level11level12level13level14level15level16level17level18level19/level20

    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标签并且使用换行( )来替换空格,构造新的payload:

    <img src=x onerror=alert(1)>

    测试成功:

    level17

    可以看到 <embed> 标签, 标签定义嵌入的内容,比如插件。这里嵌入了 swf 格式也就是 flash 专用格式。这里直接插入事件payload即可:

    onmouseover=alert(1)

    测试成功:

    level18

    看源码与level17雷同: level17payload可用:

    onmouseover=alert(1)

    level19/level20

    两道flash XSS,暂且在能力范围外,改天回头研究。

    Processed: 0.010, SQL: 8