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/    # 静态资源

关键配置文件:

  1. pom.xml - Maven项目配置文件(组件依赖)
  2. web.xml - Web应用部署描述文件
  3. applicationContext.xml - Spring全局配置
  4. spring-mvc.xml - Spring MVC配置

2. 组件漏洞审计

2.1 已知组件漏洞检查

审计方法:

  1. 检查pom.xml中各组件的版本
  2. 对照CVE数据库验证已知漏洞

实例分析:

  • 发现Log4j版本存在CVE-2019-17571反序列化漏洞
  • 通过全局搜索SocketNode类确认无调用点
  • 结论:即使使用有漏洞组件,若无实际调用则风险可控

3. SQL注入漏洞审计

3.1 MyBatis框架下的SQL注入模式

风险模式:

  1. ${}直接拼接参数(高危)
  2. #{}预编译参数(安全)
  3. 特殊场景:LIKEINORDER BY语句

3.2 后台SQL注入实例

漏洞位置:

  • 文件:ArticleMapper.xml
  • 代码片段:
<delete id="delete" parameterType="String">
    DELETE FROM edu_article WHERE id IN (${articleId})
</delete>

调用链分析:

  1. 控制器路径:/admin/article/delete
  2. 参数:articleId(直接拼接)
  3. 验证方法: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>

调用链分析:

  1. 控制器路径:/uc/deleteFaveorite/{ids}
  2. 参数:路径参数直接传递
  3. 验证方法:使用sqlmap测试路径参数

4. XSS漏洞审计

4.1 审计方法论

关键检查点:

  1. 输入点:用户可控的所有参数
  2. 输出点:所有前端展示位置
  3. 过滤机制:
    • 全局过滤器(web.xml)
    • 局部编码处理

4.2 实例分析

漏洞位置:

  1. 输入流程:

    • 控制器:QuestionsController.addQuestions()
    • 参数对象:Questions(未过滤直接入库)
  2. 输出流程:

    • JSP页面直接输出${question.title}
    • 对比安全输出:<c:out value="${question.content}"/>

风险确认:

  • 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 水平越权实例

漏洞流程:

  1. 请求路径:/updateUser
  2. 参数:userId(用户可控)
  3. 缺陷:
    • 无权限校验
    • 直接调用userService.updateUser()

验证步骤:

  1. 注册用户A(id=70)和用户B(id=71)
  2. 以用户B登录,修改请求中的userId为70
  3. 确认用户A信息被篡改

7. 综合审计方法论

7.1 审计检查清单

  1. 组件安全

    • 检查所有第三方库版本
    • 确认实际调用关系
  2. SQL注入

    • 全局搜索${
    • 检查特殊语句(LIKE/IN/ORDER BY)
  3. XSS漏洞

    • 确认输出编码机制
    • 检查所有用户输入输出路径
  4. 文件上传

    • 检查白名单机制
    • 验证解析漏洞
  5. 权限控制

    • 检查所有用户身份相关操作
    • 验证服务层权限校验

7.2 工具推荐

  1. 静态分析

    • FindBugs/SpotBugs
    • SonarQube
    • Semgrep
  2. 动态测试

    • Burp Suite
    • sqlmap
    • OWASP ZAP

8. 修复建议

  1. SQL注入

    • 使用#{}替代${}
    • 特殊场景使用OGNL表达式过滤
  2. XSS防护

    • 添加全局过滤器
    • 输出使用<c:out>或HTML编码
  3. 文件上传

    • 严格白名单校验
    • 独立文件存储
    • 禁用脚本执行
  4. 权限控制

    • 添加服务层权限校验
    • 使用Spring Security框架

9. 总结

本案例展示了SSM框架下的典型漏洞模式,审计过程应重点关注:

  1. 参数传递与处理方式
  2. 框架配置与安全机制
  3. 用户输入输出全链路
  4. 业务逻辑与权限设计

最佳实践建议:结合静态代码审计与动态渗透测试,建立完整的SDL流程。

Java代码审计实战教学:SSM框架漏洞挖掘与分析 1. 审计环境准备 基础环境配置: JDK版本:7u80 Web服务器:Tomcat 7 构建工具:Maven 3.6.3 数据库:MySQL(需根据项目配置修改连接信息) 项目结构分析: 关键配置文件: 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 代码片段: 调用链分析: 控制器路径: /admin/article/delete 参数: articleId (直接拼接) 验证方法: sqlmap -u "/admin/article/delete?articelId=1" 3.3 前台SQL注入实例 漏洞位置: 文件: CourseFavoritesMapper.xml 代码片段: 调用链分析: 控制器路径: /uc/deleteFaveorite/{ids} 参数:路径参数直接传递 验证方法:使用sqlmap测试路径参数 4. XSS漏洞审计 4.1 审计方法论 关键检查点: 输入点:用户可控的所有参数 输出点:所有前端展示位置 过滤机制: 全局过滤器(web.xml) 局部编码处理 4.2 实例分析 漏洞位置: 输入流程: 控制器: QuestionsController.addQuestions() 参数对象: Questions (未过滤直接入库) 输出流程: JSP页面直接输出 ${question.title} 对比安全输出: <c:out value="${question.content}"/> 风险确认: web.xml无XSS过滤器 业务代码无编码处理 前端部分输出未编码 5. 文件上传漏洞 5.1 漏洞分析 关键代码: 绕过方法: 构造 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流程。