某OA系统的审计(新手学习)
字数 1148 2025-08-06 08:35:06
某OA系统安全审计教学文档
0x01 系统架构分析
- 系统框架:Struts2 + Spring混合使用
- 数据库:SQL Server
- 代码结构:
- MVC架构
- DAO目录存放数据库交互代码
- core/base/dao中存在IBaseDao基类
0x02 SQL注入漏洞分析
数据库操作基类分析
- IBaseDao类定义了数据库操作基础方法
- 实现类直接传入SQL语句字符串通过hibernateTemplate API执行查询
- 存在700多个继承者,大多未重载基类方法
危险方法定位
- 全局搜索
sqlFind方法 - 发现使用
?占位符的查询无法注入 - 寻找直接拼接参数的SQL语句构造方式
具体漏洞点
BaseDataService类中的listBaseDataByFlowId方法:String sql = "select * from base_data where flow_id = " + flowId + " and type = " + type; return this.sqlFind(sql);BaseDataController调用该危险方法
漏洞验证
构造SQL注入payload:
flowId = 1'+(case when (1=1) then '' else char(1/0) end)+'
- 条件为真时正常返回
- 条件为假时返回500错误
0x03 权限绕过分析
拦截器配置
- Spring全局拦截器
PermissionInterceptor - 白名单定义:
UN_LOGIN_EXPOSE_CONTROLLERS:免登录控制器数组UN_LOGIN_EXPOSE_SERVLET_PATH:免登录接口URL数组
JWT硬编码问题
- 拦截器检查JWT token有效性
jwtCheck方法中存在硬编码密钥- 可利用硬编码密钥生成有效token绕过认证
0x04 其他发现漏洞
1. 未授权文件上传
appCallController中的uploadFile方法未做权限检查- 漏洞代码特征:
@RequestMapping({"uploadFile"}) @ResponseBody public String uploadFile(@RequestParam MultipartFile file) { String extension = StringUtils.getFilenameExtension(file.getOriginalFilename()); String fileUrl = "../xxx_Ueditor_File/app/files/" + id + extension; file.transferTo(saveFile); } - 未限制文件后缀,可上传JSP等危险文件
2. 未授权SQL注入(Struts2)
- Struts2配置文件中定义拦截器
- 白名单方法中包含数据查询方法
- 示例漏洞点:
public String getlistProjAuditDataQGC() { String sql = "select * from table where id = " + request.getParameter("id"); return sqlFindPage(sql); }
0x05 审计方法论总结
1. SQL注入审计方法
- DAO层:查找直接执行SQL语句的方法
- Service层:检查SQL语句构造方式
- Controller层:定位调用接口
2. 权限绕过审计方法
- 检查Spring配置文件定位拦截器
- 分析拦截器实现:
- 白名单定义是否合理
- 认证机制是否存在缺陷(如JWT硬编码)
- 检查Struts2配置中的拦截器规则
3. 文件上传漏洞审计
- 查找
MultipartFile参数的方法 - 检查是否进行:
- 权限验证
- 文件类型限制
- 存储路径安全控制
0x06 修复建议
SQL注入修复
- 使用预编译语句
- 统一使用参数化查询
- 避免直接拼接用户输入到SQL中
权限绕过修复
- 移除硬编码密钥
- 使用动态生成的密钥
- 严格限制白名单范围
文件上传修复
- 增加权限验证注解
- 限制可上传文件类型
- 使用随机文件名+固定后缀
- 禁止上传可执行文件