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主要由以下模块组成:

  1. 数据收集模块
  2. 图构造模块
  3. 漏洞分析模块

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 数据收集阶段

  1. 输入种子URL和可选测试用例
  2. 使用无头Chrome爬取目标应用
  3. 收集资源:
    • HTML页面
    • JavaScript代码
    • HTTP请求/响应
    • JavaScript属性
    • DOM树快照
    • 事件触发记录

3.2 图构造阶段

  1. 规范化JavaScript代码

    • 合并脚本和内联代码
    • 替换内联事件处理程序为addEventListener
  2. 库检测

    • 使用已知签名识别第三方库
    • 为每个库创建符号模型
  3. 构建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 可达性检查

  1. 从易受攻击节点向后追踪CFG边
  2. 遇到函数调用时跳转到调用位置
  3. 处理事件触发路径
  4. 检查是否可达CFG入口节点

3.3.3 漏洞利用分析

  • 确定攻击者可操纵的请求字段
  • 分析请求中可注入点的数量
  • 识别请求模板模式

4. 评估结果

4.1 测试环境

  • 106个Bitnami Web应用
  • 4,836个网页
  • 228,763,028行JavaScript代码

4.2 主要发现

  1. 可伪造请求

    • 共发现12,701个可伪造请求
    • 影响87个Web应用
    • 识别25种不同请求模板
  2. 可利用漏洞

    • 203个请求可被利用
    • 影响7个应用程序
    • 可执行状态更改操作或启用XSS/SQLi
  3. 攻击者可控字段

    • 9个应用:可操纵URL域
    • 34个应用:可操纵URL路径
    • 41个应用:可操纵URL查询字符串
    • 41个应用:可操纵body参数

4.3 动态分析的重要性

  • 纯静态方法(JAW-static)漏报7.07%漏洞
  • 漏报中包括79.3%的可利用漏洞
  • 动态信息增加了0.26%的控制路径

5. 防御建议

5.1 开发建议

  1. 避免直接从以下来源获取请求参数:

    • window.location属性
    • document.referrer
    • postMessages
    • Web存储
    • URL参数和片段
  2. 对客户端生成的请求实施服务端验证:

    • 检查请求是否符合预期模式
    • 验证参数范围和类型
  3. 对敏感操作使用反CSRF令牌:

    • 确保令牌不可预测
    • 避免在客户端代码中暴露令牌生成逻辑

5.2 检测建议

  1. 使用JAW等工具定期扫描应用
  2. 重点关注单页应用(SPA)中的客户端请求
  3. 检查跨页面共享的代码模式

6. 局限性

  1. 动态代码分析

    • 对eval、setTimeout等动态构造支持有限
    • this关键字的指针分析不够精确
  2. 爬取覆盖

    • 可能遗漏需要特定用户交互的页面
    • 对复杂AJAX应用的支持有限
  3. 模型精度

    • 依赖底层静态分析工具的质量
    • 对反射和动态代码生成处理不足

7. 结论

JAW是首个专门检测客户端CSRF漏洞的工具,其核心创新HPG模型有效结合了静态和动态分析。评估表明客户端CSRF在Web应用中普遍存在,且可导致严重后果。开发人员应重视此类漏洞,并在开发过程中采取适当防御措施。

客户端CSRF漏洞检测工具JAW教学文档 1. 客户端CSRF概述 1.1 基本概念 客户端跨站点请求伪造(客户端CSRF)是一种新型的CSRF漏洞,攻击者可以通过修改程序的输入参数,欺骗客户端JavaScript程序将伪造的HTTP请求发送到易受攻击的目标站点。 1.2 与传统CSRF的区别 传统CSRF :易受攻击的是服务器端程序,无法区分传入的身份验证请求是否是有意执行的 客户端CSRF :易受攻击的是JavaScript程序,攻击者可通过修改JavaScript程序的输入参数生成任意请求 1.3 攻击影响 执行服务器端敏感操作 破坏数据库完整性 可能导致远程代码执行、非法汇款或身份欺诈 可启用跨站脚本(XSS)和SQL注入等攻击 1.4 攻击原理示例 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 基本检测查询 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应用中普遍存在,且可导致严重后果。开发人员应重视此类漏洞,并在开发过程中采取适当防御措施。