从本地代码审计到拿下项目作者服务器?
字数 1099 2025-08-29 08:30:30
从本地代码审计到远程服务器控制:文件上传漏洞实战分析
漏洞概述
本文档详细分析了一个通过代码审计发现文件上传漏洞,最终导致攻击者能够控制项目作者远程服务器的完整过程。该漏洞存在于一个Web应用系统中,涉及文件上传功能的安全缺陷。
环境准备
- 从Gitte平台下载目标项目代码
- 搭建本地测试环境(Tomcat服务器)
- 访问系统后台(用户管理模块)
代码审计过程
初始发现
审计发现系统存在多处安全漏洞:
- SQL注入漏洞
- 文件上传漏洞
- XSS漏洞
- 多个组件漏洞
重点审计文件上传功能
在用户管理模块的"用户介绍"处发现文件上传功能,通过Burp Suite抓包分析上传过程。
代码定位
- 根据路由定位上传处理代码
- 初始分析显示代码似乎只处理本地Tomcat路径上传
- 发现矛盾点:实际文件被上传到远程服务器而非本地
关键发现
通过全局搜索发现:
- 数据包中包含
return_url_head参数 - 实际文件上传由JSP文件处理,而非最初定位的代码
- JSP文件未对文件后缀进行有效过滤
漏洞分析
文件上传流程缺陷
- 前端上传文件到指定接口
- 后端接收文件并存储
- 关键问题:
- 未验证文件类型
- 未限制文件扩展名
- 上传路径可控(通过
return_url_head参数) - 文件最终存储在远程服务器
安全机制缺失
- 无文件内容验证
- 无文件扩展名黑名单/白名单
- 上传路径未固定,可被篡改
- 无权限验证(任意用户可上传)
漏洞利用
测试步骤
- 上传普通文件测试功能可用性
- 确认上传成功并获取文件访问URL
- 尝试上传JSP文件(Webshell)
- 使用DNSLog测试验证代码执行
实际攻击
- 构造恶意JSP文件(Webshell)
- 通过文件上传接口提交
- 服务器存储并解析JSP文件
- 通过URL访问上传的JSP文件,确认代码执行
漏洞验证
- 上传包含DNSLog测试代码的JSP文件
- 观察DNSLog平台接收请求
- 确认服务器解析并执行了JSP代码
修复建议
-
文件类型验证:
- 实施白名单机制,只允许特定安全文件类型
- 验证文件内容与扩展名匹配
-
上传路径安全:
- 固定上传目录,不接收外部路径参数
- 对上传文件重命名(避免直接使用用户提供文件名)
-
权限控制:
- 严格验证上传功能访问权限
- 实施CSRF防护
-
服务器配置:
- 禁止上传目录执行脚本
- 定期安全审计上传功能
-
安全开发:
- 统一文件上传处理逻辑
- 避免使用JSP直接处理上传
总结
本案例展示了文件上传功能不当实现可能导致服务器被完全控制的严重后果。通过代码审计发现实际处理逻辑与表面逻辑不一致的安全隐患,最终利用未过滤的文件上传获取服务器控制权。这强调了全面代码审计和严格安全开发实践的重要性。