Tips of xss-target

xss-target是我从github上找到的一个开源项目,只可惜没提供解题思路,在此奉上自己做题时的一些解法,供大家参考。大家在做的时候建议用firefox浏览器,毕竟大多数是反射型xss,使用其他浏览器会受其xss filter的影响。xss-target传送门

level1

  • 常规做法,反射点为body标签,直接上payload:<script>alert(1)</script>

level2

  • 查看页面源码,可以看到反射点在<input name=keyword value="">里的value中,可以选择闭合双引号
    payload:" onclick="alert(1)
  • 其实level2本意是想让你新创建<script>标签,即payload为:"><script>alert(1)</script> , 但只要达到同样效果便可。

level3

  • 这次的反射点依旧是在<input name="keyword" value=>里的value中,但是这是过滤了双引号,应该是经过了htmlspecialchars并且仅过滤了双引号,因为当你把payload写成'onclick='alert(1)时就可以绕过。

level4

  • 与level2的payload相同:"onclick="alert(1)

level5

  • 这一关基本上就没法用事件触发了,因为你会发现所有的on字段都被转换成o_n,但是双引号还是可以闭合的,因此,可以尝试闭合标签并新建一个<a>标签,href用js伪协议。
  • payload:"><a href="javascript:alert(1)">haha

level6

  • 基本上从这一关开始,每一题的payload都不同于前面几关,这一关里,后端将on src href script全都转换成其他的了,乍一看有些不知所措 :p ,但是这里还是可以闭合标签的。实际上,html对标签规范书写的要求很低,标签名可以大小写参杂。因此,payload可以是:"><ScriPt>alert(1)</scRipt>"

level7

  • by the way,每一关都是建立在上一关的过滤基础上进行过滤的,这一次大小写参杂不起作用,应该是后端将输入的字符县转换成小写的,按照level6的payload提交后,你会在反射点处发现<ScriPt>变成了<>,那么可以尝试一个经典的绕过payload:">scriscriptpt>alert(1)</scriscriptpt>"

level8

  • 不得不说,这一关有一点狗血…题意一目了然,就是将你的输入反射到“友情链接”的href值里去,一开始你会想必然得用js伪协议啊-。- 想法很对,但不久你也会发现,后端将包含script的字段替换成scr_ipt,那就还是看你怎么绕了~
    同样,html对标签规范书写的低要求,让你可以在<script>中参杂着\t \n等,这些都不影响浏览器的解析。因此,payload可以是:java script:alert(1)(其中a与s用\t间隔)

level9

  • 这里同样是添加友情链接,但是用level8的payload后端会提示链接不合法,试了很多字符段后发现,你的输入必须有http://而不管其出现在什么位置,就会被认为是合法链接,因此,payload可以是:javascr ipt:alert(1)//http://像这样将http://注释掉即可。

level10

  • 这一关主要是找对反射点,正确的反射点应该是在<input name="t_sort" value= type="hidden">中的value值里,注意到这里的input是hidden类型,payload里需要将type改成其他类型:" type="text" onclick="alert(1)

level11

  • 在这一关里,足够细心才有可能找到反射点。对了,就是在t_ref里,这里存放的是$_SERVER['HTTP_REFERER']的值,如果是从level10跳转来的并且使用的是FF/GG浏览器,那么你会发现在t_ref中是已经经过encode的referer了。但IE下不会(测试的是IE8),因此,可以这样做:

level12

  • 与level11相似,这次反射点是在t_ua的value里,因此,得想办法修改默认的User-Agent。firefox里就有很多修改ua的插件,例如:
    payload:"type=text onclick="alert(1)

level13

  • 同样,这次是在cookie中,推荐一个插件:tamper data
    payload同上

level14

  • 这一关有些问题,直接看level15吧。

level15

  • 还是找反射点,查看页面源码可以发现:

    1. 页面导入了angularjs
    • 反射点是在class="ng-include: 'src'"
    • 可控参数实际上是$_GET['src']
  • angularjs中的ng-include有如下用法:

    1. ng-include,如果单纯指定地址,必须要加引号
    2. ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册
    3. ng-include,加载外部html中含有style标签样式可以识别
    4. ng-inclue,记载外部html中的link标签可以加载
  • 由此可见,我们可以构建一个页面 test.htmlbody下写一个<img src="" onerror="alert(1)">,然后?src='test.html',成功执行

level16

  • 先尝试一下,看看哪些字段被过滤:script(大小写过滤)、空格/\t,这些都被替换成了&nbsp;
  • 常见的bypass是不起效了,而且过滤了/,导致一些需要闭合的标签也没法用
  • 可以尝试一些不需要闭合的标签,例如我们喜欢的img
  • 可是空格/都被过滤,imgsrconerror怎么间隔开呢?还是像以前一样,html标签内容支持以多个空格、换行符、缩进符进行间隔,换行符还没有过滤呢~
  • 构造payload:<img%0asrc=""%0aonerror="alert(1)"

level17/18

  • 看源码发现,这两题是一样的。。。
  • payload:?arg01=a&arg02=b onmouseover=alert(1)