基于AST的JSONP劫持自动化挖掘(带工具)
字数 1421 2025-08-15 21:33:16

基于AST的JSONP劫持自动化挖掘技术详解

1. JSONP劫持概述

1.1 JSONP技术原理

JSONP(JSON with Padding)是一种利用<script>标签跨域能力的通信技术,其工作原理:

  • 客户端动态创建<script>标签,URL中包含回调函数名作为参数
  • 服务端收到请求后,动态生成JS脚本,用请求参数中的回调函数名包裹数据
  • 客户端预先定义该回调函数来处理返回的数据

典型JSONP调用示例:

// 客户端定义回调函数
function callback(data) {
  console.log(data);
}

// 动态添加script标签
const script = document.createElement('script');
script.src = 'https://example.com/api?callback=callback';
document.body.appendChild(script);

1.2 JSONP劫持攻击

JSONP劫持是指攻击者在受害者不知情的情况下:

  1. 诱导受害者访问恶意网站
  2. 恶意网站利用JSONP接口获取用户在其它网站的敏感信息
  3. 窃取的数据可用于精准诈骗或其他恶意目的

攻击场景:

  • 敏感信息泄露(用户ID、姓名、昵称等)
  • 防守方溯源(蜜罐中获取攻击者画像)

2. 抽象语法树(AST)技术

2.1 AST基本概念

抽象语法树(Abstract Syntax Tree)是源代码语法结构的一种树状抽象表示,特点:

  • 统一不同形式的代码实现
  • 比正则匹配更准确和灵活

2.2 AST在JSONP检测中的优势

AST可以统一处理以下各种JSONP响应形式:

// 简单形式
callback({"username":"xray"});

// 嵌套数据
callback({"data": {username:"xray"}});

// 带注释和条件判断
/*aa*/ window.cb && window.cb({"username":"xray"});

// 数组形式
callback([{"info": {"username": "array"}}]);

// 字符串形式
cb(' {"username":"xray"} ');

// 变量赋值形式
a={"username": "xray"}; cb({"s": a})

3. JSONP漏洞挖掘流程

3.1 手工挖掘步骤

  1. 寻找JSONP接口:检查URL参数中是否包含callback/jsonp/cb等关键字
  2. 检查响应内容:确认是否包含敏感信息
  3. 绕过Referer检查:测试Referer限制是否可绕过

3.2 自动化挖掘方案

3.2.1 前期准备

  • 爬虫选择:推荐使用crawlergo等优质爬虫
  • JS资源筛选:通过Content-Type识别JavaScript资源

支持的JavaScript MIME类型:

application/ecmascript
application/javascript
application/x-ecmascript
application/x-javascript
text/ecmascript
text/javascript
text/javascript1.0
text/javascript1.1
text/javascript1.2
text/javascript1.3
text/javascript1.4
text/javascript1.5
text/jscript
text/livescript
text/x-ecmascript
text/x-javascript

3.2.2 检测流程

  1. 解析JS类型资源,检查query参数是否包含JSONP特征:

    • 使用正则匹配:(?m)(?i)(callback)|(jsonp)|(^cb$)|(function)
  2. 设置同域Referer请求JS获取响应

  3. 将JSONP响应解析为AST,检查以下条件:

    • 条件一:Callee.Name == callback函数名
    • 条件二:递归遍历AST检查是否存在敏感信息
      • 关键字段正则:(?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick)
      • 确保对应value不为空
  4. 替换Referer重新请求验证

4. 工具使用指南

4.1 工具介绍

项目地址:check_jsonp_based_on_ast

4.2 使用方式

  1. 结合爬虫使用(推荐crawlergo)
  2. 将爬虫获取的JS资源交给工具检测

函数原型:

func CheckSenseJsonp(jsUri string) (bool, error)

参数:

  • jsUri:待检测的JS资源URL

返回值:

  • bool:是否存在漏洞(true表示存在)
  • error:错误信息

示例:

result, err := CheckSenseJsonp("http://127.0.0.1/jsonp_env/getUser.php?id=1&jsoncallback=callbackFunction")

4.3 测试环境

项目中提供了JSONP漏洞测试环境,可用于验证工具效果。

5. 防御建议

  1. 限制Referer:检查请求来源
  2. 添加Token:要求有效的CSRF Token
  3. 使用CORS:替代JSONP实现跨域
  4. 敏感信息保护:避免通过JSONP接口返回敏感数据
  5. 内容安全策略:实施适当的CSP策略

6. 参考资源

基于AST的JSONP劫持自动化挖掘技术详解 1. JSONP劫持概述 1.1 JSONP技术原理 JSONP(JSON with Padding)是一种利用 <script> 标签跨域能力的通信技术,其工作原理: 客户端动态创建 <script> 标签,URL中包含回调函数名作为参数 服务端收到请求后,动态生成JS脚本,用请求参数中的回调函数名包裹数据 客户端预先定义该回调函数来处理返回的数据 典型JSONP调用示例: 1.2 JSONP劫持攻击 JSONP劫持是指攻击者在受害者不知情的情况下: 诱导受害者访问恶意网站 恶意网站利用JSONP接口获取用户在其它网站的敏感信息 窃取的数据可用于精准诈骗或其他恶意目的 攻击场景: 敏感信息泄露(用户ID、姓名、昵称等) 防守方溯源(蜜罐中获取攻击者画像) 2. 抽象语法树(AST)技术 2.1 AST基本概念 抽象语法树(Abstract Syntax Tree)是源代码语法结构的一种树状抽象表示,特点: 统一不同形式的代码实现 比正则匹配更准确和灵活 2.2 AST在JSONP检测中的优势 AST可以统一处理以下各种JSONP响应形式: 3. JSONP漏洞挖掘流程 3.1 手工挖掘步骤 寻找JSONP接口 :检查URL参数中是否包含callback/jsonp/cb等关键字 检查响应内容 :确认是否包含敏感信息 绕过Referer检查 :测试Referer限制是否可绕过 3.2 自动化挖掘方案 3.2.1 前期准备 爬虫选择 :推荐使用crawlergo等优质爬虫 JS资源筛选 :通过Content-Type识别JavaScript资源 支持的JavaScript MIME类型: 3.2.2 检测流程 解析JS类型资源,检查query参数是否包含JSONP特征: 使用正则匹配: (?m)(?i)(callback)|(jsonp)|(^cb$)|(function) 设置同域Referer请求JS获取响应 将JSONP响应解析为AST,检查以下条件: 条件一 :Callee.Name == callback函数名 条件二 :递归遍历AST检查是否存在敏感信息 关键字段正则: (?m)(?i)(uid)|(userid)|(user_id)|(nin)|(name)|(username)|(nick) 确保对应value不为空 替换Referer重新请求验证 4. 工具使用指南 4.1 工具介绍 项目地址: check_ jsonp_ based_ on_ ast 4.2 使用方式 结合爬虫使用(推荐crawlergo) 将爬虫获取的JS资源交给工具检测 函数原型: 参数: jsUri :待检测的JS资源URL 返回值: bool :是否存在漏洞(true表示存在) error :错误信息 示例: 4.3 测试环境 项目中提供了JSONP漏洞测试环境,可用于验证工具效果。 5. 防御建议 限制Referer :检查请求来源 添加Token :要求有效的CSRF Token 使用CORS :替代JSONP实现跨域 敏感信息保护 :避免通过JSONP接口返回敏感数据 内容安全策略 :实施适当的CSP策略 6. 参考资源 A Tour of Xray Chromium MIME类型定义 check_ jsonp_ based_ on_ ast项目