Java代码审计项目--某在线教育开源系统
字数 1937 2025-08-11 17:40:10

Java代码审计教学:某在线教育开源系统安全分析

1. 环境部署与准备

1.1 系统搭建要点

  • 数据库配置:建议使用MySQL 5.5.*版本,高版本需要额外配置
  • 项目路径:使用http://IP:port形式,避免额外路径配置导致资源加载问题
  • 依赖管理:通过pom.xml进行Maven依赖包添加
  • 运行环境:使用Tomcat7插件运行项目

1.2 审计前准备

  • 反编译JAR包:必须反编译\src\main\webapp\WEB-INF\lib\目录下的jar包
  • IDE配置:使用IDEA进行代码审计时,注意其默认不会搜索jar包中的代码

2. 项目架构分析

2.1 技术栈

  • SSM框架:Spring Framework + Spring MVC + MyBatis
  • 关键配置文件
    • pom.xml:组件及版本信息
    • web.xml:Filter、Listener、Servlet配置
    • applicationContext.xml:Spring默认配置
    • spring-mvc.xml:注解启动、静态资源映射、视图解析等

2.2 组件安全分析

  • Log4j 1.2.17
    • 存在CVE-2019-17571反序列化漏洞
    • 本项目未使用漏洞相关类(SocketNode),实际不受影响
  • Druid 1.0.1
    • 检查未授权接口(测试未发现)
  • MyBatis 3.2.7
    • 存在CVE-2020-26945反序列化漏洞
    • 本项目未开启二级缓存功能,实际不受影响

2.3 拦截器配置

  • 3个拦截器分别处理:
    1. 前台用户登录与权限
    2. 后台用户登录与权限
    3. 网站配置管理处的用户权限

3. 漏洞分析与复现

3.1 验证码重复利用漏洞

  • 位置:前台找回密码功能
  • 漏洞原理
    • 校验成功后进入邮箱校验阶段
    • 若邮箱未注册直接返回结果,但未删除服务端旧验证码
    • 可重复使用验证码爆破已注册邮箱
  • 影响:可配合登录处进行密码爆破

3.2 存储型XSS漏洞

  • 位置:问答功能下的"我要提问"功能
  • 漏洞原理
    • 标题字段未做过滤直接保存到数据库
    • 输出时标题直接拼接而未使用<c:out>标签防护
    • 内容字段虽然同样存储,但输出时使用了<c:out>标签
  • 影响:攻击者可注入恶意脚本
  • 修复建议
    • 对所有用户输入进行HTML实体编码
    • 输出时统一使用<c:out>标签

3.3 SQL注入漏洞

  • 审计方法:在*Mapper.xml文件中搜索${(MyBatis中表示直接拼接SQL)
  • 典型位置:后台管理员用户删除文章功能
  • 漏洞原理:使用${}直接拼接用户输入到SQL语句
  • 影响:攻击者可构造恶意SQL语句
  • 修复建议
    • 使用#{}预编译方式替代${}
    • 对必要使用${}的情况进行严格过滤

3.4 横向越权漏洞

  • 位置:用户修改个人资料功能
  • 漏洞原理
    • 未验证当前用户身份
    • 直接根据传入的user.userId参数更新数据库
    • 更新后自动重新登录
  • 影响:攻击者可修改其他用户信息并登录其账户
  • 修复建议
    • 校验当前会话用户ID与修改目标ID是否一致
    • 服务端从会话获取用户ID而非依赖客户端传入

3.5 CSRF漏洞

  • 位置:后台管理员创建用户功能
  • 漏洞原理
    • 未校验Referer字段
    • 无token机制
  • 影响:结合XSS漏洞可构造恶意代码创建管理员账户
  • 修复建议
    • 添加CSRF Token机制
    • 校验Referer头

3.6 文件上传漏洞

  • 位置:前台用户上传头像功能
  • 漏洞原理
    • 仅过滤.jsp文件
    • 可上传.jspx文件(Tomcat默认解析)
    • 可上传.html文件造成XSS
  • 利用方法
    • 使用哥斯拉工具生成jspx木马
    • 上传后可直接连接获取shell
  • 修复建议
    • 白名单方式限制上传文件类型
    • 文件内容校验
    • 上传目录设置为不可执行

4. 审计方法论总结

  1. 组件审计

    • 检查pom.xml中组件版本
    • 对照已知漏洞数据库验证
  2. 输入输出审计

    • 追踪用户输入从接收到存储的全过程
    • 检查输出时的编码处理
  3. 权限审计

    • 验证所有涉及用户身份的操作是否有权限校验
    • 检查会话管理机制
  4. 配置审计

    • 检查web.xml等配置文件的安全设置
    • 验证拦截器、过滤器的有效性
  5. 框架特性审计

    • MyBatis中检查${}使用情况
    • Spring中检查CSRF防护配置

5. 工具推荐

  1. 静态分析工具

    • FindBugs/SpotBugs
    • SonarQube
    • Fortify
  2. 动态测试工具

    • Burp Suite
    • OWASP ZAP
    • sqlmap
  3. 辅助工具

    • JD-GUI(反编译)
    • 哥斯拉(webshell管理)
    • ysoserial(反序列化利用)
Java代码审计教学:某在线教育开源系统安全分析 1. 环境部署与准备 1.1 系统搭建要点 数据库配置 :建议使用MySQL 5.5.* 版本,高版本需要额外配置 项目路径 :使用 http://IP:port 形式,避免额外路径配置导致资源加载问题 依赖管理 :通过pom.xml进行Maven依赖包添加 运行环境 :使用Tomcat7插件运行项目 1.2 审计前准备 反编译JAR包 :必须反编译 \src\main\webapp\WEB-INF\lib\ 目录下的jar包 IDE配置 :使用IDEA进行代码审计时,注意其默认不会搜索jar包中的代码 2. 项目架构分析 2.1 技术栈 SSM框架 :Spring Framework + Spring MVC + MyBatis 关键配置文件 : pom.xml :组件及版本信息 web.xml :Filter、Listener、Servlet配置 applicationContext.xml :Spring默认配置 spring-mvc.xml :注解启动、静态资源映射、视图解析等 2.2 组件安全分析 Log4j 1.2.17 : 存在CVE-2019-17571反序列化漏洞 本项目未使用漏洞相关类(SocketNode),实际不受影响 Druid 1.0.1 : 检查未授权接口(测试未发现) MyBatis 3.2.7 : 存在CVE-2020-26945反序列化漏洞 本项目未开启二级缓存功能,实际不受影响 2.3 拦截器配置 3个拦截器分别处理: 前台用户登录与权限 后台用户登录与权限 网站配置管理处的用户权限 3. 漏洞分析与复现 3.1 验证码重复利用漏洞 位置 :前台找回密码功能 漏洞原理 : 校验成功后进入邮箱校验阶段 若邮箱未注册直接返回结果,但未删除服务端旧验证码 可重复使用验证码爆破已注册邮箱 影响 :可配合登录处进行密码爆破 3.2 存储型XSS漏洞 位置 :问答功能下的"我要提问"功能 漏洞原理 : 标题字段未做过滤直接保存到数据库 输出时标题直接拼接而未使用 <c:out> 标签防护 内容字段虽然同样存储,但输出时使用了 <c:out> 标签 影响 :攻击者可注入恶意脚本 修复建议 : 对所有用户输入进行HTML实体编码 输出时统一使用 <c:out> 标签 3.3 SQL注入漏洞 审计方法 :在* Mapper.xml文件中搜索 ${ (MyBatis中表示直接拼接SQL) 典型位置 :后台管理员用户删除文章功能 漏洞原理 :使用 ${} 直接拼接用户输入到SQL语句 影响 :攻击者可构造恶意SQL语句 修复建议 : 使用 #{} 预编译方式替代 ${} 对必要使用 ${} 的情况进行严格过滤 3.4 横向越权漏洞 位置 :用户修改个人资料功能 漏洞原理 : 未验证当前用户身份 直接根据传入的user.userId参数更新数据库 更新后自动重新登录 影响 :攻击者可修改其他用户信息并登录其账户 修复建议 : 校验当前会话用户ID与修改目标ID是否一致 服务端从会话获取用户ID而非依赖客户端传入 3.5 CSRF漏洞 位置 :后台管理员创建用户功能 漏洞原理 : 未校验Referer字段 无token机制 影响 :结合XSS漏洞可构造恶意代码创建管理员账户 修复建议 : 添加CSRF Token机制 校验Referer头 3.6 文件上传漏洞 位置 :前台用户上传头像功能 漏洞原理 : 仅过滤.jsp文件 可上传.jspx文件(Tomcat默认解析) 可上传.html文件造成XSS 利用方法 : 使用哥斯拉工具生成jspx木马 上传后可直接连接获取shell 修复建议 : 白名单方式限制上传文件类型 文件内容校验 上传目录设置为不可执行 4. 审计方法论总结 组件审计 : 检查pom.xml中组件版本 对照已知漏洞数据库验证 输入输出审计 : 追踪用户输入从接收到存储的全过程 检查输出时的编码处理 权限审计 : 验证所有涉及用户身份的操作是否有权限校验 检查会话管理机制 配置审计 : 检查web.xml等配置文件的安全设置 验证拦截器、过滤器的有效性 框架特性审计 : MyBatis中检查 ${} 使用情况 Spring中检查CSRF防护配置 5. 工具推荐 静态分析工具 : FindBugs/SpotBugs SonarQube Fortify 动态测试工具 : Burp Suite OWASP ZAP sqlmap 辅助工具 : JD-GUI(反编译) 哥斯拉(webshell管理) ysoserial(反序列化利用)