JSON

扯谈web安全之JSON(2)

字号+ 作者:H5之家 来源:H5之家 2017-01-28 13:02 我要评论( )

在攻击页面上插入以下的代码,就可以获取到用户的所有的朋友的信息。 script Object.prototype.__defineSetter__(user,function(obj){alert(obj);} );/scriptscript src=/script 这个漏洞在前几年很流行,比如qq邮

在攻击页面上插入以下的代码,就可以获取到用户的所有的朋友的信息。

<script> Object.prototype.__defineSetter__('user',function(obj) {alert(obj); } ); </script> <script src=""></script>

这个漏洞在前几年很流行,比如qq邮箱的一个漏洞:

现在的浏览器都已经修复了,可以下载一个Firefox3.0版本来测试下。目前的浏览器在解析JSON Array字符串的时候,不再去触发setter函数了。但对于object.xxx 这样的设置,还是会触发。

IE的utf-7编码解析问题

这个漏洞也曾经很流行。利用的是老版的IE可以解析utf-7编码的字符串或者文件,绕过服务器的过滤。举个乌云上的例子:

有这样的一个jsonp调用接口:

?callback=%2B%2Fv8%20%2BADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACgAMQApADsAPAAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg

url decoder之后是:

?callback=+/v8 +ADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACgAMQApADsAPAAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg

因为jsonp调用是直接返回callback包装的数据,所以实际上,上面的请求直接返回的是:

+/v8 +ADwAaAB0AG0APgA8AGIAbwBkAHkAPgA8AHMAYwByAGkAcAB0AD4AYQBsAGUAcgB0ACgAMQApADsAPAAvAHMAYwByAGkAcAB0AD4APAAvAGIAbwBkAHkAPgA8AC8AaAB0AG0APg-(调用结果数据)

IE做了UTF-7解码之后数据是这样子的:

<htm><body><script>alert(1);</script></body></htm>(调用结果数据)

于是,就执行了XSS。

另外用IFrame也是可以的。但是我在IE8上测试,url的后缀需要是html才会触发。

IE把没有声明返回Content-Type的请求当做了”text/html”类型的,然后解析就有问题了。只要服务器端显式设置了Content-Type为”application/json”,则IE不会识别编码,就不会触发漏洞。所以说服务器端的Content-Type一定要设置对。尽管设置之后调试有点麻烦,但是却大大提高了安全性。

其它的一些东东 MongoDB注入

这个实际上就是JSON注入,简单的字符串拼接,可能会引发各种数据被修改的问题。

JSON解析库的问题

有些JSON库解析库支持循环引用,那么是否可以构造特别的数据,导致其解析失败?从而引起CPU使用过高,拒绝服务等问题?

FastJSON的一个StackOverflowError Bug:https://github.com/alibaba/fastjson/issues/76

有些JSON库解析有问题:

JSON-P

有人提出一个JSON-P的规范,但是貌似目前都没有浏览器有支持这个的。原理是对于JSONP请求,浏览器可以要求服务器返回的MIME是”application/json-p”,这样可以严格校验是否合法的JSON数据。

CORS(Cross-Origin Resource Sharing)

为了解决跨域调用的安全性问题,目前实际上可用的方案是CORS:

  • https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  • 原理是通过服务器端设置允许跨域调用,然后浏览器就允许XMLHttpRequest跨域调用了。

    CORS可以发起GET/POST请求,不像JSONP,只能发起GET请求。

    默认情况下,CORS请求是不带cookie的。

    我个人认为,这个方案也很蛋疼,一是需要服务器配置,二是协议复杂。浏览器如果不能确定是否能够跨域调用,还要先进行一个Preflight Request。

    实际上,即使服务器不允许CORS,XMLHttpRequest请求实际上是发送出去,并且返回数据的了,只是浏览器没有让JS环境拿到而已。

    另外,我认为有另外一种数据泄露的可能:黑客可能控制了某个路由,他不能随意抓包,但是他可以在回应头里插入一些特别的头部,比如:

    Access-Control-Allow-Credentials: true

    那么,这时XMLHttpRequest请求就是带cookie的了。

    最初的问题

    回到最初的问题:

  • 为什么XMLHttpRequest要遵守同源策略?
  • 即使XMLHttpRequest是不带Cookie的,也是有可能造成数据泄露的。比如内部网站是根据IP限制访问的,如果XMLHttpRequest不遵守同源策略,那么攻击者可以在用户浏览网页的时候,发起请求,取得内部网站数据。

  • XMLHttpRequest 请求会不会带cookie?
  • 同域情况下会,不同域情况下不会。如果服务器设置Access-Control-Allow-Credentials: true ,也是可以跨域带Cookie的。

  • <script scr=”…”> 的标签请求会不会带cookie?
  • 会。

  • 向一个其它域名的网站提交一个form,会不会带cookie?
  • 会。

    总结 参考:

     

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

    相关文章
    • 遍历 JSON 的键值对

      遍历 JSON 的键值对

      2017-01-28 14:02

    • TurboGears JSON渲染

      TurboGears JSON渲染

      2017-01-28 13:01

    • jquery处理json数据返回数组和输出的方法

      jquery处理json数据返回数组和输出的方法

      2017-01-28 11:04

    • JSON--List集合转换成JSON对象详解

      JSON--List集合转换成JSON对象详解

      2017-01-27 18:06

    网友点评