记一次传统javaweb项目审计
字数 1571 2025-08-29 08:30:18
传统JavaWeb项目安全审计实战教学文档
环境搭建
项目准备
- 下载源码:
https://gitee.com/huang-yk/student-manage/repository/archive/master.zip - 使用IDEA打开项目,等待Maven依赖加载完成
数据库配置
- 修改数据库配置文件:
src/druid.properties - 创建对应的数据库(具体SQL语句未提供)
项目配置
由于是传统JavaWeb项目,不能直接通过Tomcat配置启动,需要以下步骤:
-
添加模块:
- 配置Web,指向对应的
web.xml文件
- 配置Web,指向对应的
-
配置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项目中常见的安全问题及审计方法,建议开发者在项目开发中注意这些安全要点,避免类似漏洞的产生。