Ywc's blog

深入理解JSONP漏洞

Word count: 1.8kReading time: 6 min
2021/04/30

漏洞原理

  • 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中设置:

1
2
3
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参数传入回调函数中,通过回调函数来来操作数据。

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

漏洞危害及利用方式

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

漏洞利用方式

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

1
2
3
4
5
6
7
<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返回的数据实例如下:

1
Callback({"id":1,"name":"test","email":"test@test.com"})

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方案:

1
2
3
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
常见的关键词如下:

1
2
3
4
5
6
7
8
9
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漏洞简析及自动化漏洞挖掘脚本编写

CATALOG
  1. 1. 漏洞原理
  2. 2. 漏洞危害及利用方式
    1. 2.1. 漏洞利用方式
  3. 3. 漏洞测试
  4. 4. 修复方案
  5. 5. Reference