实战 | 测试文件上传漏洞的5个小tips
实战 | 测试文件上传漏洞的5个小tips
渗透安全团队 2024-09-07 21:49
作为红队成员、渗透测试人员和 赏金猎人——我们都喜欢在我们的目标中看到文件上传功能。
但有时我们必须处理不寻常的应用程序,这些应用程序可能会受到“简单”Webshell 上传的良好保护(即存在过滤),因此我们需要采用更具创意的方法。
大多数人都已经熟悉以“传统方式”(文件扩展名、内容类型等)测试上传功能
,
那么本文将涵盖不太传统的上传漏洞
。
让我们开始吧!
首先检查PHP的disabled_functions
我知道这可能有点简单,但我见过很多案例,黑客设法将一些 PHP 文件上传到目标应用程序,但他们却没法进一步利用。原因通常是因为
.ini
文件中的 PHP 功能禁用了“危险函数”,例如
system、exec、shell_exec
和其他运行直接操作系统命令的函数。这种情况在托管环境中非常流行。
我通常使用Acunetix 脚本:
https://www.acunetix.com/blog/articles/web-shells-101-using-php-introduction-web-shells-part-2/
来检查未禁用且可用于为我们的 webshell 提供服务的 PHP 函数:
<?php
print_r(preg_grep("/^(system|exec|shell_exec|passthru|proc_open|popen|curl_exec|curl_multi_exec|parse_ini_file|show_source)$/", get_defined_functions(TRUE)["internal"]));
?>
这个脚本给了我们答案。脚本在屏幕上打印已启用的函数名,我们可以利用它们来运行操作系统命令或读取服务器上的文件 (例如curl_exec)。
通过上传文件进行路径遍历
另一个有时被忽视的漏洞是文件上传的路径遍历。与让我们读取目标服务器上的文件的经典路径遍历不同,在文件上传中,我们的目标是将文件上传到服务器其他的位置。
为什么它很重要?有时,上传目录包含“特殊规则”。例如,我见过服务器管理员通过在
.htaccess
文件中配置特定目录来完全禁用 PHP 对特定目录的支持的情况。在这种情况下,我们应该尝试将“../”添加到我们的请求中,就添加在在文件名之前,并尝试将我们的 webshell 上传到服务器上的其他位置。
在其他情况下,上传的文件可能无法通过网络访问,所以我们也可以尝试这种方法。
还有一件事需要注意,
即使我们出于任何原因无法上传恶意文件,仍然值得测试路径遍历
。如果我们可以将文件(例如图像)上传到其他位置,
则意味着我们可以尝试覆盖服务器的现有文件!
更改目录配置(.htaccess文件上传,这个就比较常见了)
前面我们提到了一个非常重要的文件:.htaccess。以下是来自
apache.org
的文件定义:“ .htaccess文件提供了一种在每个目录的基础上进行配置更改的方法。”
换句话说,该文件用于配置给定目录的特定属性,而不涉及整个 Web 服务器的配置。例如,我们可以只从本地主机访问我们网站的
/adimn
路径,这样它就不会暴露给外部登录。
你明白我的意思了吧?如果我们遇到一个对恶意文件(PHP/ASPX/JSP/等)具有良好防护的网站,我们可以尝试上传我们自己的上传目录配置文件!
我们可以使用以下指令创建一个.htaccess文件:
AddType application/x-httpd-php .png
这行代码告诉服务器将
.png
文件作为 PHP 运行。所以现在我们应该能够上传我们的“image”
.png
文件并将我们的payload注入其中。在许多情况下,对恶意
.htaccess
文件的过滤并不像恶意文件扩展名那么强。
如果上传目录中已有
.htaccess
文件,则上传我们的文件将覆盖现有文件,并可能导致服务器出现问题。因此,不要忘记在上传恶意配置文件后检查服务器是否正常工作。
上传存储的 XSS 和 XXE payload
假设我们尝试了一切方法来上传“经典”webshell,最终得出的结论是我们的目标网站非常了解如何防止恶意 php/aspx/jsp/etc 文件。它只接受管理员希望您上传的任何预期文件类型。
现在我们需要使用网站的管理卡来玩(并获胜)。假设我们假设只上传图像,我们可以使用 SVG 文件作为合法文件。神奇之处就在这里:SVG 是一种基于 XML 的格式。它对我们有两个主要影响:
– XML 格式可能会导致 XXE 攻击
- 这种格式支持Javascript,所以我们可以测试XSS
我们先从XSS部分开始
如果网站希望我们上传图像,例如个人资料图片,我们可以尝试这样的 SVG payload:
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300">
<circle cx="150" cy="147.5" r="50" fill="#DA3A00" />
<script>console.log("@chux13786509 on X for more content!")</script>
</svg>
该payload将创建一个红色圆圈,并在后台打印(console.log)我们想要使用 Javascript 的任何内容。结果如下:
这是我最近测试的一个目标的示例:
通过文件名存储XSS
在某些情况下,当我们有文件上传功能时,上传文件的原始名称会显示在 DOM 上。在这种情况下,我们希望通过上传带有标签的文件来检查存储的 XSS。就像下面的例子一样:
创建名称中包含 HTML 标签的文件
上传这样的文件后,我们将在 DOM 上查找无效图像:
它的渲染方式正如我们所期望的,DOM 包含恶意文件名:
这个漏洞在许多网站中出人意料地流行,其影响介于自我 XSS 和帐户接管之间。如果由于网站的 CSP 良好而无法利用 XSS,请尝试通过利用带有