JAW:针对Web应用程序的客户端CSRF漏洞检测工具
字数 1957 2025-08-29 08:31:41
客户端CSRF漏洞检测工具JAW教学文档
1. 客户端CSRF概述
1.1 基本概念
客户端跨站点请求伪造(客户端CSRF)是一种新型的CSRF漏洞,攻击者可以通过修改程序的输入参数,欺骗客户端JavaScript程序将伪造的HTTP请求发送到易受攻击的目标站点。
1.2 与传统CSRF的区别
- 传统CSRF:易受攻击的是服务器端程序,无法区分传入的身份验证请求是否是有意执行的
- 客户端CSRF:易受攻击的是JavaScript程序,攻击者可通过修改JavaScript程序的输入参数生成任意请求
1.3 攻击影响
- 执行服务器端敏感操作
- 破坏数据库完整性
- 可能导致远程代码执行、非法汇款或身份欺诈
- 可启用跨站脚本(XSS)和SQL注入等攻击
1.4 攻击原理示例
// 易受攻击的代码示例
var input = document.getElementById('input'); // 获取输入字段
function h() {
var uri = window.location.hash.substring(1); // 从URL片段获取URI
if (uri.indexOf('example.com') > -1) {
YAHOO.util.Connect.asyncRequest('GET', uri, { // 发送异步请求
success: function(o) { input.value = o.responseText; }
});
}
}
YAHOO.util.Event.addListener('loadInvoice', h); // 注册事件处理程序
2. JAW工具架构
2.1 整体架构
JAW主要由以下模块组成:
- 数据收集模块
- 图构造模块
- 漏洞分析模块
2.2 混合属性图(HPG)
HPG是JAW的核心模型,结合了静态和动态程序行为分析:
2.2.1 代码表示部分
- 抽象语法树(AST):对程序进行分层分解
- 控制流程图(CFG):描述程序指令执行顺序
- 过程间调用图(IPCG):支持过程间静态分析
- 程序依赖图(PDG):建模变量值依赖关系
- 事件注册、调度和依赖性图(ERDDG):捕获JavaScript事件驱动特性
- 语义类型:标识安全敏感操作
2.2.2 状态值部分
- 事件跟踪:捕获运行时触发的事件序列
- 环境属性:记录DOM树和全局对象状态
2.3 符号建模
JAW为第三方库生成可重用的符号模型,包含:
- 库函数和对象属性的语义类型映射
- 函数输入输出关系模型
3. JAW使用方法
3.1 数据收集阶段
- 输入种子URL和可选测试用例
- 使用无头Chrome爬取目标应用
- 收集资源:
- HTML页面
- JavaScript代码
- HTTP请求/响应
- JavaScript属性
- DOM树快照
- 事件触发记录
3.2 图构造阶段
-
规范化JavaScript代码:
- 合并脚本和内联代码
- 替换内联事件处理程序为addEventListener
-
库检测:
- 使用已知签名识别第三方库
- 为每个库创建符号模型
-
构建HPG:
- 使用Esprima生成AST
- 使用Esgraph生成CFG
- 使用修改版dujs生成PDG
- 构建IPCG和ERDDG
- 传播语义类型
3.3 漏洞分析阶段
JAW使用声明式图遍历检测客户端CSRF漏洞:
3.3.1 基本检测查询
MATCH (n)
WHERE isDeclOrStmt(n)
AND hasChild(n, c1) AND hasSemType(c1, "REQ")
AND hasChild(n, c2) AND hasSemType(c2, "WIN.LOC")
RETURN n
3.3.2 可达性检查
- 从易受攻击节点向后追踪CFG边
- 遇到函数调用时跳转到调用位置
- 处理事件触发路径
- 检查是否可达CFG入口节点
3.3.3 漏洞利用分析
- 确定攻击者可操纵的请求字段
- 分析请求中可注入点的数量
- 识别请求模板模式
4. 评估结果
4.1 测试环境
- 106个Bitnami Web应用
- 4,836个网页
- 228,763,028行JavaScript代码
4.2 主要发现
-
可伪造请求:
- 共发现12,701个可伪造请求
- 影响87个Web应用
- 识别25种不同请求模板
-
可利用漏洞:
- 203个请求可被利用
- 影响7个应用程序
- 可执行状态更改操作或启用XSS/SQLi
-
攻击者可控字段:
- 9个应用:可操纵URL域
- 34个应用:可操纵URL路径
- 41个应用:可操纵URL查询字符串
- 41个应用:可操纵body参数
4.3 动态分析的重要性
- 纯静态方法(JAW-static)漏报7.07%漏洞
- 漏报中包括79.3%的可利用漏洞
- 动态信息增加了0.26%的控制路径
5. 防御建议
5.1 开发建议
-
避免直接从以下来源获取请求参数:
- window.location属性
- document.referrer
- postMessages
- Web存储
- URL参数和片段
-
对客户端生成的请求实施服务端验证:
- 检查请求是否符合预期模式
- 验证参数范围和类型
-
对敏感操作使用反CSRF令牌:
- 确保令牌不可预测
- 避免在客户端代码中暴露令牌生成逻辑
5.2 检测建议
- 使用JAW等工具定期扫描应用
- 重点关注单页应用(SPA)中的客户端请求
- 检查跨页面共享的代码模式
6. 局限性
-
动态代码分析:
- 对eval、setTimeout等动态构造支持有限
- this关键字的指针分析不够精确
-
爬取覆盖:
- 可能遗漏需要特定用户交互的页面
- 对复杂AJAX应用的支持有限
-
模型精度:
- 依赖底层静态分析工具的质量
- 对反射和动态代码生成处理不足
7. 结论
JAW是首个专门检测客户端CSRF漏洞的工具,其核心创新HPG模型有效结合了静态和动态分析。评估表明客户端CSRF在Web应用中普遍存在,且可导致严重后果。开发人员应重视此类漏洞,并在开发过程中采取适当防御措施。