攻防项目中的代码审计
字数 1873 2025-08-29 22:41:24
攻防项目中的代码审计实战案例教学
1. 某图书馆管理系统文件上传漏洞分析
1.1 漏洞发现背景
- 目标系统:某市图书馆管理系统
- 部署方式:Tomcat部署
- 初始发现:存在权限绕过漏洞可进入后台但无法直接利用
1.2 漏洞分析流程
1.2.1 上传接口定位
- 通过web.xml搜索"upload"定位上传接口
- 确认前台接口方法:
- 直接访问返回302跳转的是后台接口
- 查看引入类,包含session相关的是后台接口
- 确认
/loan/PictureUpload为前台无权限校验的上传接口
1.2.2 上传流程分析
-
获取web目录下的tmp路径
-
调用
b.a()方法处理请求:- 设置tmp路径到
f.b - 调用
com.oreilly.servlet.MultipartRequest处理请求体 - 参数:tmp路径、500*1024(文件大小限制)
- 设置tmp路径到
-
MultipartRequest处理流程:- 检查请求体和文件目录非空
- 使用
MultipartParser()解析POST请求体 - 调用
readNextPart()处理各部分内容
-
文件部分处理:
- 提取Content-Disposition信息
- 获取filename值(原始上传文件名)
- 实例化
FilePart设置fileName和filePath
-
写入文件:
- 最终写入路径为
tmp路径+filename - 但实际访问发现文件不在预期位置
- 最终写入路径为
1.2.3 关键绕过点
-
文件名处理流程:
b.c()方法处理上传文件参数- 调用
b(filename,name)方法:- 判断filename是否包含图片后缀(jpg/png等)
- 生成最终文件名:
name + b.b(filename)
-
b.b(filename)方法:- 检查是否以jsp结尾,是则替换为txt
- 返回filename中第一个"."之后的内容作为后缀
- 可利用
1.png.jspx绕过后缀检查
-
最终文件处理:
- 原始文件写入
tmp/原始文件名 - 复制到
tmp/name.处理后后缀 - 删除原始文件
- 原始文件写入
1.3 漏洞利用
- 构造上传包:
- 使用目录穿越控制写入路径
- 使用
1.png.jspx绕过后缀检查 - 控制name参数决定最终文件名
2. 某广播系统任意文件上传漏洞分析
2.1 系统特点
- 部署结构:
- web目录:Tomcat部署文件
- server目录:包含jar文件运行独立服务
- mysql目录:SQL日志
2.2 漏洞发现
- 发现独立服务端口运行额外接口
saveFile接口存在任意文件上传:- 参数:
- fileStr:Base64编码的文件内容
- fileName:文件名
- deviceCode:必须为系统存在的设备码
- 文件路径参数
- 参数:
2.3 利用条件
-
获取有效deviceCode:
- 通过
list接口查询 - 对应mapper只需roleId即可查询count(*)
- 通过
-
路径限制:
- 代码写死路径在E盘下
- 通过SQL注入报错获取web路径
- 确认系统部署在E盘可目录穿越
2.4 利用方法
- 通过list接口获取有效deviceCode
- 构造上传包:
- fileStr使用Base64编码
- 控制fileName为jsp文件
- 使用目录穿越写入web目录
3. 某协同办公系统文件上传漏洞分析
3.1 漏洞特点
- 使用
org.apache.commons.fileupload.servlet.ServletFileUpload处理上传 - 特殊要求:filename必须包含"@"
3.2 上传处理逻辑
- 对filename按"@"分割为两部分:
- 第一部分与上传目录拼接形成新目录
- 第二部分与新目录拼接形成最终文件路径
- 默认上传目录:cms/html
3.3 利用方法
- 构造filename为
@1.jsp:- 第一部分为空,使用默认目录
- 第二部分为1.jsp,写入默认目录下
通用代码审计技巧总结
-
上传接口定位:
- 从web.xml搜索"upload"相关配置
- 区分前后台接口:302跳转或session检查
-
上传流程分析:
- 关注文件名校验逻辑
- 注意路径拼接方式
- 检查是否有重命名策略
-
第三方组件使用:
- 常见上传组件如commons-fileupload可不必深入分析
- 重点关注自定义处理逻辑
-
多角度突破:
- web目录无果时可检查独立服务
- 注意部署包中的非标准目录结构
-
信息收集辅助:
- 利用其他漏洞(如SQL注入)获取路径信息
- 通过其他接口获取必要参数
-
绕过技巧:
- 后缀检查绕过(如双后缀)
- 目录穿越控制写入位置
- 参数控制最终文件名