文件上传漏洞或预习文件包含漏洞

时间:2024-03-21 20:20:22
  1. 文件上传漏洞:

    • 文件上传漏洞是指在网站或应用程序中存在未经验证的文件上传功能,攻击者可以利用这个漏洞来上传包含恶意代码的文件,例如 PHP 网页脚本、后门程序等。一旦上传成功,攻击者可以执行任意代码,获取系统权限,甚至完全控制受影响的服务器。
  2. 文件包含漏洞:

    • 文件包含漏洞是指在网站或应用程序中存在未经验证的文件包含功能,攻击者可以利用这个漏洞来包含恶意文件或远程文件。攻击者可以通过构造恶意的文件路径或 URL,使服务器加载并执行恶意代码,从而执行任意命令或获取敏感信息。

文件包含漏洞

php中常见的文件包含函数有以下四种:

  • include()

  • require()

  • include_once()

  • require()_once()

  • include(): 用于将指定文件包含到当前 PHP 脚本中,并且如果包含失败,只会发出警告而不会中断脚本执行。

  • require(): 与 include() 类似,也用于将指定文件包含到当前 PHP 脚本中,但是如果包含失败,会导致致命错误,并且停止脚本执行。

  • include_once(): 与 include() 类似,但是如果文件已经被包含过,则不会再次包含。

  • require_once(): 与 require() 类似,但是如果文件已经被包含过,则不会再次包含。

在远程文件包含漏洞(RFI)中,可以利用query或fragment来绕过后缀限制。、

protocol :// hostname[:port] / path / [;parameters][?query]#fragment
11

文件上传漏洞:

文件上传漏洞是指在网站或应用程序中存在未经充分验证的文件上传功能,攻击者可以通过上传恶意文件来执行任意代码或者获取未授权的访问权限。下面我将简要介绍文件上传漏洞,并提供一个简单的案例代码段来说明漏洞的原理。

文件上传漏洞的原理是,当网站或应用程序允许用户上传文件时,如果没有充分验证上传文件的类型、大小以及目标存储位置等参数,攻击者可以利用这个漏洞来上传包含恶意代码的文件,例如 PHP 网页脚本、后门程序等。然后,攻击者可以通过访问上传的恶意文件来执行任意代码,获取服务器权限,或者进行其他恶意操作。

下面是一个简单的 PHP 代码段,演示了一个潜在的文件上传漏洞:

<?php
// 如果用户通过表单提交了文件
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 上传目录
    $targetDir = "uploads/";
    // 上传文件的路径
    $targetFile = $targetDir . basename($_FILES["fileToUpload"]["name"]);
    // 文件类型
    $fileType = strtolower(pathinfo($targetFile,PATHINFO_EXTENSION));

    // 允许的文件类型
    $allowedTypes = array("jpg", "jpeg", "png", "gif");

    // 检查文件类型是否允许
    if(in_array($fileType, $allowedTypes)){
        // 尝试移动上传的文件到目标位置
        if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
            echo "文件上传成功";
        } else {
            echo "文件上传失败";
        }
    } else {
        echo "只允许上传 JPG, JPEG, PNG, GIF 格式的文件";
    }
}
?>

<!DOCTYPE html>
<html>
<body>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post" enctype="multipart/form-data">
    选择要上传的文件:
    <input type="file" name="fileToUpload" id="fileToUpload">
    <input type="submit" value="上传文件" name="submit">
</form>

</body>
</html>
这段代码包含一个简单的文件上传表单,用户可以选择一个文件并上传到服务器的 uploads/ 目录中。但是,代码没有对上传的文件进行充分验证,例如没有验证文件类型、大小等,也没有对上传文件的目标路径进行验证,这就导致了文件上传漏洞的存在。攻击者可以上传任意类型的文件,并执行其中包含的恶意代码。

防止文件上传漏洞,应该对上传的文件进行严格的验证,包括验证文件类型、大小、文件名等,并且将上传的文件保存在安全的位置,不要直接保存在 Web 可访问的目录下。

防止的话就是加上文件上传检测

// 检查文件类型是否允许
    if(in_array($fileType, $allowedTypes)){
        // 检查文件大小
        if ($_FILES["fileToUpload"]["size"] > 500000) {
            echo "文件太大,不允许上传";
        } else {
            // 检查文件是否为上传的文件
            if (is_uploaded_file($_FILES["fileToUpload"]["tmp_name"])) {
                // 将文件移动到目标位置
                if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $targetFile)) {
                    echo "文件上传成功";
                } else {
                    echo "文件上传失败";
                }
            } else {
                echo "非法上传文件";
            }