记一次传统javaweb项目审计
字数 1571 2025-08-29 08:30:18

传统JavaWeb项目安全审计实战教学文档

环境搭建

项目准备

  1. 下载源码:https://gitee.com/huang-yk/student-manage/repository/archive/master.zip
  2. 使用IDEA打开项目,等待Maven依赖加载完成

数据库配置

  1. 修改数据库配置文件:src/druid.properties
  2. 创建对应的数据库(具体SQL语句未提供)

项目配置

由于是传统JavaWeb项目,不能直接通过Tomcat配置启动,需要以下步骤:

  1. 添加模块

    • 配置Web,指向对应的web.xml文件
  2. 配置Tomcat

    • 添加库,指向本地tomcat/lib目录
  3. 配置工件

    • 设置正确的工件配置
  4. 启动配置

    • 注意路径设置,因为代码中路由是写死的
    • 如果出现缺少依赖的情况,从Maven搜索对应依赖下载到本地并添加为库

测试账号

管理员账号:admin/123

代码审计

1. 鉴权绕过分析

鉴权机制

系统使用Filter实现鉴权,分为两种:

  1. 管理员鉴权Filter
  2. 普通用户鉴权Filter

管理员鉴权分析

  • 逻辑:获取登录账号的UserType,判断值是否为1
  • 问题:管理员接口不能未授权,只能尝试普通用户提权(修改usertype为1)

提权尝试

  1. 全局搜索usertype,查找可控SQL语句
  2. 发现添加用户功能点中user_type字段被写死,无法直接修改

普通用户鉴权绕过

  • 重点关注静态资源访问的鉴权逻辑
  • 问题点:使用uri.lastIndexOf("/")uri.lastIndexOf(".")提取页面名称和后缀名
  • Tomcat对;进行特殊处理:
    • 例如/resource;.png会被Tomcat解析为/resource
    • 中间件会忽略;及其后面的内容
    • 导致中间件和后端解析不一致

验证方法

  1. 动调观察请求处理过程
  2. 测试非管理员功能点(如获取教师信息)

2. SQL注入漏洞

数据库技术判断

  • 项目额外依赖中未发现其他数据库技术,判断为JDBC

漏洞定位方法

  1. 全局搜索append+(字符串拼接)
  2. 发现多处直接拼接SQL语句的地方

典型案例

  • 功能点:获取学生信息
  • 调用链:
    • 接收参数:query
    • 路由:/admin/adminStudentUrl
    • SQL语句直接拼接用户输入
  • 验证方法:
    • 构造恶意输入
    • 使用sqlmap测试

其他注入点

  • 项目中存在多处类似漏洞

3. XSS漏洞

漏洞分布

  • 系统多处存在XSS漏洞,是重灾区

典型案例

  1. 学生管理模块
    • 多个输入点未做过滤
  2. 课程管理模块
    • 同样存在未过滤的输入点

验证方法

  • 在输入点插入XSS payload
  • 观察是否被正确执行

4. CSRF漏洞

漏洞判断

  • 代码中未发现CSRF防护机制
  • 大概率存在CSRF漏洞

验证方法

  1. 选择功能点(如添加操作)
  2. 抓包生成POC
  3. 模拟管理员触发
  4. 观察操作是否成功

组合攻击

  • 可结合XSS漏洞进行组合攻击

总结与防御建议

漏洞总结

  1. 鉴权绕过:由于URL解析不一致导致
  2. SQL注入:多处SQL语句直接拼接用户输入
  3. XSS漏洞:输入输出未做过滤
  4. CSRF漏洞:缺乏防护机制

防御建议

  1. 鉴权安全

    • 统一前后端URL解析逻辑
    • 使用框架提供的安全机制
  2. SQL注入防御

    • 使用预编译语句
    • 使用ORM框架
    • 最小权限原则
  3. XSS防御

    • 输入输出过滤
    • 使用CSP策略
    • 设置HttpOnly标志
  4. CSRF防御

    • 添加CSRF Token
    • 验证Referer头
    • 敏感操作使用二次验证
  5. 其他建议

    • 定期安全审计
    • 使用安全框架
    • 安全编码培训

通过本案例可以学习到传统JavaWeb项目中常见的安全问题及审计方法,建议开发者在项目开发中注意这些安全要点,避免类似漏洞的产生。

传统JavaWeb项目安全审计实战教学文档 环境搭建 项目准备 下载源码: https://gitee.com/huang-yk/student-manage/repository/archive/master.zip 使用IDEA打开项目,等待Maven依赖加载完成 数据库配置 修改数据库配置文件: src/druid.properties 创建对应的数据库(具体SQL语句未提供) 项目配置 由于是传统JavaWeb项目,不能直接通过Tomcat配置启动,需要以下步骤: 添加模块 : 配置Web,指向对应的 web.xml 文件 配置Tomcat : 添加库,指向本地 tomcat/lib 目录 配置工件 : 设置正确的工件配置 启动配置 : 注意路径设置,因为代码中路由是写死的 如果出现缺少依赖的情况,从Maven搜索对应依赖下载到本地并添加为库 测试账号 管理员账号: admin/123 代码审计 1. 鉴权绕过分析 鉴权机制 系统使用Filter实现鉴权,分为两种: 管理员鉴权Filter 普通用户鉴权Filter 管理员鉴权分析 逻辑:获取登录账号的 UserType ,判断值是否为1 问题:管理员接口不能未授权,只能尝试普通用户提权(修改 usertype 为1) 提权尝试 全局搜索 usertype ,查找可控SQL语句 发现添加用户功能点中 user_type 字段被写死,无法直接修改 普通用户鉴权绕过 重点关注静态资源访问的鉴权逻辑 问题点:使用 uri.lastIndexOf("/") 和 uri.lastIndexOf(".") 提取页面名称和后缀名 Tomcat对 ; 进行特殊处理: 例如 /resource;.png 会被Tomcat解析为 /resource 中间件会忽略 ; 及其后面的内容 导致中间件和后端解析不一致 验证方法 动调观察请求处理过程 测试非管理员功能点(如获取教师信息) 2. SQL注入漏洞 数据库技术判断 项目额外依赖中未发现其他数据库技术,判断为JDBC 漏洞定位方法 全局搜索 append 或 + (字符串拼接) 发现多处直接拼接SQL语句的地方 典型案例 功能点:获取学生信息 调用链: 接收参数: query 路由: /admin/adminStudentUrl SQL语句直接拼接用户输入 验证方法: 构造恶意输入 使用sqlmap测试 其他注入点 项目中存在多处类似漏洞 3. XSS漏洞 漏洞分布 系统多处存在XSS漏洞,是重灾区 典型案例 学生管理模块 多个输入点未做过滤 课程管理模块 同样存在未过滤的输入点 验证方法 在输入点插入XSS payload 观察是否被正确执行 4. CSRF漏洞 漏洞判断 代码中未发现CSRF防护机制 大概率存在CSRF漏洞 验证方法 选择功能点(如添加操作) 抓包生成POC 模拟管理员触发 观察操作是否成功 组合攻击 可结合XSS漏洞进行组合攻击 总结与防御建议 漏洞总结 鉴权绕过 :由于URL解析不一致导致 SQL注入 :多处SQL语句直接拼接用户输入 XSS漏洞 :输入输出未做过滤 CSRF漏洞 :缺乏防护机制 防御建议 鉴权安全 : 统一前后端URL解析逻辑 使用框架提供的安全机制 SQL注入防御 : 使用预编译语句 使用ORM框架 最小权限原则 XSS防御 : 输入输出过滤 使用CSP策略 设置HttpOnly标志 CSRF防御 : 添加CSRF Token 验证Referer头 敏感操作使用二次验证 其他建议 : 定期安全审计 使用安全框架 安全编码培训 通过本案例可以学习到传统JavaWeb项目中常见的安全问题及审计方法,建议开发者在项目开发中注意这些安全要点,避免类似漏洞的产生。