记一次java代码审计
字数 1627 2025-08-05 00:15:46

Java代码审计实战教学文档

一、审计前期准备

  1. 环境部署:搭建完整的Java开发环境,包括JDK、IDE和数据库

  2. 工具准备

    • Seay的MySQL监控工具(用于SQL注入检测)
    • Burp Suite(用于抓包分析)
    • 代码审计工具(如Fortify、Checkmarx等)
  3. 审计重点

    • 过滤器(Filter)分析
    • CMS整体架构理解
    • 框架配置文件审查
    • 各模块功能对应关系

二、注册接口审计

注册流程分析

  1. 登录状态检查:已登录用户直接跳转
  2. 验证码验证
    • 检查验证码是否为空或错误
    • 漏洞点:验证码可刷新,存在暴力破解和用户名枚举风险
  3. 邮箱格式验证:正则表达式检查
  4. 用户名/密码格式检查:长度、字符限制等
  5. 用户存在性检查
    • 检查邮箱和用户ID是否已存在
    • 不存在则进行注册
  6. SQL处理
    • 使用预编译防止SQL注入
    • 关键代码示例:
      PreparedStatement pstmt = connection.prepareStatement("INSERT INTO users VALUES(?,?,?)");
      pstmt.setString(1, username);
      pstmt.setString(2, password);
      pstmt.setString(3, email);
      

三、登录接口审计

  1. 登录成功后的任意跳转漏洞

    • 获取pre_page参数并直接重定向
    • 漏洞利用示例:
      POST /login HTTP/1.1
      pre_page=http://evil.com
      
    • 修复建议:对跳转URL进行白名单校验
  2. 权限控制检查

    • usertype=1为后台管理权限
    • 需要记录所有权限相关代码位置

四、文件上传漏洞分析

文件上传流程

  1. 路径处理

    • 获取系统路径(不可控)
    • 添加固定路径前缀
  2. 文件重命名机制

    • 检查文件是否存在
    • 检查新路径是否存在(不存在则创建)
    • 获取源文件名(未做处理)
    • 截取文件后缀(fileExt
    • 生成新文件名:时间戳+随机数
    • 创建新文件对象
  3. 临时文件竞争条件

    • 文件先上传保存,再进行处理删除
    • 理论上存在竞争条件,但实际难以利用
  4. 文件类型限制

    • 过滤器拦截.jsp.jspx直接访问
    • 上传.jsp文件时,MultipartRequest.getFiles()无法获取
  5. 绕过尝试

    • Apache配置文件上传(如.htaccess
    • Windows NTFS流(::$DATA)测试失败

五、SQL注入分析

  1. 预编译限制

    • LIMITORDER BY子句通常无法预编译
    • 需要重点检查这些位置的SQL拼接
  2. 整数型参数注入测试

    • 发现直接拼接的SQL语句
    • 但由于参数类型限制(整数),无法注入
  3. 监控工具使用

    • 使用Seay的MySQL监控工具实时观察SQL语句

六、文件读取漏洞

  1. 路径处理机制

    • 正则过滤..路径穿越
    • 剩余..直接拦截
    • 但未限制读取特定目录
  2. 可利用点

    • 可读取WEB-INF/lib下的JAR包
    • 可读取数据库配置文件(如database.properties
  3. 文件下载功能

    • 可下载服务器任意文件(限于Web目录)
  4. 文件删除漏洞

    • 可删除Web目录下任意文件
    • 测试方法:创建测试文件后删除

七、审计技巧总结

  1. 接口审查顺序

    • 优先审计后台功能
    • 记录所有权限检查点
  2. URL处理检查

    • 检查所有涉及URL参数的地方
    • 特别是重定向和SSRF潜在点
  3. 文件操作检查

    • 所有文件操作都需要路径穿越测试
    • 检查临时文件处理逻辑
  4. SQL注入检查

    • 重点关注无法预编译的位置
    • 监控实际执行的SQL语句
  5. XSS潜在点

    • 检查所有用户输入输出点
    • 特别是富文本编辑器等复杂输入

八、漏洞修复建议

  1. 文件上传

    • 增加文件内容类型检查
    • 限制可上传文件扩展名
    • 使用不可预测的存储文件名
  2. 任意跳转

    • 实现URL白名单机制
    • 或使用内部映射ID代替直接URL
  3. 文件操作

    • 实现严格的路径校验
    • 使用chroot限制操作范围
  4. SQL注入

    • 全面使用预编译语句
    • 对无法预编译的特殊情况做严格过滤
  5. 权限控制

    • 实现基于角色的访问控制
    • 关键操作增加二次验证

九、后续审计方向

  1. 框架组件漏洞

    • 检查使用的框架版本
    • 查找已知漏洞
  2. 业务逻辑漏洞

    • 支付流程
    • 权限提升路径
  3. 二次注入

    • 检查从数据库读取后直接使用的数据
  4. 反序列化漏洞

    • 检查所有序列化/反序列化操作
  5. 缓存攻击

    • 检查缓存机制和缓存污染可能
Java代码审计实战教学文档 一、审计前期准备 环境部署 :搭建完整的Java开发环境,包括JDK、IDE和数据库 工具准备 : Seay的MySQL监控工具(用于SQL注入检测) Burp Suite(用于抓包分析) 代码审计工具(如Fortify、Checkmarx等) 审计重点 : 过滤器(Filter)分析 CMS整体架构理解 框架配置文件审查 各模块功能对应关系 二、注册接口审计 注册流程分析 登录状态检查 :已登录用户直接跳转 验证码验证 : 检查验证码是否为空或错误 漏洞点:验证码可刷新,存在暴力破解和用户名枚举风险 邮箱格式验证 :正则表达式检查 用户名/密码格式检查 :长度、字符限制等 用户存在性检查 : 检查邮箱和用户ID是否已存在 不存在则进行注册 SQL处理 : 使用预编译防止SQL注入 关键代码示例: 三、登录接口审计 登录成功后的任意跳转漏洞 : 获取 pre_page 参数并直接重定向 漏洞利用示例: 修复建议:对跳转URL进行白名单校验 权限控制检查 : usertype=1 为后台管理权限 需要记录所有权限相关代码位置 四、文件上传漏洞分析 文件上传流程 路径处理 : 获取系统路径(不可控) 添加固定路径前缀 文件重命名机制 : 检查文件是否存在 检查新路径是否存在(不存在则创建) 获取源文件名(未做处理) 截取文件后缀( fileExt ) 生成新文件名:时间戳+随机数 创建新文件对象 临时文件竞争条件 : 文件先上传保存,再进行处理删除 理论上存在竞争条件,但实际难以利用 文件类型限制 : 过滤器拦截 .jsp 和 .jspx 直接访问 上传 .jsp 文件时, MultipartRequest.getFiles() 无法获取 绕过尝试 : Apache配置文件上传(如 .htaccess ) Windows NTFS流( ::$DATA )测试失败 五、SQL注入分析 预编译限制 : LIMIT 和 ORDER BY 子句通常无法预编译 需要重点检查这些位置的SQL拼接 整数型参数注入测试 : 发现直接拼接的SQL语句 但由于参数类型限制(整数),无法注入 监控工具使用 : 使用Seay的MySQL监控工具实时观察SQL语句 六、文件读取漏洞 路径处理机制 : 正则过滤 .. 路径穿越 剩余 .. 直接拦截 但未限制读取特定目录 可利用点 : 可读取 WEB-INF/lib 下的JAR包 可读取数据库配置文件(如 database.properties ) 文件下载功能 : 可下载服务器任意文件(限于Web目录) 文件删除漏洞 : 可删除Web目录下任意文件 测试方法:创建测试文件后删除 七、审计技巧总结 接口审查顺序 : 优先审计后台功能 记录所有权限检查点 URL处理检查 : 检查所有涉及URL参数的地方 特别是重定向和SSRF潜在点 文件操作检查 : 所有文件操作都需要路径穿越测试 检查临时文件处理逻辑 SQL注入检查 : 重点关注无法预编译的位置 监控实际执行的SQL语句 XSS潜在点 : 检查所有用户输入输出点 特别是富文本编辑器等复杂输入 八、漏洞修复建议 文件上传 : 增加文件内容类型检查 限制可上传文件扩展名 使用不可预测的存储文件名 任意跳转 : 实现URL白名单机制 或使用内部映射ID代替直接URL 文件操作 : 实现严格的路径校验 使用chroot限制操作范围 SQL注入 : 全面使用预编译语句 对无法预编译的特殊情况做严格过滤 权限控制 : 实现基于角色的访问控制 关键操作增加二次验证 九、后续审计方向 框架组件漏洞 : 检查使用的框架版本 查找已知漏洞 业务逻辑漏洞 : 支付流程 权限提升路径 二次注入 : 检查从数据库读取后直接使用的数据 反序列化漏洞 : 检查所有序列化/反序列化操作 缓存攻击 : 检查缓存机制和缓存污染可能