[THM]上传漏洞

介绍

将文件上传到服务器的能力已成为我们与 Web 应用程序交互不可或缺的一部分。无论是社交媒体网站的个人资料图片、上传到云存储的报告,还是在 Github 上保存项目;文件上传功能的应用是无限的。

不幸的是,如果处理不当,文件上传也会在服务器中打开严重的漏洞。这可能会导致从相对较小的滋扰问题到任何事情;如果攻击者设法上传并执行 shell,则一直到完整的远程代码执行 (RCE)。通过不受限制地上传对服务器的访问(以及随意检索数据的能力),攻击者可以破坏或以其他方式更改现有内容 - 包括注入恶意网页,这会导致 XSS 或 CSRF 等更多漏洞。通过上传任意文件,攻击者还可能使用服务器来托管和/或提供非法内容,或泄露敏感信息。实际上,攻击者能够将他们选择的文件上传到您的服务器 - 没有限制 - 确实非常危险。

这个房间的目的是探讨由于文件上传处理不当(或不充分)而导致的一些漏洞。具体来说,我们将研究:

  • 覆盖服务器上的现有文件
  • 在服务器上上传和执行 Shell
  • 绕过客户端筛选
  • 绕过各种服务器端筛选
  • 欺骗内容类型验证检查

在尝试此房间中的内容之前,完成 Web枚举(或至少 Gobuster 部分)和什么是shell 房间将是一个好主意。

让我们开始吧

 

一般方法论(Web枚举中的Gobuster)

因此,我们在网站上有一个文件上传点。我们将如何利用它?

与任何类型的黑客攻击一样,枚举是关键。我们对环境了解得越多,我们就越能利用它。查看页面的源代码可以很好地查看是否应用了任何类型的客户端筛选。使用目录暴力破解程序(如 Gobuster)进行扫描通常有助于 Web 攻击,并且可能会显示文件上传到的位置;默认情况下,Gobuster 不再安装在 Kali 上,但可以使用 .使用 Burpsuite 拦截上传请求也会派上用场。Wappalyser 等浏览器扩展程序可以一目了然地提供有关您定位的网站的宝贵信息。

再次之前可以扫描一下网址我使用nikto可以更好的了解网站的结构

 覆盖现有文件

当文件上传到服务器时,应执行一系列检查,以确保文件不会覆盖服务器上已存在的任何内容。通常的做法是为文件分配一个新名称 - 通常是随机的,或者将上传的日期和时间添加到原始文件名的开头或结尾。或者,可以应用检查以查看服务器上是否已存在文件名;如果已存在同名文件,则服务器将返回一条错误消息,要求用户选择不同的文件名。在保护现有文件不被覆盖时,文件权限也会发挥作用。例如,网页不应写入 Web 用户,从而防止它们被攻击者上传的恶意版本覆盖。

但是,如果不采取此类预防措施,那么我们可能能够覆盖服务器上的现有文件。实际上,服务器上的文件权限可能会阻止这是一个严重的漏洞。也就是说,它仍然可能非常令人讨厌,值得在渗透测试或错误狩猎环境中保持警惕。


 

在你自己尝试之前,让我们先看一个例子。

 对于真正的挑战,您可能需要列举更多内容;但是,在这种情况下,让我们看一下页面的源代码:

 

在红色框中,我们看到负责显示我们在页面上看到的图像的代码。它来自一个名为“spaniel.jpg”的文件,位于一个名为“images”的目录中。

现在我们知道图像是从哪里拉出来的了——我们可以覆盖它吗?

让我们从互联网上下载另一张图片并调用它。然后,我们会将其上传到站点,看看是否可以覆盖现有图像:spaniel.jpg

我们的攻击成功了!我们设法用我们自己的副本覆盖了原件。images/spaniel.jpg


 

 实践

 

 

 远程代码执行

 

覆盖服务器上存在的文件都很好。这对维护网站的人来说是一种麻烦,并可能导致一些漏洞,但让我们走得更远;让我们去RCE吧!

远程代码执行(顾名思义)将允许我们在 Web 服务器上任意执行代码。虽然这可能是一个低特权的 Web 用户帐户(例如在 Linux 服务器上),但它仍然是一个极其严重的漏洞。通过Web应用程序中的上传漏洞远程执行代码,往往通过上传以与网站后端相同的语言(或服务器理解并将执行的另一种语言)编写的程序来利用。传统上,这将是PHP,但是,在最近,其他后端语言变得更加普遍(Python Django和Node.js形式的Javascript就是最好的例子)。值得注意的是,在路由应用程序(即以编程方式定义路由而不是映射到文件系统的应用程序)中,这种攻击方法变得更加复杂,并且不太可能发生。大多数现代 Web 框架都是以编程方式路由的。

www-data

利用文件上传漏洞时,有两种基本方法可以在 Web 服务器上实现 RCE:webshell 和反向/绑定 shell。实际上,功能齐全的反向/绑定 shell 是攻击者的理想目标;但是,Webshell 可能是唯一可用的选项(例如,如果对上传施加了文件长度限制,或者防火墙规则阻止了任何基于网络的 shell)。我们将依次看一下其中的每一个。作为一般方法,我们希望上传一种或另一种 shell,然后激活它,如果服务器允许,则通过直接导航到文件(限制不足的非路由应用程序),或者以其他方式强制 Web 应用程序为我们运行脚本(在路由应用程序中是必需的)。


Web 外壳:

假设我们找到了一个带有上传表单的网页:

 我们该何去何从?好吧,让我们从gobuster扫描开始:

 看起来我们这里有两个目录 -- 和 .其中,我们上传的任何文件似乎都可能被放置在“uploads”目录中。我们将首先尝试上传合法的图像文件。在这里,我从上一个任务中选择了我们可爱的狗照片:uploadsassets

 

 现在,如果我们去,我们应该看到猎犬图片已经上传!http://demo.uploadvulns.thm/uploads

 

好的,我们可以上传图片了。现在让我们尝试一个 webshell。

事实上,我们知道这个 Web 服务器是使用 PHP 后端运行的,所以我们将直接跳到创建和上传 shell。在现实生活中,我们可能需要多做一点枚举;然而,无论如何,PHP 都是一个不错的起点。

一个简单的 webshell 通过获取参数并将其作为系统命令执行来工作。在 PHP 中,其语法为:

<?php
    echo system($_GET["cmd"]);
?>

此代码采用 GET 参数并将其作为系统命令执行。然后,它将输出回显到屏幕上。

让我们尝试将其上传到站点,然后使用它来显示当前用户和当前目录的内容:

 我们现在可以使用这个 shell 从系统中读取文件,或者从这里升级到反向 shell。现在我们有了 RCE,选择是无限的。请注意,使用 webshell 时,通常可以通过查看页面的源代码来查看输出。这大大改善了输出的格式。


 

反向shell实现RCE

上传反向 shell 的过程与上传 webshell 的过程几乎完全相同,我们将使用Pentest Monkey文档建立反向 shell,这在Kali Linux 上是默认安装的,

该文档的链接是:https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php

你需要编辑这个 shell 的第49行:$ip = '127.0.0.1'; // CHANGE THIS

将127.0.0.1更改为 TryHackMe提供的 tun0 IP 地址(在https://tryhackme.com/access 页面可以找到,这代表的是攻击机的内部虚拟 IP 地址)

修改完shell文件后,接下来我们需要做的是启动一个 Netcat 监听器来接收连接,输入命令: nc -lvnp 1234

 

现在,让我们上传 shell,然后通过浏览器url导航到http://demo.uploadvulns.thm/uploads/shell.php

这个 shell 的名字,就是你自己命令的shell文件的名字(默认情况下是php-reverse-shell.php)

此时网站会被挂起,无法正常加载内容,当我们切换回我们的终端界面时,我们可以看到我们获取了一个反向shell:

 再一次,我们在这个网络服务器上获得了RCE。从这里开始,我们希望稳定我们的外壳并提升我们的特权,但这些是另一个时间的任务。现在,是时候亲自尝试一下了!


实践(网站http://shell.uploadvulns.thm)

gobuster打点

这里我使用方向shell将文件上传就行了

 

监听

然后利用gobuster打点的信息访问上传的文件

 

成功连上,加固一下shell(有点啰嗦,python环境没有,只能上传socat)

 过滤

到目前为止,我们基本上忽略了反防守 受 Web 开发人员用于防御文件上传 漏洞。到目前为止,您成功攻击的每个网站 在这个房间里,完全没有安全感。是时候改变了。从 在这里,我们将研究一些用于 防止恶意文件上传,以及如何规避它们。


首先,让我们讨论一下客户端过滤和服务器端过滤之间的区别。

当我们谈论脚本是“客户端”时,在 Web 的上下文中 应用程序,我们的意思是它在用户的浏览器中运行,而不是在用户的浏览器中运行 到 Web 服务器本身。JavaScript 作为客户端脚本语言几乎无处不在,尽管确实存在替代方案。无论使用哪种语言 使用时,客户端脚本将在 Web 浏览器中运行。在 文件上传的上下文,这意味着过滤发生在 文件甚至被上传到服务器。从理论上讲,这似乎是 像是一件好事,对吧?在一个理想的世界里,它会是;然而 因为过滤发生在我们的计算机上,所以它是 非常容易绕过。因此,客户端过滤本身就是一个 验证上传文件是否不安全的高度不安全的方法 恶意。

相反,正如您可能已经猜到的那样,服务器端脚本将在服务器上运行。传统上,PHP 是 主要的服务器端语言(Microsoft 的 ASP for IIS 紧随其后);然而,近年来,其他 选项(C#、Node.js、Python、Ruby on Rails 等)的使用越来越广泛。服务器端过滤往往更难绕过,因为您面前没有代码。由于代码是在服务器上执行的,因此在大多数情况下,也无法完全绕过过滤器;相反,我们必须形成一个有效负载,它符合现有的过滤器,但仍然允许我们执行我们的代码。


考虑到这一点,让我们看一下一些不同类型的过滤。

扩展验证:

文件扩展名(理论上)用于标识文件的内容。在实践中,它们很容易改变,所以实际上意义不大;然而,MS Windows 仍然使用它们来识别文件类型,尽管基于 Unix 的系统倾向于依赖其他方法,我们将在稍后介绍这些方法。检查扩展程序的筛选器可通过以下两种方式之一工作。他们要么将扩展名列入黑名单(即有一个不允许的扩展名列表),要么将扩展名列入白名单(即有一个允许的扩展名列表,并拒绝其他所有扩展名)。

文件类型过滤:

与扩展验证类似,但更密集的是,文件类型筛选再次用于验证文件的内容是否可以上传。我们将研究两种类型的文件类型验证:

  • MIME 验证:MIME (M ultipurpose Internet Mail Extension) 类型用作文件的标识符 -- 最初是通过电子邮件作为附件传输时,但现在也是通过 HTTP(S) 传输文件时。文件上传的 MIME 类型附加在请求的标头中,如下所示:

     MIME 类型遵循 / 格式。在上面的请求中,您可以看到图像“spaniel.jpg”已上传到服务器。作为合法的 JPEG 图像,此上传的 MIME 类型为“image/jpeg”。可以在客户端和/或服务器端检查文件的 MIME 类型;但是,由于 MIME 基于文件的扩展名,因此非常容易绕过。

  • 幻数验证: 幻数是确定文件内容的更准确方法;虽然,它们绝不是不可能伪造的。文件的“幻数”是文件内容开头的一串字节,用于标识内容。例如,PNG 文件在文件的最顶部具有以下字节:.

     与 Windows 不同,Unix 系统使用幻数来标识文件;但是,在处理文件上传时,可以检查上传文件的幻数,以确保可以安全接受。这绝不是一个有保证的解决方案,但它比检查文件的扩展名更有效。

    89 50 4E 47 0D 0A 1A 0A

    文件长度过滤:

    文件长度过滤器用于防止通过上传表单将大文件上传到服务器(因为这可能会使服务器资源匮乏)。在大多数情况下,当我们上传 shell 时,这不会给我们带来任何问题;但是,值得记住的是,如果上传表单只希望上传一个非常小的文件,则可能会有一个长度过滤器来确保遵守文件长度要求。举个例子,我们上一个任务中完全成熟的PHP反向shell是5.4Kb大 - 相对小,但如果表单期望最大2Kb,那么我们需要找到一个替代的shell来上传。

文件名过滤:

如前所述,上传到服务器的文件应该是唯一的。通常,这意味着在文件名中添加一个随机方面,但是,另一种策略是检查服务器上是否已经存在同名文件,如果存在,则给用户一个错误。此外,应在上传时清理文件名,以确保它们不包含任何“错误字符”,这可能会在上传时对文件系统造成问题(例如,Linux 上的空字节或正斜杠,以及控制字符,例如和潜在的 unicode 字符)。这对我们来说意味着,在一个管理良好的系统上,我们上传的文件不太可能具有我们在上传前给它们起的名字,所以请注意,如果你设法绕过内容过滤,你可能不得不去寻找你的外壳。

文件内容过滤:

更复杂 过滤系统可能会将上传文件的全部内容扫描到 确保它不会欺骗其扩展名、MIME 类型和幻数。 这是一个比大多数基本过滤系统所采用的复杂得多的过程,因此不会在本房间中讨论。


值得注意的是,这些过滤器本身都不是完美的——它们通常会相互结合使用,提供多层过滤器,从而显着提高上传的安全性。这些筛选器中的任何一个都可以应用于客户端和/或服务器端。

同样,不同的框架和语言也有自己固有的过滤和验证上传文件的方法。因此,可能会出现特定于语言的漏洞;例如,在 PHP 主要版本 5 之前,可以通过向恶意文件附加一个 null 字节,后跟一个有效的扩展名来绕过扩展名过滤器 。最近,还可以将PHP代码注入到其他有效图像文件的exif数据中,然后强制服务器执行它。如果您有兴趣,欢迎您进一步研究这些内容。

 绕过客户端筛选

正如前面所提到的,客户端过滤非常容易绕过,因为它完全发生在你所控制的机器上,当你能够访问代码时,就很容易去修改它。

有四种简单的方法可以绕过一般的客户端文件上传过滤:

复制代码
1.关闭浏览器中的 Javascript以绕过客户端过滤 ——如果网站不需要 Javascript 来提供基本的功能,那么这种绕过方法就是有效的。
如果完全关闭 Javascript 将阻止站点工作,那么你可能需要选择其他方法来进行绕过客户端过滤,

2.拦截并修改将要加载的web页面。使用 Burpsuit,我们可以拦截传入的Web页面,并在 Javascript 过滤器有机会运行之前就删除这个过滤器。

3.拦截并修改文件然后再上传。前一个方法在加载网页之前工作,这个方法则允许网页正常加载,在文件已经通过,并被过滤器接受之后,再拦截文件上传操作(upload)。

4.直接将文件发送到上传点,当你可以直接使用像 curl 这样的工具发送文件时,为什么要使用带有过滤器的网页呢?这种将数据直接发布到包含处理文件上传代码的页面是完全绕过客户端过滤器的另一种有效方法。
在这里,我们不会深入讨论这种方法,但是,这种命令的语法应该是这样的:
curl -X POST -F "submit:<value>" -F "<file-parameter>:@<path-to-file>" <site>
要使用这种方法,首先要拦截一次成功的上传(使用 BurpSuite 或浏览器控制台) ,查看上传中使用的参数,然后将这些参数插入上面的命令。
复制代码

我们将在下面深入介绍方法二和方法三。


让我们再次假设,我们在网站上找到了一个上传页面:

 与往常一样,我们将看一下源代码。在这里,我们看到一个基本的 Javascript 函数,用于检查上传文件的 MIME 类型:

 在本例中,我们可以看到过滤器正在使用白名单来排除任何不是 

我们的下一步是尝试上传文件——正如预期的那样,如果我们选择 JPEG,函数会接受它。任何其他内容,上传都将被拒绝。

 

确定这一点后,让我们启动 Burpsuite 并重新加载页面。我们将看到我们自己对站点的请求,但我们真正想看到的是服务器的响应,所以右键单击截获的数据,向下滚动到“执行拦截”,然后选择“响应此请求”:

 

 当我们单击窗口顶部的“转发”按钮时,我们将看到服务器对我们请求的响应。在这里,我们可以在 Javascript 函数有机会加载之前将其删除、注释掉或以其他方式中断:

 删除该功能后,我们再次单击“转发”,直到网站完成加载,现在可以自由地将任何类型的文件上传到网站:

 这里值得注意的是,在默认情况下,Burpsuite 不会拦截 Web 页面正在加载的任何外部 Javascript 文件。如果你需要编辑一个不在正在加载的主页面中的脚本(也就是外部js脚本),你需要点击 Burpsuite窗口顶部的“ Options”选项卡,然后在“ Intercept Client Request”(拦截客户端请求)部分,编辑第一行的“文件扩展名-不匹配”的条件(condition),删除^js$| :

 我们已经通过在加载页面之前拦截和删除过滤器函数绕过了这个过滤,现在让我们尝试先上传一个具有合法扩展名和 MIME 类型的文件,然后再用 Burpsuite 进行拦截和更正上传。

重新加载网页(这时过滤器函数将重新生效),让我们使用之前使用的反向 shell 并将其重命名为“ shell.jpg”。当 MIME 类型(基于文件扩展名)自动检查完成时,客户端的过滤器会让我们的payload(有效载荷)通过:

 激活 Burpsuite 拦截功能,然后在网页中单击“uplpad(上传)”,Burpsuite 就会自动捕捉该上传请求:

 请注意,我们的 PHP shell 的 MIME 类型当前是 image/jpeg。我们将其更改为 text/x-php,并将文件扩展名从.jpg改成.php,然后再将这个请求转发到服务器:

 我们先在攻击机终端设置好netcat 监听器,然后我们再导航到 http://demo.uploadvulns.thm/uploads/shell.php 页面,由下图能够看到攻击机终端已经成功接收到一个连接,反向shell已建立!


 

实践

 打开网站发现

 发现去内部js,只允许上传image/png(规避方法有屏蔽js,或者抓包,因为这个逻辑屏蔽也不会影响上传)

 简单探测后发现images目录应该就是上传文件存放的目录,好了咱们开始绕过前端吧!!!!

直接将shell改成png扩展名,抓包在改成php

 成功了,开启监听吧,然后访问该页面。

THM{NDllZDQxNjJjOTE0YWNhZGY3YjljNmE2}成功拿到flag。其实用cur上传直接忽略前端一切。

 

绕过服务器端筛选:文件扩展名

是时候把事情再提升一个档次了!

客户端过滤器很容易绕过 -- 您可以看到它们的代码,即使它已被混淆并需要处理才能读取它;但是,当您无法查看或操作代码时会发生什么?嗯,这是一个服务器端过滤器。简而言之,我们必须进行大量测试,以建立允许或不允许通过过滤器的概念,然后逐渐组合出符合限制的有效载荷。

对于此任务的第一部分,我们将看一个使用文件扩展名黑名单作为服务器端过滤器的网站。有多种不同的方法可以对其进行编码,我们使用的旁路取决于此。在现实世界中,我们无法看到这方面的代码,但对于这个例子,它将包含在这里:

 

在此实例中,代码正在查找最后一个句点(.)并使用该文件名确认扩展名,这就是我们要绕过的。

这些代码的其他工作方式包括: 搜索文件名中的第一个句点(.),或者在每个句点(.)后面分割文件名,检查是否有被列入黑名单的扩展名出现。

我们可以看到代码正在过滤掉.php 和.phtml 扩展名,因此,如果我们想要上传一个 PHP 脚本,我们将不得不寻找另一个扩展名。

PHP 的维基百科页面( https://en.wikipedia.org/wiki/PHP )提供了一些常见的扩展,我们可以尝试使用; 然而,实际上还有很多其他很少使用的扩展,网络服务器仍然可以识别出来,其中包括:

.php3, .php4, .php5, .php7, .phps, .php-s, .pht and .phar

 其中许多都能绕过过滤器(.php 和.phtml被黑名单过滤拦截) ,但有时候服务器会被配置为 不识别一些扩展名为 PHP 文件,如下例所示:

 

这实际上是 Apache2服务器的默认配置(不识别一些扩展名为 PHP 文件),但是,系统管理员可能已经更改了默认配置(或服务器可能已经过时),所以使用其他可能会被解析成php的文件扩展名 还是值得一试。

最终在本例中,我们发现.phar扩展名能够绕过过滤器,并让我们获得一个shell:

 


让我们看另一个例子,使用不同的过滤器。这一次,我们将完全黑匣子:即没有源代码。

再一次,我们有我们的上传表格:

 好的,我们将从完全合法的上传开始。让我们尝试上传之前的图像:spaniel.jpg

 好吧,这告诉我们至少可以接受 JPEG。让我们选择一个我们可以非常确定会被拒绝的():shell.php

 

通过多次尝试上传不同文件格式 的文件,我们能够大概了解 过滤器会接受什么格式的文件或者会拒绝什么格式的文件,我们发现没有既执行又不被过滤的php shell 文件扩展名。

在前面的示例中,我们看到后端代码使用 pathinfo ()函数 来得到" . "后面的最后几个字符,但是如果它对 略有不同的输入内容 进行过滤时会发生什么呢?

让我们尝试上传一个名为shell.jpg.php的文件,我们已经知道 JPEG 文件能够被接受,如果过滤器只是检查.jpg文件是否在输入内容中的某个地方 那会发生什么呢?

这种过滤器的伪代码可能是这样的:

 

伪代码大概意思,如果.jpg在filename中保存,不在就报错

  

 激活它,我们收到我们的 shell:

 


这绝不是一个与文件扩展名相关的上传漏洞的详尽列表。与黑客行为中的所有内容一样,我们也在寻找其他人编写的代码中的缺陷; 这些代码很可能是为手头的任务编写的唯一代码。这是从这个任务中学到的真正重要的一点: 在编程时,有成千上万种不同的方法来实现相同的特性——您的开发必须针对手边的过滤器进行定制。绕过任何类型的服务器端过滤器的关键是枚举并查看哪些是允许的,以及哪些是阻塞的; 然后尝试构建一个有效载荷,以便能够通过过滤器所寻找的条件。


实践

不断测试他的特点,制定合适的有效负荷。

 

 打开privaty/shell.php5

 

绕过服务器端筛选:幻数

我们已经了解了服务器端扩展过滤,但让我们也借此机会看看如何将幻数检查实现为服务器端过滤器。

如前所述,幻数用作更准确的文件标识符。文件的幻数是一串十六进制数字,并且始终是文件中的第一个东西。知道了这一点,就可以使用幻数来验证文件上传,只需读取前几个字节并将它们与白名单或黑名单进行比较即可。请记住,这种技术对基于 PHP 的 Web 服务器非常有效;但是,它有时可能会针对其他类型的 Web 服务器失败(提示提示)。

让我们看一个例子。像往常一样,我们有一个上传页面:

 

如果我们上传标准的 shell.php 文件,就会得到一个错误,但是上传JPEG文件是可以的,所以让我们尝试添加 JPEG 的魔术数字到我们的shell.php文件的顶部,

查看网站:https://en.wikipedia.org/wiki/List_of_file_signatures ,这个网站向我们展示了 JPEG 文件的几个魔术数字,选择其中一个即可,如:FF D8 FF DB

我们可以直接把这些数字的 ASCII 表示(ÿØÿÛ)添加到文件的顶部,但是直接使用十六进制表示通常更容易。

在开始之前,让我们使用 Linux file 命令来检查 shell 的文件类型:

 我们选择的魔术数字是四个字节长度,所以让我们打开反向 shell 脚本,在第一行添加四个随机字符。这些字符并不重要,所以在这个例子中我们用了四个“ A”:

 保存并退出,使用hexeditor(kali默认已安装)或者其他类似工具打开这个文件,这个工具可以让你以十六进制的形式打开并且编辑shell文件内容:

 注意上图红色框中的四个字节: 它们都是41,这是大写的“ A”的十六进制代码--正是我们之前在文件顶部添加的内容,将其更改为我们之前查找到的 JPEG 文件的魔术数字:FF D8 FF DB

 现在,如果我们保存并退出文件(Ctrl + x),我们可以再次使用 file命令,并且可以看到我们已经成功地欺骗了 shell 的 filetype:

很好,现在让我们尝试上传修改后的 shell,看看它是否绕过过滤器:

 

 我们绕过了服务器端的魔法数字过滤器,得到了一个反向 shell。


实践

上传路径在graphics上

结束


示例方法

我们现在已经看到了各种不同类型的过滤器——客户端和服务器端——以及用于文件上传攻击的一般方法。在下一个任务中,你将要完成一个黑盒文件上传挑战,因此让我们借此机会讨论一个示例方法,以便更深入地处理此类挑战。你可以开发自己的方法来替代这种方法,但是,如果你是文件上传攻击的新手,你可能会发现以下示例方法非常有用。

我们把这看作是一个循序渐进的过程,假设我们有一个网站要进行安全审计:

​ 1.我们要做的第一件事就是把网站作为一个整体来看。使用浏览器扩展插件,比如前面提到的 Wappalyzer(或者手动) ,我们可以寻找到 Web 应用程序可能使用了什么语言和框架。 Wappalyzer并不总是100% 准确,通过向网站发出请求来手动枚举这些信息是一个很好的开始,同时可以使用 Burpsuite来截取响应消息。消息头中的server或者x-powered-by可用于获取有关服务器的信息,我们还要寻找攻击的载体,比如,一个上传页面。

​ 2.找到一个上传页面之后,我们的目标是进一步检查它。查看客户端脚本的源代码,以确定是否有任何要绕过的客户端过滤器,客户端完全在我们的控制之中。

​ 3.然后我们会尝试上传一个完全无害的文件。从这里我们将看到如何才能访问我们的文件,换句话说,我们可以直接在上传文件夹中访问它吗?上传的文件是不是嵌在某个页面里了?网站对所上传的文件的命名方案是什么?如果上传之后,文件所在的位置不是很明显,就需要使用Gobuster 这样的目录扫描工具。这一步非常重要,因为它不仅提高了我们对正在攻击的目标的认识,还给了我们一个“可接受”文件的基准,我们可以在此基础上做进一步测试。

​ gobuster在这里的一个常用参数选项是-x 选项,该选项可用来查找具有特定扩展名的文件,例如,如果将 -x php,txt,html 添加到 gobuster 命令中,则该工具将附加.php,.txt和.html到选定的字典内容中的每一项。如果你已经设法上传了一个有效负载,并且服务器会更改上传文件的名称,那么这将非常有用。

​ 4.确定了如何以及在哪里可以访问我们上传的文件之后,我们将尝试进行恶意文件上传,绕过我们在第二步中发现的任何客户端过滤器。如果此时存在服务器端过滤器使文件上传停止,那么它给我们的报错消息对于确定接下来的步骤非常有用。

假设我们的恶意文件上传操作已经被服务器端过滤所停止,以下有一些方法可以确定服务器端使用的是哪种类型的过滤:

​ 1.如果你可以成功地上传一个文件扩展名完全无效的文件(testingimage.invalidfileextension),服务器很可能使用了"扩展名黑名单"来过滤文件,反之,如果该上传失败,那么服务器可能使用的是"扩展名白名单"的方式过滤文件。

​ 2.尝试重新上传最初被接受的完全无害文件,但这一次将该文件的魔术数字修改为shell文件类型(如php类型)的魔术数字。如果上传失败,那么说明服务器正在使用一个基于魔术数字验证的过滤器。

​ 3.与前一点一样,再次尝试上传无害的文件,但是使用 BurpSuite 拦截请求,并将上传的 MIME 类型更改为你希望通过过滤的MIME类型。如果上传失败,那么说明服务器端是基于 MIME 类型验证进行过滤的。

​ 4.枚举服务器端是否存在文件长度过滤,就是上传一个小文件,然后逐渐上传更大的文件,直到你触发了过滤器。到那时你就会知道可接受的极限文件大小是多少。如果你非常幸运,那么第一次上传失败的错误信息可能会直接告诉你文件大小限制是多少。请注意,一个小的文件长度限制可能会阻止你上传shell文件----比如:到目前为止我们一直在使用的反向 shell文件。

开始挑战

 

 打开靶场,用示例方法去测试。

 服务器的整体nginx加express(node.js)

我们现在就假设已经找到了上传界面,查看源码(ctrl  +  f5 清除浏览器缓存)

 发现是个前端有个过滤,文件大小过滤,加扩展名过滤,加幻数

抓包删除upload.js内的逻辑

 

 

 

 

 题后总解,发现服务器端的语言,然后选择shell,在去测试规则,在启动上传的shell,获取shell

学会了如何使用burpsurit去截断js,gobuster高级用法,枚举文件

 

拜拜,后面这个靶场速过的忘记留截图了,所以很快。

 

posted @   trymonoly  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示