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
还是找反射点,查看页面源码可以发现:
- 页面导入了
angularjs
;
- 反射点是在
class="ng-include: 'src'"
; - 可控参数实际上是
$_GET['src']
。
- 页面导入了
angularjs
中的ng-include
有如下用法:- ng-include,如果单纯指定地址,必须要加引号
- ng-include,加载外部html,script标签中的内容不执行,不能加载,如果需要控制器处理需要在主页中注册
- ng-include,加载外部html中含有style标签样式可以识别
- ng-inclue,记载外部html中的link标签可以加载
由此可见,我们可以构建一个页面 test.html,
body
下写一个<img src="" onerror="alert(1)">
,然后?src='test.html'
,成功执行
level16
- 先尝试一下,看看哪些字段被过滤:
script
(大小写过滤)、空格
、/
、\t
,这些都被替换成了
- 常见的
bypass
是不起效了,而且过滤了/
,导致一些需要闭合的标签也没法用 - 可以尝试一些不需要闭合的标签,例如我们喜欢的
img
- 可是
空格
和/
都被过滤,img
、src
和onerror
怎么间隔开呢?还是像以前一样,html
标签内容支持以多个空格、换行符、缩进符进行间隔,换行符还没有过滤呢~ - 构造payload:
<img%0asrc=""%0aonerror="alert(1)"
level17/18
- 看源码发现,这两题是一样的。。。
- payload:
?arg01=a&arg02=b onmouseover=alert(1)