文件上传漏洞详解与upload靶场的练习


参考“在下小黄”原创文章

文件上传漏洞详解

1.漏洞原理

在文件上传的功能处,若服务端脚本语言 未对上传的文件进行严格验证和过滤 ,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。文件上传漏洞对Web应用来说是一种非常严重的漏洞。一般情况下,Web应用都会允许用户上传一些文件,如头像、附件等信息,如果Web应用没有对用户上传的文件进行有效的检查过滤,那么恶意用户就会上传一句话木马等webshell,从而达到控制web网站的目的。

文件上传漏洞是指

用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。一般都是指“上传Web脚本能够被服务器解析”的问题。

2.高危出发点

相册、头像上传 视频、照片分享 附件上传(论坛发帖、邮箱) 文件管理器

3.成因以及危害

成因:
在这里插入图片描述
危害:

可能会导致用户信息泄露,被钓鱼,甚至使攻击者可以直接上传WebShell到服务器,进而得到自己想要的信息和权限。最终达到对数据库执行、服务器文件管理、服务器命令执行等恶意操作,甚至完全控制服务器系统。

4.webshell

参考文献点此处

1.什么是webshell

WebShell , 简称网页后门。简单来说它是运行在Web应用之上的远程控制程序。

webShell其实就是一张网页,由PHP、JSP、ASP、ASP.NET等这类web应用程序语言开发,但webShell并不具备常见网页的功能,例如登录、注册、信息展示等功能,一般会具备文件管理、端口扫描、提权、获取系统信息等功能。

2.常见的webshell

  • 大马、小马、各种马…等

  • 拥有较完整功能的webshell,我们一般称为大马。

  • 功能简易的webshell称为小马。

  • 除此之外还存在一句话木马、菜刀马、脱库马等等的名词,是对于webShell功能或者特性的简称。

upload靶场练习

参考文章

第一关(前端验证)

1.本题使用Javascript代码进行过滤,禁用网站的Javascript权限即可完成绕过
在这里插入图片描述
F12–调试器–设置-禁用javascript
在这里插入图片描述
2.随便建一个文档上传

在这里插入图片描述

第二关(mime验证)

1.通过源代码可以发现,这一关是常见验证中的文件类型验证,也就是验证mime信息
在这里插入图片描述
2.进行抓包,将Content-Type修改为允许上传的类型(image/jpeg、image/png、image/gif)三选一
在这里插入图片描述
在这里插入图片描述
3.查看回显。发现上传成功
在这里插入图片描述
4.改包后返回服务器
在这里插入图片描述

第三关(黑名单验证)

1.通过源代码判断是黑名单验证
在这里插入图片描述
2.黑名单是规定不允许上传的文件,但是如果黑名单定义不完整的话是可以实现绕过的,用.phtml .phps .php5 .pht进行绕过

上传php5文件
在这里插入图片描述

第四关(htaccess攻击)

1.黑名单限制了极大部分后缀

这种情况,我们可以尝试上传一个.htaccess配置文件,将4.png图片当作php代码进行解析,首先创建一个.htaccess文件,里面写上代码

Tips:.htaccess:apache服务器配置文件,负责相关网页针对每个目录下的配置,即在一个特定目录下放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。(这里我们利用这个未过滤的文件来上传一个修改后缀的php文件为jpg,然后让服务器去解析)


```sql
<FilesMatch "4.png">
SetHandler application/x-httpd-php

这串代码的意思是如果文件中有一个4.png的文件,他就会被解析为.php,把这个文件上传上去。
在这里插入图片描述

上传上去之后,我们在把图片用记事本打开,里面写上php代码。再进行上传,就完成了一次htaccess攻击

第五关(黑名单验证,.user.ini.)

参考文章
1.上传禁止了htaccess后缀
在这里插入图片描述
但是经过反复观察后,发现没有禁止.php7和.ini文件

关于.ini的知识

.ini , .inc之类的文件,一般是放一些常量或数据库链接语句等,再在需要的页面包含进去,和直接命为 asp 是没什么区别的。

但为了安全性,最好不要用这些后缀名,因为知道文件名时,在浏览器里输入该文件的地址时,可看到所有内容的。

在Windows系统中,INI文件是很多,最重要的就是“System.ini” “System32.ini”和“Win.ini”。

该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。但自从Windows 95的推出,在Windows系统中引入了注册表的概念,INI文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。但在某些场合,INI文件还拥有其不可替代的地位。 .ini 文件是windows的系统配置文件,统管windows的各项配置,一般用户就用windows提供的各项图形化管理界面就可实现相同的配置了,但在某些情况,还是要直接编辑.ini才方便,一般只有很熟悉windows才能去直接编辑。开始时用于WIN3.1下面,WIN95用注册表代替,[ ]及后面的内容表示一个节,相当于注册表中的键。

除了windows很多windows下面的应用软件也有.ini文件,用来配置应用软件以实现不同用户的要求。一般不用直接编辑这些.ini文件,应用程序的图形界面即可操作以实现相同的功能。

什么是GGI,FastGGI?

什么是 CGI
CGI 的全称为“通用网关接口”(Common Gateway Interface),为 HTTP 服务器与其他机器上的程序服务通信交流的一种工具, CGI 程序须运行在网络服务器上。

   传统 CGI 接口方式的主要缺点是性能较差,因为每次 HTTP 服务器遇到动态程序
   时都需要重新启动解析器来执行解析,之后结果才会被返回给 HTTP 服务器。
   这在处理高并发访问时几乎是不可用的,因此就诞生了 FastCGI
   。另外,传统的 CGI 接口方式安全性也很差,故而现在已经很少被使用了。

   什么是 FastCGI
   FastCGI 是一个可伸缩地、高速地在 HTTP 服务器和动态服务脚本语言间通信的
   接口(在 Linux 下, FastCGI 接口即为 socket,这个socket 可以是文件
    socket,也可以是IP socket),主要优点是把动态语言和 HTTP服务器分离开来。
    多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache 、 Nginx 和
     Lighttpd 等。

同时,FastCGI也被许多脚本语言所支持,例如当前比较流行的脚本语言PHP。FastCGI 接口采用的是C/S架构,它可以将 HTTP 服务器和脚本服务器分开,同时还能在脚本解析服务器上启动一个或多个脚本来解析守护进程。

当 HTTP服务器遇到动态程序时,可以将其直接交付给 FastCGI 进程来执行,然后将得到结果返回给浏览器。这种方式可以让 HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高整个应用系统的性能。

2.p.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。

但是想要引发 .user.ini 解析漏洞需要三个前提条件

1.服务器脚本语言为PHP

2.服务器使用CGI/FastCGI模式

3.上传目录下要有可执行的php文件

3.上传一个.ini文件
在这里插入图片描述
.user.ini文件里的意思是:所有的php文件都自动包含666.jpg文件。.user.ini相当于一个用户自定义的php.ini
在这里插入图片描述
然后这里有两个选择
选择一:慢慢的等候5分钟,然后用蚁剑连上去

很抱歉,这里没有成功,日后进行补救,这里采用第二种方法

这一关的思路是它没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .说一下他的验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功。如下图:
在这里插入图片描述
在这里插入图片描述

第六关(通过大写后缀进行上传)

本关没有进行大写的转换,将后缀改为大写即可

在这里插入图片描述

第七关(末尾加空格绕过)

源代码没有对空格进行过滤,加空格进行绕过

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6r1GrdcV-1677927279052)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230228195513536.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sz0IFPu3-1677927279052)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230228205652685.png)]

此处在末尾加空格无用,可能是因为

第八关(末尾加点绕过)

源代码没有对末尾的点进行过滤,加点绕过

第九关(使用::$DATA特殊字符序列进行绕过)

什么是::$DATA?

":: D A T A " 是一个特殊字符序列,是 W i n d o w s 操作系统中的一种文件流表示方法。在 W i n d o w s 系统中,每个文件都有一个默认的数据流,可以通过文件名直接访问该数据流,而 " : : DATA"是一个特殊字符序列,是Windows操作系统中的一种文件流表示方法。在Windows系统中,每个文件都有一个默认的数据流,可以通过文件名直接访问该数据流,而":: DATA"是一个特殊字符序列,是Windows操作系统中的一种文件流表示方法。在Windows系统中,每个文件都有一个默认的数据流,可以通过文件名直接访问该数据流,而"::DATA"则表示文件的默认数据流。

这个特殊字符序列的作用是用于在Windows系统中访问和处理文件的数据流。例如,当我们通过命令行执行"dir /r"命令时,系统会将文件的默认数据流的大小和时间戳信息显示出来。

然而,由于"::$DATA"是一个特殊字符序列,具有一定的操作系统意义,攻击者可能会利用这一点来绕过文件上传的限制,将恶意代码写入文件的数据流中,从而绕过文件类型的限制,实现文件上传漏洞攻击。

因此,在防护文件上传漏洞时,需要特别注意这个特殊字符序列,确保文件名中不含有"::$DATA",避免攻击者利用它进行攻击。

例如,攻击者将一个可执行文件(如.exe)改名为"**image.jpg:: D A T A ∗ ∗ " ,然后上传到你的网站。这时,由于文件名中包含 " : : DATA**",然后上传到你的网站。这时,由于文件名中包含":: DATA",然后上传到你的网站。这时,由于文件名中包含"::DATA"这个特殊字符序列,服务器在检查文件类型时会忽略文件名中的".jpg"后缀,而将其识别为可执行文件,从而成功上传恶意文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcLm224n-1677927279053)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230228211050226.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kue66Lcd-1677927279053)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230228211055785.png)]

第十关(通过strrchr()函数进行绕过)

源代码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

$file_ext = strrchr($file_name, '.');

其中,strrchr()是一个PHP函数,用于查找字符串中最后一个出现的指定字符或子字符串,并返回该字符或子字符串到字符串末尾的部分。在上述代码中,strrchr()函数用于查找上传文件的文件名中最后一个".“字符,并返回该字符到文件名末尾的部分,即文件的扩展名。例如,如果上传的文件名为"example.jpg”,则strrchr($file_name, '.')的返回值为".jpg"。

通过获取文件的扩展名,可以方便地判断文件的类型,从而进行相应的安全检查和处理。通常,在Web应用程序中,我们会定义一些安全规则,例如只允许上传指定类型的文件,不允许上传含有恶意代码的文件等,通过获取文件的扩展名,可以轻松实现这些规则。

先对后缀的最会一个 .(点)进行了删除,

然后再截取了最后一个 .(点) 到字符串结尾的部分,

最后判断截取部分是否在黑名单内。

所以可以构造 .php.空格.(任何值都可)

因为deldot遇到空格时会截止删除

第十一关(末尾加点绕过,或者双写绕过)

1.没有过滤点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdlyXfsq-1677927279053)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230228215226870.png)]

2.sti_ireplace将黑名单中的后缀替换为空,可以使用双写绕过

例如构造 .phphpp

第十二关(GET00%截断)

%00 是 URL 编码的空字节字符,它在一些旧版的 Web 服务器和 Web 应用中会导致文件路径被截断的漏洞,也被称为“空字节截断漏洞”(Null Byte Injection Vulnerability)。攻击者可以利用这个漏洞,将上传的文件名修改为 file.php%00.jpg 这样的形式,以达到上传可执行文件的目的。

在一些 Web 应用中,当服务器收到一个 URL 请求时,它会按照 URL 路径解析请求并提取出文件名。然而,由于 %00 被认为是字符串的结束符,因此当解析到文件名中的 %00 时,它会将其之前的字符串作为文件名进行解析,而忽略掉 %00 之后的内容。这就意味着,攻击者可以通过在文件名中插入 %00 字符,截断服务器解析路径,从而达到修改上传路径的目的。

例如,如果上传的文件名为 file.php%00.jpg,那么一些 Web 应用会将其解析为 file.php,而后缀 .jpg 则被忽略。如果上传路径为 uploads/,那么最终上传的位置就会变成 uploads/file.php,从而导致上传可执行文件成功。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ScTLc9O-1677927279053)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230301163931985.png)]

第十三关(POST00%截断)

抓包即可,和上一关一样

第十四关(上传图片马)

1.构建图片马

这里尝试使用空图片发现无法上传,使用有内容的文件后可以进行上传

以管理员模式运行终端,并且进入存放木马文件和图片文件的文件夹下

输入

copy 1.jpg/b + 2.php/a c,ipg

/b表示二进制打开文件,/a表示以ASCLL方式打开

注:

单纯的图片马并不能直接和蚁剑连接,因为该文件依然是以image格式进行解析,只有利用文件包含漏洞,才能成功利用该木马。

所谓文件包含漏洞,是指在代码中引入其他文件作为php文件执行时,未对文件进行严格过滤,导致用户指定任意文件,都作为php文件解析执行。

2.进行文件包含漏洞,打开文件以执行php代码的注入

直接查看页面源代码,找到图片路径即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L2B3jijc-1677927279053)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230301185046143.png)]

第十五关(上传图片马)

移除了jpg格式,按要求格式制作图片马上传即可

第十六关

上传文件后白屏le

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2yhfWioH-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230301204602171.png)]

第十七关(二次渲染绕过)

  • 什么是二次渲染:在我们上传文件后,网站会对图片进行二次处理(格式、尺寸要求等),服务器会把里面的内容进行替换更新,处理完成后,根据我们原有的图片生成一个新的图片并放到网站对应的标签进行显示。
  • 文件检测是先保存后检测,文件不合法再进行删除。
  • 上传过程:利用010或者winhex在gif图片末尾添加一句话,上传后比较图片发现后面的一句话没有了,查找其他位置,发现未改变的地方,在该处添加后门
  • 判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,最后再做了一次二次渲染上传的图片。绕过方法:找到渲染前后没有变化的位置,然后将php代码写进去,就可以上传带有php代码的图片。

第十八关(条件竞争)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DK5zOUsL-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302095306488.png)]

本Pass先创建了一个只包含图片文件的白名单,随后提取出文件的后缀名,将文件移动至上传目录后再判断是否合法,不合法就删除。我们可以使用条件竞争方法(即在文件被删除之前访问该文件)绕过。此方法需要不停且迅速地上传、访问文件。我们使用BurpSuite和Python进行上传和访问。

1.上传后使用BurpSuite截包,按Ctrl+I发送至Intruder,设置Payload type为Null payloads,Payload Options设置为Continue indefinitely

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7N5S7OPe-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302102519604.png)]

第十九关(上传到根目录)

本Pass做了白名单校验,文件上传后先保存在对象中,随后对文件进行判断存在、检查扩展名、检查大小、重命名、移动操作,没有判断文件头和二次渲染。我们可以使用图片木马配合文件包含漏洞进行绕过。(虽然进行了移动和重命名,但是网页会回显地址)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YEnp8iG0-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302104009382.png)]使用文件包含漏洞访问该文件(本Pass将文件上传至根目录下)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c1cTq4J1-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302103707942.png)]
在这里插入图片描述

第二十关(/. 或./绕过)

利用了windows特性结合move_uploaded_file()成功处理/.的问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JecU0MNV-1677927279054)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302104307364.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L4FtKyfy-1677927279055)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302112315497.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7WBGXVk-1677927279055)(C:\Users\35575\AppData\Roaming\Typora\typora-user-images\image-20230302104330390.png)]

在文件名前加./和后缀后加/都可以达到绕过的效果,这是因为这两种方式都利用了Windows文件系统的一个特性,即路径解析的规则。

在Windows文件系统中,路径中的斜杠(/或)可以互换使用,并且在路径的最后面添加一个斜杠是可以被系统自动省略的。因此,如果在文件名前加上./或在文件名后面加上/,系统在解析路径时会把它们当成路径中的一部分,最终得到的路径和不加这些符号是相同的,因此也能够正常地被move_uploaded_file函数处理。

例如,假设上传的文件名为example.jpg,上传路径为/uploads/,那么以下两种路径都可以被系统正确解析,从而绕过文件上传限制:

  • /uploads/./example.jpg:系统在解析路径时会把./当成当前目录,最终得到的路径为/uploads/example.jpg。
  • /uploads/example.jpg/.:系统在解析路径时会把/当成文件夹分隔符,最终得到的路径为/uploads/example.jpg。

需要注意的是,这种绕过方式并不适用于所有情况,因为有些服务器端会对路径进行额外的检查,例如检查路径是否包含特殊字符或是否超出了文件系统的限制等。因此,开发人员在编写上传文件功能时,应该使用更加严格的路径解析方式,例如只允许特定的文件夹或使用正则表达式匹配文件名等,来防止文件上传漏洞的发生。

利用了Windows特性结合move_uploaded_file()成功处理"/.“的问题,是因为在Windows操作系统下,”.“和”…“是特殊的文件夹名字,”.“表示当前目录,”…“表示上级目录。由于在Windows下,文件夹名字中不允许包含”.“和”…“,因此move_uploaded_file()函数在处理以”/.“结尾的文件名时,会将”/.“视为单独的文件名,而不是”.“和上级目录”…",从而成功绕过了文件上传检测。

当上传的文件名以斜杠 (/) 开头时,它被视为绝对路径,而不是相对路径。这意味着 move_uploaded_file() 函数会将文件移动到指定的绝对路径,而不是相对于当前工作目录的路径。

在某些情况下,这可以用来绕过文件上传漏洞的保护措施,例如当程序对上传文件名做了限制时(如只允许特定扩展名或特定字符集),可以将文件名设置为 /./filename.php,从而绕过限制。此时,程序会将该文件视为相对路径的 filename.php,但是 move_uploaded_file() 函数会将文件移动到指定的绝对路径中,导致上传的文件实际上被保存到了非预期的位置。

在这种情况下,我们使用move_uploaded_file()函数将文件移动到预期的位置,Windows会将/.\解释为当前目录

第二十一关(构造数组绕过)

  • 首先使用白名单判断文件MIME类型必须为数组中的图片类型
  • 检查文件名如果不是数组使用explode分割成数组
  • 提取上传文件名的最后一后缀,再次白名单判断保存文件名是否为图片;
  • 文件名返回数组中第一个元素并输出文件名,如果没有定义数组的话则输出后缀
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值