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