基于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劫持是指攻击者在受害者不知情的情况下:
- 诱导受害者访问恶意网站
- 恶意网站利用JSONP接口获取用户在其它网站的敏感信息
- 窃取的数据可用于精准诈骗或其他恶意目的
攻击场景:
- 敏感信息泄露(用户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 手工挖掘步骤
- 寻找JSONP接口:检查URL参数中是否包含callback/jsonp/cb等关键字
- 检查响应内容:确认是否包含敏感信息
- 绕过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 检测流程
-
解析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 工具介绍
4.2 使用方式
- 结合爬虫使用(推荐crawlergo)
- 将爬虫获取的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. 防御建议
- 限制Referer:检查请求来源
- 添加Token:要求有效的CSRF Token
- 使用CORS:替代JSONP实现跨域
- 敏感信息保护:避免通过JSONP接口返回敏感数据
- 内容安全策略:实施适当的CSP策略