Java代码审计初试
字数 1838 2025-08-18 11:36:48
Java代码审计实战教学:SSM框架漏洞挖掘与分析
1. 审计环境准备
基础环境配置:
- JDK版本:7u80
- Web服务器:Tomcat 7
- 构建工具:Maven 3.6.3
- 数据库:MySQL(需根据项目配置修改连接信息)
项目结构分析:
src/
├── main/
│ ├── java/ # Java源代码目录
│ ├── resources/ # 资源文件目录
│ │ ├── properties/ # 属性配置文件
│ │ ├── spring/ # Spring配置
│ │ ├── springmvc/ # Spring MVC配置
│ │ └── mybatis/ # MyBatis配置
│ └── webapp/ # Web应用资源
│ ├── WEB-INF/
│ ├── jsp/ # JSP页面
│ └── static/ # 静态资源
关键配置文件:
pom.xml- Maven项目配置文件(组件依赖)web.xml- Web应用部署描述文件applicationContext.xml- Spring全局配置spring-mvc.xml- Spring MVC配置
2. 组件漏洞审计
2.1 已知组件漏洞检查
审计方法:
- 检查
pom.xml中各组件的版本 - 对照CVE数据库验证已知漏洞
实例分析:
- 发现Log4j版本存在CVE-2019-17571反序列化漏洞
- 通过全局搜索
SocketNode类确认无调用点 - 结论:即使使用有漏洞组件,若无实际调用则风险可控
3. SQL注入漏洞审计
3.1 MyBatis框架下的SQL注入模式
风险模式:
${}直接拼接参数(高危)#{}预编译参数(安全)- 特殊场景:
LIKE、IN、ORDER BY语句
3.2 后台SQL注入实例
漏洞位置:
- 文件:
ArticleMapper.xml - 代码片段:
<delete id="delete" parameterType="String">
DELETE FROM edu_article WHERE id IN (${articleId})
</delete>
调用链分析:
- 控制器路径:
/admin/article/delete - 参数:
articleId(直接拼接) - 验证方法:
sqlmap -u "/admin/article/delete?articelId=1"
3.3 前台SQL注入实例
漏洞位置:
- 文件:
CourseFavoritesMapper.xml - 代码片段:
<delete id="deleteFavorites" parameterType="String">
DELETE FROM edu_course_favorites WHERE id IN (${ids})
</delete>
调用链分析:
- 控制器路径:
/uc/deleteFaveorite/{ids} - 参数:路径参数直接传递
- 验证方法:使用sqlmap测试路径参数
4. XSS漏洞审计
4.1 审计方法论
关键检查点:
- 输入点:用户可控的所有参数
- 输出点:所有前端展示位置
- 过滤机制:
- 全局过滤器(web.xml)
- 局部编码处理
4.2 实例分析
漏洞位置:
-
输入流程:
- 控制器:
QuestionsController.addQuestions() - 参数对象:
Questions(未过滤直接入库)
- 控制器:
-
输出流程:
- JSP页面直接输出
${question.title} - 对比安全输出:
<c:out value="${question.content}"/>
- JSP页面直接输出
风险确认:
- web.xml无XSS过滤器
- 业务代码无编码处理
- 前端部分输出未编码
5. 文件上传漏洞
5.1 漏洞分析
关键代码:
String fileType = multipartRequest.getParameter("fileType");
String[] types = fileType.split(",");
// 检查逻辑缺陷:只要包含任意扩展名即可上传
if(!Arrays.asList(types).contains(ext)) {
return "error";
}
绕过方法:
- 构造
fileType参数包含jsp,jspx - 直接上传webshell文件
6. 越权漏洞审计
6.1 水平越权实例
漏洞流程:
- 请求路径:
/updateUser - 参数:
userId(用户可控) - 缺陷:
- 无权限校验
- 直接调用
userService.updateUser()
验证步骤:
- 注册用户A(id=70)和用户B(id=71)
- 以用户B登录,修改请求中的userId为70
- 确认用户A信息被篡改
7. 综合审计方法论
7.1 审计检查清单
-
组件安全:
- 检查所有第三方库版本
- 确认实际调用关系
-
SQL注入:
- 全局搜索
${ - 检查特殊语句(LIKE/IN/ORDER BY)
- 全局搜索
-
XSS漏洞:
- 确认输出编码机制
- 检查所有用户输入输出路径
-
文件上传:
- 检查白名单机制
- 验证解析漏洞
-
权限控制:
- 检查所有用户身份相关操作
- 验证服务层权限校验
7.2 工具推荐
-
静态分析:
- FindBugs/SpotBugs
- SonarQube
- Semgrep
-
动态测试:
- Burp Suite
- sqlmap
- OWASP ZAP
8. 修复建议
-
SQL注入:
- 使用
#{}替代${} - 特殊场景使用OGNL表达式过滤
- 使用
-
XSS防护:
- 添加全局过滤器
- 输出使用
<c:out>或HTML编码
-
文件上传:
- 严格白名单校验
- 独立文件存储
- 禁用脚本执行
-
权限控制:
- 添加服务层权限校验
- 使用Spring Security框架
9. 总结
本案例展示了SSM框架下的典型漏洞模式,审计过程应重点关注:
- 参数传递与处理方式
- 框架配置与安全机制
- 用户输入输出全链路
- 业务逻辑与权限设计
最佳实践建议:结合静态代码审计与动态渗透测试,建立完整的SDL流程。