Json劫持

我知道在有生之年无法找到任何理由替自己辩解,因为我便是我自己的障碍。 ——维斯拉瓦·辛波斯卡《万物静默如谜》

0x00 json简介

ajax以自定义字符串、XML、json等格式来交换数据。
跨域的需求如何解决?服务器端代理(nginx)、jsonp、允许跨域的响应头(即跨域资源共享cors)。

json是一种数据交换格式。

jsonp是一个非官方的数据交换协议,利用script元素的开放策略,用来实现跨域访问,因为网页可以得到其他源动态产生的json数据。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了

0x01 json劫持

“json hijacking”攻击过程和csrf类似,csrf发送的是HTTP请求,json hijackjing的目的是获取敏感数据。一些web应用会把一些敏感数据以json的形式返回到前端,如果仅以cookie来判断请求的合法性,那么就可以利用类似csrf的手段,向目标服务器发送请求,获取敏感数据。

现有页面http://www.f4guo.com/userinfo ,该页面在用户登录的情况下会返回json格式的用户信息。
攻击者在其虚假的页面中加入如下标签:

1
<script src="http://www.test.com/userinfo"></script>

正常用户如果在浏览器中登录了 www.f4guo.com ,且cookie没有过期,然后访问了攻击者的虚假页面,那么攻击者就能获取到json形式的敏感数据。
因为script标签会自动解析json数据,生成对应的js对象,然后通过 Object.prototype._defineSetter 这个函数来触发恶意代码。目前这个函数在当前最新版本chrome和firefox浏览器中已经失效了。

0x02 json漏洞挖掘

burpsuite中HTTP history搜寻返回有json形式的敏感数据,然后复制url到poc中进行验证。
验证poc:

1
2
3
4
5
6
7
<script>
function jsonp1(json){
alert(JSON.stringify(json))
}
</script>

<script src="https://xxx.xom/xxx?callback=jsonp1"></script>

保存为.html然后部署到自己的服务器进行解析执行。

0x03 json劫持防御

1、严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。
3、严格过滤 callback 函数名及 JSON 里数据的输出。
4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。
5、其他一些比较“猥琐”的方法:如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ;这样的代码来防止 JS 远程调用。


摘自:http://blog.knownsec.com/2015/03/jsonp_security_technic/

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×