偶尔走失,从未离开

本文以大家对JSON Hijacking的一些误解开始,来谈一谈JSON Hijacking这一漏洞

文章目录:

从历史角度看JSON Hijacking

今天和同事讨论一个JSON Hijacking的问题时,他认为 我所说的不是JSON Hijacking,而是JSONP Injection。

他说: CSRF中所补充的攻击技术应该称为JSONP Injection,与JSON Hijacking是不同的技术原理

他提到的这一点,其实也是很值得去思考,很有意思的一点,简单来说就是要解决两个问题:

1."通过callback参数利用JSONP来劫持数据"这一漏洞的命名问题

2.劫持(Hijacking)和注入(Injection)应该如何区别的问题

0x01 该漏洞的命名问题

借助一定的手段来劫持JSON格式的数据,实际上出现过两种漏洞。

1.历史漏洞

第一种是通过重写js对象(重写数组对象的构造函数,或者是借助于Object.__defineSetter__),来劫持敏感数据。

该漏洞并不需要一个可控的callback参数,只要接口返回的是JSON格式的数组即可。所以其危害更大,适用范围更广。

不过这一漏洞,很久前已经被所有的现代主流浏览器所修复,目前已经不允许重写对象了。

2.现今漏洞

第二种是需要借助可控的callback参数,构造一个传参函数,来劫持数据,比如构造如下的url:

http://xxx.com/json.php?callback=Wooyun

访问将返回如下结果:

Wooyun({"name":"lihua", "phone":"13359125120"})

而Wooyun()函数,是我们利用页面里的一个自定义函数,它的功能是将传入的数据外发到我们的vps上,这也正是劫持的原理

JSONP是为了实现跨域数据传输而出现的一种思路,本质上是一种对JavaScript的巧妙使用,所以也不存在修复这一说法。

因此,虽然出现过两种可以劫持JSON数据的漏洞,但是这么多年来,大家能碰见,能够利用到的也只有第二种。

所以目前一提到JSON劫持相关的漏洞,大家都想到的是callback这种。

3.主流命名

剑心(乌云)将"通过callback参数利用JSONP来劫持数据"这一漏洞,称为JSON Hijacking

http://wooyun.jozxing.cc/static/drops/papers-42.html

TSRC, JDSRC在其漏洞评分与定级中,也将其称为JSON Hijacking

https://security.tencent.com/uploadimg_dir/other/TSRC.pdf
http://security.jd.com/#/notice/194

也有人将其称为JSONP Hijacking,比如银联SRC

https://security.unionpay.com/notice/detail?id=57

综上,以及我自己对漏洞的理解,我觉得更准确的叫法应该是 JSON Hijacking,JSONP只是利用的方式罢了。

0x02 Hijacking 和 Injection

实际上,也有很多人将JSON Hijacking 叫做 JSON Injection,这就回到了一个最简单的问题上,什么是注入,什么是劫持呢?

JSON 出现的这两种漏洞,主要还是以劫持和窃取敏感数据为主,我们并没有通过向目标网站的处理逻辑中注入额外数据来实施攻击。即使是JSONP,我们也只是提供了一个callback参数罢了。

客户端发送JSON格式的请求,服务端读取请求之后,将其中的某些值带入了逻辑判断中,或者是带入数据库查询。在这一过程中,我们可以通过注入额外数据,来达到扰乱逻辑或提取数据的目。这一类漏洞,称为JSON Injection,我觉得更为恰当一些。

其实,命名混乱,不只是这一个漏洞。比如很多人将XXE,就误称为XML注入。上传漏洞中 用NTFS特性绕过校验,很多人将其误称为 冒号截断。

这样的问题还有很多,本质上都是对漏洞理解不够深刻,才会产生各种各样的误解。

0x03 参考

 标签: JSON, Hijacking

作者  :  watcher


添加新评论