文件上传漏洞的各种姿势 | 如何绕过各种限制
作者:FancyPig | 发布时间: | 更新时间:
相关阅读
文件上传相关资料
往期视频
视频讲解
本期视频,我们将深入研究各种上传漏洞,让你大开眼界。😮我们将尝试绕过客户端和服务器端的过滤器🚧,上传webshell💻,反弹shell🔙,并探索神奇的字节与巧妙的方法来规避文件上传限制🧙♂️。我们会在TryHackMe平台上进行实战演示👩💻,向你展示在文件上传过程中的种种方法与技巧。首先,我们会覆盖现有的文件🗂️,然后尝试获取一个反弹shell🔙。在这个过程中,我们会涉及到webshell的上传和使用,以及如何利用Pentest Monkey🐒等工具来实现目的。🌟🌈 让我们一起探索网络安全的奥秘,迈向黑客大师之路!💪🚀
图文讲解
好的,在这个视频中,我们将讨论一些不同的上传漏洞。我们将做一些文件上传,我们将尝试绕过客户端、服务器端不同的过滤器,以及上传webshell和反弹shell,并检查出一些神奇的字节和不同的方法来绕过文件上传。

因此,我们将在这里对TryHackMe上的上传漏洞进行研究。

我们不打算通过这一切的工作。我已经提前启动了实验室,所以我要把这个复制到这里,我们不打算通过所有这些,比如我不打算阅读方法。这就是我们制作视频的目的,就是向你展示我在做不同的文件上传和开始的方法。我相信这只是启动盒子,阅读一下。我相信,我们实际上要做任何一种利用的第一个地方,将是在覆盖现有的文件。所以我们要继续前进,把这个IP地址粘贴在这里。

而你有所有不同的URL,我们将使用不同的漏洞。所以在你的终端,你可以gedit /etc/hosts文件。

而且我已经在这里粘贴了所有不同URL的IP地址。所以,这样我们就可以访问它们。

如果你在跟随,你也需要这样做。所以现在我们可以直接过来查看这个覆盖,并在一个新的标签中打开它。我们要做的是,如果你回来读这个,我们将有张图片,我们需要用一个不同的文件覆盖它。我相信它将使用一个JPEG,它说查看页面源,它是一个JPEG,它将在图像和山脉中找到。所以我们有完整的路径,稍后我们将需要它。

所以我们可以做的第一件事是尝试上传JPEG文件。所以我们会抓一个并把它移到我们的桌面上。所以我们可以直接输入locate,我们只需要一个JPG。
locate jpg

所以JPG并且我们有一大堆的他们在这里。

所以我们就把这个复制到我们所在的地方,我们可以粘贴,我们将复制到我们的当前工作目录。这就是这里的句号所代表的意思。所以现在如果我们输入ls,我们应该有这个sample.jpg在这里。

所以现在我们可以选择文件。我们将抓取一个JPEG样本,我们将打开它。而如果我们上传这个,它应该告诉我们,它上传成功。


如果你还记得,他们被找到了,图像在图像中被找到。然后我们上传了 sample.jpg。我们这样做是为了检查以确保我们的文件确实上传了,而且确实上传了。

所以现在我们需要做的就是改变我们文件的名称。所以我们有JPEG样本在这里。而我们要做的就是输入mv。我们将mv sample.jpg。我们要把它改成那个文件的名字是什么?mountains,mountain.jpg。

我们就在这里抓取这个完整的名字。所以我们要正确地拼写它。然后我们把它粘贴进去。所以这应该为我们改变。

所以现在是mountain.jpg。而要覆盖这个文件,我们只需要上传我们的文件,名称完全相同。

我们应该能够上传。它说我们覆盖了这个文件。


恭喜我们。它给了我们flag。


你可以复制这个,并把它粘贴到这里,如果你正在跟着做。但现在我们想尝试获得一个反弹shell。所以我们实际上被告知,我们要做的下一件事是获得远程代码执行。如果你真的想得到这些flags,你可以在这里打开这个shell页面。我就在这里继续执行代码,因为这两个都没有任何过滤绕过,而且那个已经打开了。

所以我们要上传一个shell。我们要用两种不同的方法来做这个。你会看到人们最常见的是以webshell的形式上传shell。然后他们会测试它。然后他们会上传一个shell,通常来自Pentest Monkey,如果你在看任何一种CTFS。这就是你通常要看到的完成方式。所以我们要做两种方式。所以我们要做的第一件事就是去谷歌,然后我们要输入web shell PHP而我们要在这里寻找sushant747。

我们就在这里复制第二个。

这样,它允许我们传入一个参数,并实际询问命令,而不是这里的我们必须每次都改变whoami。所以现在我们可以用gedit,我们要做一个叫web.php的文件。
gedit web.php

这将是我们的webshell。

然后我们就可以关闭这个文件了。我们可以选择一个文件,上传我们的webshell,然后点击上传。

它告诉我们,我们已经覆盖了这个文件,这很好。我们其实不需要太担心这个问题。我们可以去/images路径。现在我们要看一下我们的webshell。所以,如果你还记得以前,我们去查看了我们的文件,它被称为 sample.jpg。而我们的页面就在这里。但我们想进入我们的webshell。所以我们可以进入web.php。这里什么都没有。而这是因为它事实上正在执行我们的代码。所以我们可以加一个?cmd=whoami。它将告诉我们,我们是在www-data。

所以现在我们在这里有了注入。我们实际上可以继续前进并获得一个反弹shell。所以我们在终端有一个shell。我们点击COMMAND T,建立一个新的标签,把它放大。然后我们要输入
nc -lvnp 4444
这将使我们能够抓取连接回来。

现在我们可以到这里来输入bash reverse shell

并且PayloadsAllTheThings应该对我们有用。我们将使用Bash Tcp。

我们就用这里的这个。所以我想我们要做的是在中继器中捕获这个。所以我们会回到这里。所以我们就在这里点击回车。我们可以把它发送到中继器,让它继续前进。

现在我们要做的是把我们刚刚复制的反弹shell粘贴进去。而我们要做的是编辑这个。我们正在监听 4444 端口。我的IP地址是10.2.1.182。我们可以在这里突出整个事情,

如果你是在Mac上,可以点击Control-U,进行URL编码。发送它,它说OK。

但如果我们回到我们的终端,我们看到什么也没有发生。它只是在监听。所以我们需要做的是取消URL编码。我们可以一次性重做整个事情。所以Control-Shift-U。

我们将需要输入bash-c来让它执行我们的小反弹shell有效载荷,就在这里。

所以我们要把它放在引号里。现在,如果我们重新对这个URL进行编码

并发送它,它应该为我们挂起了。

所以我可能有一个打字错误,因为它还在监听。

所以bash-c,我看到了我的问题。这是bash,不是batch。

所以现在如果我们重新发送这个,它就挂在这里了。

而我们有一个反弹shell。

那么输入whoami

而我们在这里的系统上。所以我们在这一点上可以做的是退出(exit)。所以这就是使用webshell获得反弹shell的一种方法。但我们也可以使用PayloadAllTheThings。我们使用Pentest Monkey,但我们将使用Pentest Monkey来做一个PHP反弹shell。并且Pentest Monkey通常是在学习获取反弹Shell或CTF时看到的PHP最常见的反弹Shell。

所以,Command-A, Command-C
然后输入gedit我们就叫它shell.php,

把它粘贴进去。

我们需要改变我们的IP地址。所以是10.2.1.182。而且我们还需要将我们的端口改为4444。

我想我删除了这些引号。而我们将覆盖之前的shell,只需上传一个完全相同的名字。

让我们来试一试。所以如果我们说/images/shell.php,我没有启动我们的Netcat监听器,我们需要这个监听器来让它工作。

所以让我们再试一下。它被挂起,我们得到一个shell回来。
那么输入whoami

而我们又回到了机器上。所以现在让我们退出这个,让我们试试更有挑战性的东西。所以如果我们回到TryHackMe,有一个要做一些过滤。所以绕过客户端过滤,它将告诉我们,如果我们检查页面,我们需要把它上传为什么。而且我相信它实际上告诉我们需要用什么来绕过过滤。所以我们将使用这个shell.php。他们实际上是在使用Pentest Monkey shell,我想我们可以用它来代替我们的web shell。但我认为我们要使用我们的web shell,因为它很简单,而且我们不需要每次都使用Netcat监听器。所以让我们继续前进,给这个一个尝试。让我们在这里把它打开。

让它加载。我们准备选择一个文件。

Web shell就在这里。
打开。无效文件。它是否接受JPEG?

无效类型。

让我们试试sample.png。

所以我们能够使用PNG。

所以有几种不同的方法我们可以尝试绕过这个。第一种方法是要到这里来,让我们实际上只是把名字改成我们的反弹shell。所以我们将改变我们的反弹shell名称,web shell,我们将改变它为web.png。

就像这样。我们将继续前进并点击回车。

让我们回来看看我们是否可以选择这个文件。

它在说这是可以的。开启我们的拦截器。

上传。而且我们应该可以把这个改成只用PHP,绕过客户端。


让我们看看这是否有效。文件上传成功。

让我们来看看。那是存储在图像中的吗?我知道它告诉我们,我们必须在某些时候模糊这个,以找到正确的目录。我并不真的想去模糊测试它。

这就是我们的webshell。

这次我们不必再做模糊测试了。所以,如果我们?cmd=whoami,我们就会得到www-data。

所以我们能够绕过这个特定挑战的过滤器,只需将web.php改为web.png。
它绕过了客户端的过滤器。我们在这里是使用的burp捕获的,实际上我们并没有把它发送到中继器上。
但如果你想的话,你可以把它发送到中继器上玩一下。所以你可以做的是选择你的文件,web.png,

打开拦截,

把代理打开,然后上传。

而你要做的是把这个发送到中继器上。

现在你会在这里得到它。假设web.png不起作用。你可以输入web.php,也许它只是想让这个png出现在标题中。

或者我们可以用php5或其他的东西来让它运行。

所以有时候把这个发送到中继器上是很有帮助的,这样我们就有了,在接下来的几个挑战中,我们可能要做的事情很快就来了。所以这是绕过了客户端的过滤。
下一个是文件扩展名。让我们看看这个有什么用。就在这里,你实际上看到了我刚才给你看的东西,jpg.php。

而且他们实际上有一堆php扩展名列在这里。所以,如果php不工作,你可以尝试phtml,php3,php5是一个你可能会但在CTF比赛中你最有可能看到的是php5。

因此,让我们继续并关闭这个。我们将打开下一个网页,我们将上传利用。这一个基本上会非常CTF与这个小文件上传命令提示我们在这里。我想他们这样做只是为了改变一下。但我们可以做的是,你只需键入select,

我们可以尝试一个png。

然后你只需键入upload。

然后它就会运行并显示文件上传成功。

我们将需要找到这些文件的存储位置。所以我们可以摸索这个,然后再回去。让我们对这个特定的页面进行模糊处理,以确保我们能够找到正确的位置,文件将被送往。因此,粘贴和我们可以我们可以尝试/images。

我不相信/images会在这个问题上起作用。

是的,看到它没有找到。所以我们可以试试assets。让我们复制这个粘贴,我们有一个php。


我们把它保存为什么?是 sample.png 吗?而且我们被转发到一个不同的页面,似乎不是它。让我们试试/privacy,

里面有我们的sample.png。

所以,现在我们知道这是上传到哪里,

我们可以看看我们是否可以上传一个反弹shell。因此,让我们通过看看我们这里的情况来试一试。所以我们有我们的webshell。让我们继续前进,把它移回来。所以把web.png移到web.php,然后我们保存它。
mv web.png web.php

让我们试着上传它,所以我们会去选择,我们要web.php。

让我们在这里使用burp捕获它,输入上传。我们要把这个发送到一个中继器。

如果我们把拦截器关掉再回来,


它就会告诉我们文件类型是无效的。

所以让我们通过去(修改)我们的文件类型来试一下。我们可以试试我们之前所做的,输入png.php并发送这个,

如果我们回到这边的页面,这个页面上有我们上传的东西,/privacy 它确实没有显示出来。

所以我们可以试试php5,然后发送这个。

让我们刷新页面,看起来我们的webshell就在这里。

所以如果我们输入?cmd=id,我们会得到www-data。

所以我们能够通过使用php5来绕过这个过滤器。我不知道我们是否真的需要png。

我们也许可以发送这个,并绕过它,只是在没有png的情况下,它确实工作。你甚至不需要png在那里,以便让这个特定的shell上传。你只需要php5。所以让我们继续前进,看看下一个。

所以我们将滚动起来,我们可以关闭这个。我想我们是在神奇的数字上。所以我们在这里有一个神奇的字节,你可以在文件的顶部使用,改变文件类型。

所以,如果我们像这样,我们输入file,我们使用我们的webshell,它会告诉我们这是一个php脚本。

但如果我们输入file sample.png,它就会告诉我们这是一个png图片。

所以我们在这个问题上需要做的是使用神奇的字节,以便让我们的shell正确上传。它告诉你如何找到它们,你可以用它们做什么,然后我们应该拿到flag。所以让我们继续,打开名为魔术的那个,关闭它,让这个打开。然后它告诉我们魔法数字,选择一个文件,然后它说上传。所以让我们试着复制一个sample.png。所以sample.png,打开,上传。它说只有gif。所以我们需要抓取一个gif。所以我们可以直接输入locate gif,这不是我想要的,输入locate gif,我把这个完全打反了。

让我们继续并复制这个。所以有时当你做神奇的字节,让我们去复制,我们需要到这个的开头,我们要输入cp,我们需要回到结尾到当前的位置,这叫做internet.gif。因此,我们来到这里,我们实际上是在我们得到之前,我将告诉你一个寻找魔法字节的方法,就是来到谷歌,输入魔法字节(magic bytes)。所以你可以直接输入magic bytes for png或任何你想使用的东西。我们会复制这个,我们会去谷歌,因为我不小心关闭了使用这个作为搜索栏。你可以看到,你会有这些签名在这里。

但我们要使用的是一个GIF。因此,我们实际上可以直接在这里复制这个。我将告诉你为什么这对GIF有用。所以,如果我们来到这里,我们只是使用cat显示这个文件,你不能阅读它。

而我们可以在这个文件的顶部找到的,实际上,因为这已经花了一段时间,我们将gedit编辑它

因为这将打开这到顶部。

我们在这里有这个,这个GIF87a5。而我们在这里的是这个GIF87a。

所以我们实际上可以在这里复制这个GIF87a5。所以我将继续并复制它。我们可以用它作为我们的魔法字节。所以,如果我们记得我们在这里的情况,如果我们在Web shell上输入文件,它会告诉我们这是一个PHP脚本。但是,如果我们使用gedit编辑它,

我们编辑我们的PHP脚本,

我们粘贴在这些神奇的字节,我们保存这个。

你现在可以做的就是在这上面输入file,它就会告诉我们现在它是个gif。

所以理论上它应该告诉我们这是个gif文件,并允许我们的PHP webshell上传。所以你可以上传这个文件,它告诉我们文件上传成功。现在,在很多CTF中,一半的战斗只是找到我们的文件实际上传的位置,这往往是一个问题。所以让我们继续吧。我们已经有了images,输入/images。我也许应该启动Fuff,这样我们就可以在尝试和猜测时真正找到它。让我们复制这个

复制并运行它,

这样我们就可以在运行时回来这里猜测。而且我们可以直接输入uploads,这总是一个很好的猜测。而这并不奏效。

所以让我们看看是否有什么东西出现了。graphics是一个新的目录。所以我们来试试/graphics。

粘贴它。说是禁止的。

让我们实际试试我们的web.php。所以我们得到了我们的gif,但实际上我们没有得到我们的shell回来。

所以让我们继续尝试一下,输入?cmd=ls。然后我们得到web.php。

因此,如果我们输入一个id,它将告诉我们,我们是www-data。

所以,这是几个不同的方式去利用文件上传。
如果你有任何问题,或在这个视频中的任何东西是不清楚的,或者您想让我更深入地讲解也许解释更多的细节,那么您可以在评论区告诉我,我们会做一些更多的文件上传在不久的将来。
谢谢你的观看。