在线某系统远程代码执行
字数 1203 2025-08-10 08:28:55
在线某系统远程代码执行漏洞分析与利用教学
漏洞概述
本文档详细分析了一个基于PHP的Web系统中存在的远程代码执行漏洞,该漏洞源于文件上传功能缺乏严格的类型检查和安全防护措施,导致攻击者可以上传恶意文件并执行任意代码。
漏洞发现过程
初始信息收集
-
系统扫描:
- 使用扫描工具发现了系统后台入口,但无法直接访问
- 发现关键接口:
classes/Users.php?f=save
-
接口分析:
- 访问该接口返回数字"2",推测为POST请求接口
- 功能推测:用户信息保存功能,可能包含头像上传
文件上传功能探测
-
初步测试:
- 尝试使用
name=image参数上传,仍返回2,无法确认是否上传成功 - 使用dirsearch等工具扫描目录结构,发现
/uploads/目录存在
- 尝试使用
-
技术栈分析:
- 发现系统使用PHP CLI SAPI内置Web服务器
- 使用
strtotime函数生成时间戳作为文件名的一部分 - 测试
strtotime("now")得到时间戳:1625751330
-
参数确定:
- 通过分析JavaScript代码发现上传参数实际为
img而非image - 使用
name=img参数成功上传文件
- 通过分析JavaScript代码发现上传参数实际为
漏洞利用细节
文件上传机制
-
文件名生成:
- 使用当前时间戳作为文件名的一部分
- 格式推测:
[时间戳]_[原始文件名]
-
上传路径:
- 文件上传至
/uploads/目录 - 可通过直接访问上传的文件路径来验证上传是否成功
- 文件上传至
远程代码执行
-
上传恶意PHP文件:
- 构造包含PHP代码的文件(如webshell)
- 通过
img参数上传该文件
-
访问执行:
- 根据文件名生成规则计算出完整路径
- 直接访问上传的PHP文件实现代码执行
漏洞成因分析
-
主要问题:
- 缺乏文件类型检查:未验证上传文件的扩展名和内容类型
- 未对上传文件内容进行安全检测
-
安全假设错误:
- 系统管理员假设所有用户都是可信的
- 未考虑攻击者可能利用正常功能上传恶意文件
漏洞复现步骤
-
准备阶段:
- 搭建类似环境(PHP CLI SAPI Web服务器)
- 确保存在用户信息保存接口
-
复现过程:
POST /classes/Users.php?f=save HTTP/1.1 Host: target.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123 ------WebKitFormBoundaryABC123 Content-Disposition: form-data; name="img"; filename="shell.php" Content-Type: application/octet-stream <?php system($_GET['cmd']); ?> ------WebKitFormBoundaryABC123-- -
验证执行:
- 计算当前时间戳:
date +%s - 访问:
http://target.com/uploads/1625751330_shell.php?cmd=id
- 计算当前时间戳:
防御建议
-
输入验证:
- 严格限制上传文件类型(白名单机制)
- 验证文件内容与扩展名是否匹配
-
文件处理:
- 重命名上传文件(不使用用户提供的文件名)
- 将上传文件存储在非Web可访问目录
- 对图片文件进行二次渲染处理
-
服务器配置:
- 禁用PHP等脚本在上传目录的执行权限
- 设置适当的文件权限
-
安全审计:
- 定期检查上传目录内容
- 实现文件上传日志记录
总结
该漏洞展示了文件上传功能实现不当可能导致严重后果。开发人员应始终遵循最小权限原则,对所有用户输入(包括文件上传)保持怀疑态度,并实施多层防御措施来保护系统安全。