jsonp漏洞学习笔记
原理
jsonp(JSON with Padding)是json的一种”使用模式”,实现了跨域读取数据。由于浏览器存在同源策略,ajax只能请求到同源的域(域名、协议、端口都相同),而script标签的src属性不受同源策略的限制,所以通过script标签进行跨域传输比较方便。
如果我们访问了一个恶意页面,这个页面上存在一段恶意js,请求了正常页面的jsonp接口,这个jsonp接口可以返回个人信息。从而恶意页面就可以读取这段数据,获得了用户的个人信息。下图中的A站就是恶意页面,而B站就是正常页面。需要注意的是,这个操作需要用户在B站已经存在登录状态。
利用方式
演示demo
假设现在存在一个正常的页面user.php,有一个返回用户个人信息的接口,后端代码如下:
1 |
|
前端代码如下,用script标签跨域请求jsonp资源,相当于调用了前端的info函数把获取到的资源显示在页面上,这就是很正常的一个网站。
1 |
|
接下来构造一个恶意页面evil.php,让用户一访问到这个页面,就会请求查询他个人信息的接口,并且把获取到的数据上传
1 |
|
用户访问这个evil.php页面后,第15行的代码就是请求了正常页面的获取个人信息的接口,第12行的就是用fetch发起一个get请求(辣鸡XMLHttpRequest写起来太费劲),将获取到的数据上传到服务器。第1行php接收到了个人信息的数据,就把数据写在了json.txt中。从而用户的个人信息被攻击者获取。
这里的三个请求就代表了攻击路径,服务器上的json.txt被创建,里面包含了用户的个人信息。恶意页面在8088端口,而正常页面在81端口,两者属于不同的源,代表这里跨域攻击成功。
实战
在实战中,jsonp经常被用于某蜜罐中,用于捕获攻击者的社交平台个人信息,形成攻击画像,最终溯源到攻击者。
yy时刻
那么如何在挖洞中寻找jsonp漏洞,纯属yy
可以从两个方面进行,一种是从代码里找,一种是从流量里找
从代码里找就是从js文件中,利用jsfinder这类接口爬虫工具,寻找能返回json 的api,或是寻找存在“callback”字样的url请求。重点关注script标签中的src属性
从流量里找就是在请求头或url中存在“json”,或是响应头中存在“content-type:application/json”字样的请求,
防御方法
json 正确的 http 头输出尽量避免跨域的数据传输,对于同域的数据传输使用 XMLHttpRequest 或 fetch 的方式作为数据获取的方式,依赖于 javascript 在浏览器域里的安全性保护数据。如果是跨域的数据传输,在后台必须要对敏感的数据获取做权限认证。