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

Java代码审计实战教学文档

一、审计前期准备

  1. 过滤器分析

    • 必须审查所有过滤器实现
    • 重点关注涉及用户输入处理的函数
    • 初期可能难以理解,但需坚持分析
  2. 系统架构理解

    • 掌握CMS各模块对应功能
    • 了解框架使用的组件及其已知漏洞
    • 审查框架配置文件
  3. 审计方法

    • 采用"每个接口都查看"的全面审计策略
    • 建立系统性的审计流程

二、注册接口审计

注册流程分析

  1. 安全控制点

    • 登录状态检查(已登录用户不能注册)
    • 验证码校验(存在暴力破解风险)
    • 邮箱格式验证
    • 用户名/密码格式检查
    • 邮箱/用户ID唯一性检查
  2. SQL处理

    • 使用预编译SQL语句
    • 关键SQL插入操作截图示例:
    // 预编译SQL示例
    PreparedStatement pstmt = connection.prepareStatement(
        "INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
    
  3. 潜在漏洞

    • 验证码可刷新导致暴力破解
    • 用户名枚举漏洞
    • 注册邮箱枚举漏洞

三、登录接口审计

  1. 安全控制

    • 标准登录验证流程
    • 密码加密存储验证
  2. 任意URL跳转漏洞

    • 漏洞位置:登录后重定向处理
    • 漏洞代码示例:
    String pre_page = request.getParameter("pre_page");
    if(loginSuccess) {
        response.sendRedirect(pre_page); // 不安全的重定向
    }
    
    • 修复建议:白名单校验跳转URL
  3. 后台权限控制

    • 后台访问要求usertype=1
    • 需记录所有权限检查点,寻找可能的绕过方式

四、文件上传漏洞分析

文件上传流程

  1. 路径处理

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

    // 1. 检查文件存在性
    // 2. 检查新路径存在性(自动创建)
    // 3. 获取原始文件名(未过滤)
    // 4. 提取文件扩展名(fileExt)
    // 5. 生成新文件名:时间戳+随机数
    // 6. 创建新文件对象
    
  3. 竞争条件

    • 文件先上传保存后处理
    • 临时文件可能被访问的时间窗口
    • 实际利用限制:jsp/jspx被过滤器拦截
  4. 文件类型限制

    • 通过MultipartRequest.getFiles()限制jsp/jspx上传
    • 绕过尝试:
      • Apache配置文件上传
      • Windows NTFS数据流(未成功)

五、SQL注入分析

  1. 预编译限制

    • LIMIT和ORDER BY子句无法预编译
    • 需重点检查这些位置的SQL拼接
  2. 注入检测方法

    • 使用Seay MySQL监控工具辅助分析
    • 注意参数类型转换问题
    • 示例风险代码:
    String sql = "SELECT * FROM users ORDER BY " + input; // 不安全
    

六、文件读取/删除漏洞

文件读取漏洞

  1. 路径处理缺陷

    • 正则过滤..但未限制绝对路径
    • 可读取web根目录下任意文件
  2. 可利用点

    • 读取WEB-INF/lib下的库文件
    • 读取数据库配置文件
    • 示例攻击路径:
    /module?path=/WEB-INF/classes/database.properties
    

文件删除漏洞

  1. 漏洞特征

    • 仅限制在web目录内
    • 无足够权限检查
    • 可删除关键配置文件
  2. 验证方法

    // 测试删除操作
    File target = new File("/path/to/webapp/test.txt");
    target.delete();
    

七、审计技巧总结

  1. 系统化方法

    • 从用户输入点到最终操作的全链路跟踪
    • 重点检查:文件操作、数据库查询、系统命令执行
  2. 漏洞挖掘策略

    • 优先审计后台功能
    • 记录所有权限检查点
    • 关注非主流文件类型的处理
  3. 工具使用

    • 代码静态分析工具
    • 数据库查询监控工具
    • 请求拦截/修改工具(Burp Suite)
  4. 报告要点

    • 漏洞完整调用链
    • 实际影响评估
    • 修复建议

八、实战案例中的发现

  1. 实际漏洞

    • 任意文件读取
    • 任意文件删除
    • 潜在的数据库凭据泄露
  2. 未成功利用点

    • JSP文件上传被拦截
    • 竞争条件利用受限
    • 部分SQL注入点因类型检查无法利用
  3. 后续审计方向

    • 深入分析SQL查询点
    • 检查其他文件操作功能
    • 框架特定配置审计

附录:关键代码片段

  1. 不安全文件下载
String path = request.getParameter("path");
// 仅过滤..但允许绝对路径
path = path.replaceAll("\\.\\.", "");
File file = new File(path);
// 返回文件内容...
  1. 权限检查示例
if(user.getType() != 1) {
    // 无后台访问权限
    response.sendError(403);
}
  1. 安全建议
  • 实施完整的路径规范化
  • 增加基于角色的访问控制
  • 对用户提供的文件名进行严格校验
Java代码审计实战教学文档 一、审计前期准备 过滤器分析 : 必须审查所有过滤器实现 重点关注涉及用户输入处理的函数 初期可能难以理解,但需坚持分析 系统架构理解 : 掌握CMS各模块对应功能 了解框架使用的组件及其已知漏洞 审查框架配置文件 审计方法 : 采用"每个接口都查看"的全面审计策略 建立系统性的审计流程 二、注册接口审计 注册流程分析 安全控制点 : 登录状态检查(已登录用户不能注册) 验证码校验(存在暴力破解风险) 邮箱格式验证 用户名/密码格式检查 邮箱/用户ID唯一性检查 SQL处理 : 使用预编译SQL语句 关键SQL插入操作截图示例: 潜在漏洞 : 验证码可刷新导致暴力破解 用户名枚举漏洞 注册邮箱枚举漏洞 三、登录接口审计 安全控制 : 标准登录验证流程 密码加密存储验证 任意URL跳转漏洞 : 漏洞位置:登录后重定向处理 漏洞代码示例: 修复建议:白名单校验跳转URL 后台权限控制 : 后台访问要求 usertype=1 需记录所有权限检查点,寻找可能的绕过方式 四、文件上传漏洞分析 文件上传流程 路径处理 : 系统路径获取(不可控) 固定路径追加 文件重命名机制 重命名过程 : 竞争条件 : 文件先上传保存后处理 临时文件可能被访问的时间窗口 实际利用限制:jsp/jspx被过滤器拦截 文件类型限制 : 通过 MultipartRequest.getFiles() 限制jsp/jspx上传 绕过尝试: Apache配置文件上传 Windows NTFS数据流(未成功) 五、SQL注入分析 预编译限制 : LIMIT和ORDER BY子句无法预编译 需重点检查这些位置的SQL拼接 注入检测方法 : 使用Seay MySQL监控工具辅助分析 注意参数类型转换问题 示例风险代码: 六、文件读取/删除漏洞 文件读取漏洞 路径处理缺陷 : 正则过滤 .. 但未限制绝对路径 可读取web根目录下任意文件 可利用点 : 读取WEB-INF/lib下的库文件 读取数据库配置文件 示例攻击路径: 文件删除漏洞 漏洞特征 : 仅限制在web目录内 无足够权限检查 可删除关键配置文件 验证方法 : 七、审计技巧总结 系统化方法 : 从用户输入点到最终操作的全链路跟踪 重点检查:文件操作、数据库查询、系统命令执行 漏洞挖掘策略 : 优先审计后台功能 记录所有权限检查点 关注非主流文件类型的处理 工具使用 : 代码静态分析工具 数据库查询监控工具 请求拦截/修改工具(Burp Suite) 报告要点 : 漏洞完整调用链 实际影响评估 修复建议 八、实战案例中的发现 实际漏洞 : 任意文件读取 任意文件删除 潜在的数据库凭据泄露 未成功利用点 : JSP文件上传被拦截 竞争条件利用受限 部分SQL注入点因类型检查无法利用 后续审计方向 : 深入分析SQL查询点 检查其他文件操作功能 框架特定配置审计 附录:关键代码片段 不安全文件下载 : 权限检查示例 : 安全建议 : 实施完整的路径规范化 增加基于角色的访问控制 对用户提供的文件名进行严格校验