5

深入理解JSONP漏洞

 2 years ago
source link: https://yinwc.github.io/2021/04/29/JSONP%E6%BC%8F%E6%B4%9E/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

深入理解JSONP漏洞



Word count: 1.8k / Reading time: 6 min
 2021/04/29   Share

JSONP是JSON with padding(填充式JSON或参数式JSON)的简写。
JSONP就是为了解决跨域资源请求而产生的一种解决方案,动态创建<script>标签,然后利用<script>src不受同源策略约束来跨域获取数据。
JSONP由两部分组成:回调函数数据
回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。

对同源策略免疫的标签:<img>src<link>href<script>src
JSONP就是利用script标签的src属性实现跨区域请求的
JSONP的过程:幼稚园吃午饭,小明吧贴有自己名字的碗(回调函数)给了幼稚园阿姨(服务器),阿姨给小明盛好饭(json参数)以后又把碗还给了小明。
动态创建<script>标签,设置其src,回调函数在src中设置:

var script = document.createElement("script");
script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);

在页面中,返回的JSON作为response参数传入回调函数中,通过回调函数来来操作数据。

function handleResponse(response){
// 对response数据进行操作代码
}

漏洞危害及利用方式

获取用户的敏感信息
JSONP是一种敏感信息泄露的漏洞,经过攻击者巧妙而持久地利用,会对企业和用户造成巨大的危害。攻击者通过巧妙设计一个网站,网站中包含其他网站的JSONP漏洞利用代码,将链接通过邮件等形式推送给受害人,如果受害者点击了链接,则攻击者便可以获取受害者的个人的信息,如邮箱、姓名、手机等信息,这些信息可以被违法犯罪分子用作“精准诈骗”。对方掌握的个人信息越多,越容易取得受害人的信任,诈骗活动越容易成功,给受害人带来的财产损失以及社会危害也就越大。

漏洞利用方式

(一)利用过程
1、用户在网站B 注册并登录,网站B 包含了用户的id,name,email等信息;
2、用户通过浏览器向网站A发出URL请求;
3、网站A向用户返回响应页面,响应页面中注册了JavaScript的回调函数和向网站B请求的script标签,示例代码如下:

<script type="text/javascript">
function Callback(result)
{
alert(result.name);
}
</script>
<script type="text/javascript" src="http://B.com/user?jsonp=Callback"></script>

3、用户收到响应,解析JS代码,将回调函数作为参数向网站B发出请求;
4、网站B接收到请求后,解析请求的URL,以JSON 格式生成请求需要的数据,将封装的包含用户信息的JSON数据作为回调函数的参数返回给浏览器,网站B返回的数据实例如下:

Callback({"id":1,"name":"test","email":"[email protected]"})

5、网站B数据返回后,浏览器则自动执行Callback函数对步骤4返回的JSON格式数据进行处理,通过alert弹窗展示了用户在网站B的注册信息。另外也可将JSON数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。

(二)自动化测试工具Selenium + Proxy + 验证脚本

(1)Selenium:可用于自动化对网页进行测试,“到处”点击按钮、超链接,以期待测试更多的接口;
(2)Proxy:用于代理所有的请求,过滤出所有包含敏感信息的JSONP请求,并记录下HTTP请求;
(3)验证脚本:使用上述的HTTP请求,剔除referer字段,再次发出请求,测试返回结果中,是否仍包敏感信息,如果有敏感信息,说明这个接口就是我们要找的!

jsonp_info_leak:https://github.com/qiaofei32/jsonp_info_leak

(三)结合其他漏洞来进行拓展攻击
1、JSONP 跨域劫持
实际上就是由于服务器端对JSONP 的请求来源的检查不严格导致的
攻击者模拟用户向有漏洞的服务器发送JSONP请求,然后就获取到了用户的某些信息,再将这些信息发送到攻击者可控的服务器

2、JSONP 跨域劫持token 实现CSRF
通过 jsonp 发起请求,得到泄露的 csrf_token 然后,利用这个token 实现CSRF 攻击

(四)Referer头绕过
1、data:URL
使用data URI来构造一个不带HTTP Referer的请求,来绕过检测
因为正在处理的代码包含了引号,双引号,以及其他一些被阻止的语句,接着使用base64编码我们的payload(回调函数定义以及脚本包含)
data:text/plain;base64our_base64_encoded_code:

以下3个HTML标签允许我们使用data URI方案:

iframe (在src属性中) – Internet Explorer下不工作
embed (在src属性中) – Internet Explorer及Microsoft Edge下不工作
object (在data属性中) – Internet Explorer及Microsoft Edge下不工作

2、从HTTPS向HTTP发起请求
如果目标网站可以通过HTTP访问,也可以通过将我们的代码托管在一个HTTPS页面来避免发送HTTP Referer。如果我们从HTTPS页面发起一个HTTP请求,浏览器为了防止信息泄漏是不会发送Referer header。以上我们要将恶意代码托管在一个启用了HTTPS的站点。
注意:由于mixed-content安全机制,在浏览器默认设置下是不会工作的。需要受害者手动允许浏览器发出的安全警告。

人工测试:
在浏览器中查找一些关键词,如: callback json jsonp email
常见的关键词如下:

cb
callback
jsoncb
jsonp
jQuery
jsoncallback
jsonpcallback
jsoncall
jsonpcall

注:
浏览器中,首先把Preserve log选项勾上,防止页面刷新跳转的时候访问记录被重置,也方便进行下一步的筛选。

防御策略就是检查referer头是否在白名单内。

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 远程调用。

Reference

k0rz3n师傅的博客
Jsonp漏洞简析及自动化漏洞挖掘脚本编写


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK