Pescms任意文件上传/0day/getshell/代码审计
字数 1277 2025-08-09 22:00:49

Pescms 任意文件上传漏洞分析与利用指南

漏洞概述

Pescms (版本 pescmsteam-v2.3.3) 存在一个任意文件上传漏洞,攻击者可以通过修改上传文件的后缀名绕过系统限制,上传恶意PHP文件,最终导致服务器被控制(getsell)。

漏洞原理分析

1. 上传过滤机制缺陷

系统在处理文件上传时存在以下关键问题:

  1. 数据库存储未过滤:用户提交的文件后缀名数据未经充分过滤就直接写入数据库
  2. 配置读取信任问题:系统从数据库读取config["allowFiles"]配置作为允许上传的文件后缀
  3. 图片与非图片处理差异
    • 对于图片文件:使用GD库进行过滤(能有效阻止图片马)
    • 对于非图片文件:直接上传,无有效过滤

2. 代码审计关键点

通过代码审计发现以下关键代码流程:

  1. upload类继承了controller类,使用了一个config数组存储上传配置
  2. 系统包含Uploader.php文件处理实际上传逻辑
  3. 上传验证逻辑:
    // 检查文件后缀是否在允许列表中
    if (in_array($fileExtension, $config["allowFiles"])) {
        // 继续上传流程
    }
    
  4. 图片处理分支:
    if (是图片文件) {
        使用GD库处理; // 能过滤图片马
    } else {
        直接上传; // 漏洞点
    }
    

漏洞复现步骤

环境搭建

  1. 使用phpstudy搭建Pescms系统(版本v2.3.3)
  2. 确保系统运行正常,文件上传功能可用

攻击流程

  1. 修改上传文件后缀

    • 找到系统允许上传的文件类型配置处
    • 添加.php后缀到允许上传的文件类型中
  2. 准备恶意文件

    • 创建一个包含PHP代码的文本文件(如webshell)
    • 示例webshell内容:
      <?php @eval($_POST['cmd']); ?>
      
  3. 上传恶意文件

    • 在系统"编辑"功能中选择"附件上传"
    • 上传准备好的恶意文件
    • 关键点:不要使用图片马,因为GD库会过滤掉有效载荷
  4. 获取上传路径

    • 系统会返回上传成功的文件路径
    • 记录此路径用于后续访问
  5. 连接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...

漏洞利用注意事项

  1. 避免使用图片马

    • 虽然可以修改图片后缀为.php,但由于GD库过滤,实际上传的图片马无法执行
    • 必须上传纯PHP文件才能成功getshell
  2. 后缀名修改技巧

    • 需要确保.php后缀被添加到系统允许的上传类型中
    • 可以通过修改数据库或找到系统配置界面实现
  3. 上传点选择

    • 优先选择非图片上传点(如附件上传)
    • 图片上传点即使修改后缀也难以利用成功

防御建议

  1. 输入过滤

    • 对所有用户输入(特别是文件后缀名)进行严格过滤
    • 使用白名单机制,只允许特定的安全后缀
  2. 文件内容检查

    • 对所有上传文件进行内容验证,不仅是文件头
    • 对PHP等可执行文件应完全禁止上传
  3. 权限控制

    • 上传目录设置为不可执行
    • 对上传文件进行重命名,避免直接使用用户提供的文件名
  4. 安全配置

    • 定期更新系统和框架
    • 禁用不必要的文件上传功能

总结

Pescms v2.3.3的文件上传漏洞源于对用户输入过度信任和过滤不严,通过精心构造的上传请求,攻击者可以绕过限制上传PHP webshell,完全控制服务器。开发人员应引以为戒,对所有用户输入实施"不信任"原则,采用多层次的安全防护措施。

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