^-^
I am who I am.
Upload Labs
  1. 漏洞概念
  2. 漏洞原理
  3. 漏洞危害
  4. upload-labs过关记录
    1. 第一关:绕过前端检测
    2. 第二关:MIME绕过
    3. 第三关:黑名单限制不全
    4. 第四关:.htaccess 绕过
    5. 第五关:上传.user.ini文件
    6. 第六关:大小写绕过
    7. 第七关:空格绕过
    8. 第八关:点绕过
    9. 第九关:双写::$DATA绕过
    10. 第十关:针对代码逻辑的绕过
    11. 第十一关:双写绕过
    12. 第十二关:白名单,%00截断
    13. 第十三关:白名单,00(hex)截断
    14. 第十四关:上传图片马
    15. 第十七关:图片马之二次渲染
  5. upload-labs靶场实操总结
  6. 引用github上的本项目的两张图
    1. 漏洞类型分类
    2. 如何判断上传漏洞类型

本文记录川大网安23暑期实训内容中的文件上传漏洞实验部分。

漏洞概念

文件上传漏洞(File Upload Vulnerability)是一种常见的网络安全漏洞,它通常出现在允许用户上传文件的Web应用程序中。这种漏洞可能允许恶意用户上传包含恶意代码的文件,从而使攻击者能够执行各种恶意活动,比如执行任意代码、获取敏感信息、篡改网站内容或攻击其他用户。

漏洞原理

漏洞的原理在于,应用程序未正确验证和限制用户上传的文件类型、大小和内容,或者未对上传的文件进行充分的检查和过滤。攻击者利用这个漏洞,可能会上传各种类型的恶意文件,如:

可执行文件:例如恶意脚本、木马、后门程序,允许攻击者在服务器上执行任意代码。

Web Shell:用于在服务器上执行命令并获取控制权的恶意脚本。

恶意文档:包含宏病毒的文档,可能感染用户系统并传播恶意代码。

恶意图片:利用图片解析漏洞进行攻击,例如通过包含恶意脚本的图片进行跨站脚本攻击(XSS)。

伪装文件:攻击者可能上传伪装成其他类型文件的恶意文件,绕过安全检查。

漏洞危害

文件上传漏洞的危害在于允许攻击者上传包含恶意代码的文件至服务器,导致执行任意代码、获取敏感信息、篡改网站内容或攻击其他用户。攻击者可上传恶意脚本、后门程序或Web Shell,获得服务器控制权,危及整个系统安全。此外,攻击者还可上传恶意文档感染用户系统,或通过恶意图片实施XSS攻击。

upload-labs过关记录

https://github.com/c0ny1/upload-labs

第一关:绕过前端检测

此关卡仅在前端验证文件的类型,故可以先将webshell.php文件的后缀改为可以通过检测的后缀,比如jpg, png等。再使用burpsuite抓取上传文件的数据包,此数据包已经通过了前端的验证,故我们可以直接对数据包进行修改,在包中将文件的后缀改回php,此时再点击发送数据包即可将webshell.php文件成功发送至服务器。

1-1

也可以打开浏览器的开发者选项,勾选禁用JavaScript,这样也可以使前端的验证失效,此时直接上传webshell.php即可。

第二关:MIME绕过

检查Content-Type标头是否与MIME 类型匹配。

在Web上,MIME类型通常在HTTP头中使用,指示要发送的资源的内容类型。MIME类型由一个字符串组成,例如”image/jpeg”表示JPEG图像文件,”audio/mp3”表示MP3音频文件,”text/plain”表示纯文本文件等。每种MIME类型都对应于一种特定的文件类型或数据格式。

我们仍可以通过burpsuite抓取上传文件的数据包,通过修改文件头的Content-type,达到绕过的目的。

2-1

第三关:黑名单限制不全

后端使用了deny_ext黑名单的阻挡方式。

3-1

我们可以通过使用一些非常规的但是可以执行的后缀名来绕过,比如php5、php3等。但是由于phpEvn的配置问题,无法执行php5和php3后缀的文件。于是采用双写绕过的方法上传木马文件。

如果文件名为”abc.txt::$DATA”,在Windows中,该文件名将被视为使用了”文件流”功能。这意味着你在为”abc.txt”这个文件添加了一个名为”::$DATA”的额外数据流。

文件流功能允许在一个文件中存储多个数据流,每个数据流都有自己的名称。默认数据流就是文件的主要数据,如果创建了额外的数据流,它们可以通过附加名称来引用。在这种情况下,”abc.txt::$DATA”表示的是文件”abc.txt”的额外数据流,而不是文件的默认数据。

通常Windows会尝试自动处理这种情况并将文件名恢复为”abc.txt”。这是因为”::$DATA”是一个特殊的标记,表示额外的数据流,而不是常规的文件名。

分析代码可以发现,后端会检测是否存在::$DATA,如果存在则会去除,但是由于去除的代码仅去除一次,所以可以使用双写的方式来绕过,即去除掉::$DATA后剩余部分又拼接成了::$DATA。

故我们先抓取上传文件的数据包,将文件名改为webshell.php::$DA::$DATATA,这样上传到服务器后,服务器会去掉一个::$DATA,此时上传的文件名为webshell.php::$DATA,然后windows又会再进行处理一次,将::$DATA去除,所以webshell.php就被成功上传至服务器了。

3-2

第四关:.htaccess 绕过

实践时候由于配置差异无法成功。

第五关:上传.user.ini文件

后端使用了数量更多的黑名单,无法上传类似php3,htaccess类型的文件,但我们仍可以上传.user.ini文件,改变服务器上执行php文件的配置。

在 PHP 中,”.user.ini” 是一种用于配置用户级别的 PHP 设置的文件。它类似于常见的 “.htaccess” 文件,但主要用于 PHP 相关的设置。这个文件允许用户在其网站的目录级别上设置 PHP 配置选项,以便对特定目录或应用程序进行自定义设置,而不影响其他目录或全局设置。

auto_prepend_file 是 PHP 的一个配置选项,用于指定在每个 PHP 文件执行之前自动包含(预加载)的文件。这个配置选项允许你在所有 PHP 文件执行前,自动包含一个指定的文件,无需在每个 PHP 文件中手动添加 include 或 require 语句。

使用 auto_prepend_file 配置选项可以方便地在全局范围内引入一些常用的函数、类、或者设置一些全局变量。这样,这些文件中的内容会在每个 PHP 文件执行之前自动加载,确保这些公共的功能在整个项目中都可用。

auto_prepend_file 配置选项所指定的文件在每个 PHP 文件执行前会被自动加载和执行。这意味着预加载文件中的代码会在每个 PHP 脚本执行之前被执行。

于是我们先上传一个.user.ini,内容中有auto_prepend_file,指定某一个内容中有木马代码的文件。

5-1

shell.jpg是木马文件webshell.php改完后缀的名字,这样改是为了突破后端的检测。

5-2

此时,由于有.user.ini的设置,每执行一个php文件前都会预先加载执行shell.jpg,并且是以php方式执行,shell.jpg的内容仍是php木马,故仅需要点击readme.php即可触发该木马。

5-3

第六关:大小写绕过

经过简单的代码审计之后发现该文件上传系统的后端并没有对后缀的大小写进行处理,故我们直接上传webshell.Php即可通过检测。

6-1

第七关:空格绕过

经过简单的代码审计可以发现,该文件上传系统的后端并没有对文件后缀的空格进行处理,故我们可以在后缀加上一个空格,这样我们的后缀就为’php ’,后端的黑名单只能匹配’php’,所以会让后缀多一个空格的’php ’文件通行。

7-1

此时操作系统接收到文件后会自动将末尾的空格去掉,实际上放在操作系统中的文件仍是’php’后缀,可以被执行。

7-2

第八关:点绕过

进行简单的代码审计可以发现,上传系统的后端检测并没有删除文件扩展名后的点。然而对于Windows操作系统来说,如果点后无内容,Windows会自动将点删除。

所以我们可以通过burpsuite抓包,然后在文件名后加点来绕过检测。

8-1

第九关:双写::$DATA绕过

通过简单的代码审计可以发现,该上传系统的后端检测未对::$DATA进行处理,故我们可以通过burpsuite抓取上传的数据包,在数据包中修改文件的名字,在后缀加上::$DATA,这样后端检测系统就会认为后缀为php::$DATA,这样即可绕过黑名单。但是在操作系统拿到文件后会自动处理掉::$DATA,所以最终存储在服务器上的仍是php后缀的文件,可以被执行。

9-1

第十关:针对代码逻辑的绕过

经过简单的代码审计,发现该文件系统对后缀的处理过程为:先删除文件末尾的点,然后转换大小写,去除::$DATA,首尾去空。

存在一个漏洞,即删除点和空格的操作只进行了一次。该删除点的函数逻辑为:函数从末尾向前检测,检测到第一个点后,会继续向前检测,但遇到空格会停下来。可以构造一个特定的后缀,使其经过删点操作和首位去空的操作后后缀为’php.’。

所以我们使用burpsuite抓取上传文件的数据包,修改上传文件的后缀,改为’php. .’。这样在经过后端的处理流程后,文件后缀变为’php.’,仍然可以通过黑名单。

10-1

第十一关:双写绕过

经过简单的代码审计,发现该文件系统对后缀的处理过程存在str_ireplace函数,先检测后缀里有无黑名单内的字符,如果有,则将该字符缀替换成空。但漏洞为,str_ireplace只运行了一次,所以我们可以构造一个经过替换之后的其余部分拼接在一起仍可以为php的文件后缀。

所以我们使用burpsuite抓取上传文件的数据包,将后缀改为’.phphpp’,使用双写绕过后端检测,这样经过后端的str_ireplace后会删除php,那么剩余的部分平凑在一起后仍为’.php’。

11-1

第十二关:白名单,%00截断

条件:php版本 < 5.3.4 ; magic_quotes_gpc=Off

本关卡采用白名单的方式进行过滤,只接受jpg,png,gif的后缀文件。

通过代码审计,可以发现上传路径save_path是从前端GET方法传入的。我们可以通过通过修改save_path,加入%00对其截断。

在计算机编程和网络通信中,”%00” 表示空字节(Null Byte),也称为空字符或零字节。它是 ASCII 编码中的控制字符,其十六进制值为 0x00。在字符串中,它表示一个空字符或字符串的结尾。

使用burpsuite抓取上传的数据包,使用%00将路径截断。这里用%00截断是因为,url栏会将%00转码成空字符。实际上是用空字符截断。

12-1

第十三关:白名单,00(hex)截断

与第12关类似,同样也可以通过使用类似’%00’截断的方法。但是第12关是使用GET方法从前端获得save_path,本关卡是使用POST方法获得save_path。

所以我们仍使用burpsuite抓取上传文件的数据包,在data体中将save_path使用空字符截断。在这里截断不用’%00’,因为这里是请求中的data体,不会被编码成空字符,直接在Hex模块下,将路径upload/webshell.php后面的一个字节改为00(hex)即可。

13-1

第十四关:上传图片马

本关卡的要求是上传图片马。

图片马的攻击方式通常涉及利用恶意构造的图像文件,通过构造恶意图像文件,攻击者可能成功执行任意代码、进行远程命令执行、绕过安全措施或获取未授权访问权限等。

本网站还存在一个 include.php漏洞文件。构造:include.php?file=upload/shell.jpg ,include 会以本文的形式读取shell.jpg的内容,这样存在于shell.jpg里的一句话木马就可以执行

首先使用cmd命令将恶意代码和正常图片融合。

14-1

然后将生成的jay1anshell.png上传至服务器。

然后浏览器输入http://jay1an.uploadlabs/include.php?file=图片马的路径’,即可成功执行图片中的恶意代码。

14-2

第十五、十六关均为上传图片马,步骤同上。

第十七关:图片马之二次渲染

通过对比上传后的文件和原文件后发现两者的大小不一致,则判断这里存在图片二次渲染。

可以通过多次上传,测试图片的渲染后没有修改的位置,然后再将恶意代码添加进去,避免恶意代码被渲染掉,这样就可以利用文件包含漏洞去执行恶意代码了。

这里直接采用老师给的成品图片,恶意代码部分不会被渲染掉。

16-1

执行效果如下:

16-2

upload-labs靶场实操总结

upload-labs包含了前端绕过、php3/php5绕过、.htaccess绕过、MIME绕过、.user.ini绕过、点绕过、空格绕过、双写绕过、::$DATA绕过、路径截断、图片马等方法上传将恶意代码上传至服务器。

通过本次的upload-靶场实操,我学习到了以下几个方面:

文件类型检查: 在实战中,需要仔细检查应用程序对文件类型的检查机制。有些应用程序仅通过文件后缀名来验证文件类型,这是不安全的,因为攻击者可以伪造文件后缀名。正确的做法是结合文件的MIME类型和文件内容来进行验证。

文件名截断漏洞: 有些应用程序在保存上传的文件时,可能会截断文件名,导致文件名和实际内容不一致,从而可能引发安全问题。在实战中,需要注意是否有可能利用文件名截断漏洞绕过文件上传的限制。作为服务器方,对于文件名,应该进行字符过滤和验证,只允许特定的安全字符和常见的文件名字符。禁止或过滤特殊字符、路径分隔符和敏感字符,以防止攻击者利用特殊字符绕过文件名验证。另外还可以对于文件名中的特殊字符或非ASCII字符,应该进行适当的编码。这可以帮助确保文件名不会被解释为路径或执行代码。

文件内容检查: 在实战中,要注意应用程序对上传文件内容的检查。有些应用程序可能仅验证了文件类型,但没有检查文件内容,导致可以上传包含恶意代码的文件。

双重扩展漏洞: 双重扩展漏洞是一种利用应用程序对文件扩展名处理不当的漏洞。攻击者可以上传带有双重或多重扩展名的文件,绕过文件类型检查。若服务器的策略是检测非法字符然后删除,那么应该在删除后再次检测,使用while逻辑,而不是if逻辑,这样可以避免双写绕过。当然也可以使用转义来防范双写绕过。

上传绕过技巧: 在实战中,可以利用各种上传绕过技巧,如图片木马、绕过前端验证、构造特殊文件等,来成功绕过文件上传的限制。

安全的文件上传策略: 在实战中,需要学习和了解安全的文件上传策略,包括文件类型验证、文件内容验证、文件存储路径、访问控制等,以防止文件上传漏洞的发生

引用github上的本项目的两张图

漏洞类型分类

sitefromgithub-1

如何判断上传漏洞类型

sitefromgithub-2