记一次java代码审计
字数 1627 2025-08-05 00:15:46
Java代码审计实战教学文档
一、审计前期准备
-
环境部署:搭建完整的Java开发环境,包括JDK、IDE和数据库
-
工具准备:
- Seay的MySQL监控工具(用于SQL注入检测)
- Burp Suite(用于抓包分析)
- 代码审计工具(如Fortify、Checkmarx等)
-
审计重点:
- 过滤器(Filter)分析
- CMS整体架构理解
- 框架配置文件审查
- 各模块功能对应关系
二、注册接口审计
注册流程分析
- 登录状态检查:已登录用户直接跳转
- 验证码验证:
- 检查验证码是否为空或错误
- 漏洞点:验证码可刷新,存在暴力破解和用户名枚举风险
- 邮箱格式验证:正则表达式检查
- 用户名/密码格式检查:长度、字符限制等
- 用户存在性检查:
- 检查邮箱和用户ID是否已存在
- 不存在则进行注册
- SQL处理:
- 使用预编译防止SQL注入
- 关键代码示例:
PreparedStatement pstmt = connection.prepareStatement("INSERT INTO users VALUES(?,?,?)"); pstmt.setString(1, username); pstmt.setString(2, password); pstmt.setString(3, email);
三、登录接口审计
-
登录成功后的任意跳转漏洞:
- 获取
pre_page参数并直接重定向 - 漏洞利用示例:
POST /login HTTP/1.1 pre_page=http://evil.com - 修复建议:对跳转URL进行白名单校验
- 获取
-
权限控制检查:
usertype=1为后台管理权限- 需要记录所有权限相关代码位置
四、文件上传漏洞分析
文件上传流程
-
路径处理:
- 获取系统路径(不可控)
- 添加固定路径前缀
-
文件重命名机制:
- 检查文件是否存在
- 检查新路径是否存在(不存在则创建)
- 获取源文件名(未做处理)
- 截取文件后缀(
fileExt) - 生成新文件名:时间戳+随机数
- 创建新文件对象
-
临时文件竞争条件:
- 文件先上传保存,再进行处理删除
- 理论上存在竞争条件,但实际难以利用
-
文件类型限制:
- 过滤器拦截
.jsp和.jspx直接访问 - 上传
.jsp文件时,MultipartRequest.getFiles()无法获取
- 过滤器拦截
-
绕过尝试:
- Apache配置文件上传(如
.htaccess) - Windows NTFS流(
::$DATA)测试失败
- Apache配置文件上传(如
五、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注入:
- 全面使用预编译语句
- 对无法预编译的特殊情况做严格过滤
-
权限控制:
- 实现基于角色的访问控制
- 关键操作增加二次验证
九、后续审计方向
-
框架组件漏洞:
- 检查使用的框架版本
- 查找已知漏洞
-
业务逻辑漏洞:
- 支付流程
- 权限提升路径
-
二次注入:
- 检查从数据库读取后直接使用的数据
-
反序列化漏洞:
- 检查所有序列化/反序列化操作
-
缓存攻击:
- 检查缓存机制和缓存污染可能