0x00 前言

蜜罐,凭借特有的设备指纹等技术描绘出攻击者画像,帮助防守者捕获大量攻击者的网络身份、姓名、电话、照片等真人信息,很大程度地扭转了攻防不对称的局面,各种蜜罐的流行让各位师傅苦不堪言,每次撸站都小心翼翼,稍有不慎,蓝队可能顺着网线就来捶你。此篇文章主要分析了蜜罐中使用的jsonp劫持技术的原理。

0x01 同源策略

浏览器沙盒、同源策略是浏览器中的两个安全机制。浏览器沙盒是一种按照安全策略限制程序行为的执行环境,恶意代码在沙盒中运行也无法破坏我们的主机,如hw那段时间沸沸扬扬的ChromeRCE,如果受害者没有关闭沙盒,你只能执行个寂寞。同源策略就是指同协议、同域名、同端口,必须三同才能通信,比如https://www.666.cn下的js想去访问https://api.666.cn下的资源,浏览器就会觉得这是不安全的不会允许该请求。如图1与图2所示。

图1.同源策略说明

图2.同源策略说明

不同源也意味着不能通信,浏览器使用了同源策略之后,好处就是能确保用户正在查看的页面确实是来自于正在浏览的域,坏处是一些业务就是需要进行跨域操作,同源策略显然就阻挡了业务需求。这就比较蛋疼了,比如腾讯有很多个事业部,不同事业部使用不同的子域,你使用不同的服务的时候,可能会去获取其他事业部的数据这样的话就需要跨域进行访问了。那么如何进行跨域访问呢?这就要说到JSONP跨域请求了。

0x02 JSONP劫持原理

JSONP就是为了跨域获取资源 而产生的一种非官方的技术手段(官方的有 CORS 和 postMessage),它利用的是 script 标签的 src 属性不受同源策略影响的特性。该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。

JSONP漏洞利用过程如下:

1.用户在网站A注册并登录,网站A包含了用户的id,name等信息;

2.用户通过浏览器向网站B发出URL请求;

3.网站B向浏览器返回响应页面响应页面中注册了JavaScript的回调函数(如图3所示)和向网站A请求的script标签;

图3.响应的回调函数

4.浏览器收到响应,解析js代码,将回调函数作为参数传给A网站,A网站接收到请求,解析url,然后将用户的信息封装成json格式作为回调函数的值返回给浏览器。

图4.封装的json格式的用户信息

5.这里的代码仅将用户信息通过alert函数展示出来,攻击者也可以直接将用户数据直接上传至B网站服务器,这样就完成了对敏感信息的获取。

图5.jsonp劫持流程

0x03 JSONP劫持漏洞的危害

JSONP劫持是一种敏感信息泄露的漏洞,经过攻击者巧妙而持久地利用,会对企业和用户造成巨大的危害。JSONP 漏洞主要被攻击者用来在受害者不知不觉中窃取他们的隐私数据,APT 组织采用JSONP进行信息收集和水坑攻击;诈骗组织可以通过JSONP劫持获取受害者大量个人信息,之后进行“精准诈骗”(毕竟来个电话能说出你姓名身份证号有几套房几辆车有几个男/女朋友你肯定很慌对吧);而蜜罐通过收集各类公司存在JSONP劫持漏洞的接口,来获取攻击者的真实信息;如图6是github上大佬收集的某商业蜜罐使用的各公司存在JSONP劫持漏洞的接口。

图6.某商业蜜罐使用JSONP接口

0x04 JSONP劫持与CSRF的相同与不同

相同:

1.需要用户点击恶意链接。

2.用户必须登陆该站点,在本地存储了Cookie。

不同:

1.JSONP劫持必须找到跨站请求资源的接口来实施攻击,需要传回回调函数。

2.Jsonp劫持的目的是获取敏感数据,CSRF的目的根据接口不同目的更加多样。

0x05 JSONP劫持漏洞的防御

对于JSONP劫持的防御,其实类似于csrf的防御,如下总结了几个JSONP劫持漏洞的防御方案:

1.严格定义Content-Type:application/json

在早期JSON出现时候,大家都没有合格的编码习惯。再输出JSON时,没有严格定义好Content-Type(Content-Type:application/json)然后加上callback这个输出点没有进行过滤直接导致了一个典型的XSS漏洞,严格定义Content-Type:application/json后,这样的防御机制导致了浏览器不解析恶意插入的XSS代码(直接访问提示文件下载)。

2.严格安全的实现CSRF方式调用JSON文件:限制Referer、部署一次性Token等,这个就类似csrf的解决方案了。

3.严格过滤callback函数名及JSON里数据的输出。

4.其他一些比较“猥琐”的方法:如在Callback输出之前加入其他字符(如:/**/、回车换行)这样不影响JSON文件加载,又能一定程度预防其他文件格式的输出。还比如Gmail使用AJAX的方式获取JSON,通过在输出JSON之前加入while(1);这样的代码来防止JS远程调用。

0x06 结尾

Jsonp在跨域读取数据的场景中用起来是十分舒服,但也不能忽视它的安全问题。最后我也想不出什么骚话了,就祝各位师傅早日实现财富自由吧。

参考文献

[1]黄玮,崔宝江,胡正名.Web应用程序客户端恶意代码技术研究与进展[J].电信科学,2009,25(02):72-79.

[2]陈铁明. 网络空间安全实战基础[M].人民邮电出版社:, 201802.360.

[3]闫玺玺. 开放网络环境下敏感数据安全与防泄密关键技术研究[D].北京邮电大学,2012.

[4]童瀛,姚焕章,梁剑,王玺罡,周宇.基于跨浏览器指纹识别技术的应用研究[J].网络安全技术与应用,2020(11):64-67.

[5]刘雅辉,张铁赢,靳小龙,程学旗.大数据时代的个人隐私保护[J].计算机研究与发展,2015,52(01):229-247.

[6]潘志岗.互联网企业Web系统易忽视漏洞分析[J].信息安全研究,2020,6(02):181-187.

[7]罗武,沈晴霓,吴中海,吴鹏飞,董春涛,夏玉堂.浏览器同源策略安全研究综述[J].软件学报,2021,32(08):2469-2504.DOI:10.13328/j.cnki.jos.006153.