文件上传漏洞研究绕过(一)

huangxin0506 2024-8-12 702 8/12

文件上传漏洞研究绕过(一)

1 客户端检测

   1.1 客户端校验:

一般是在网页上写一段Js脚本,用Js去检测,校验上传文件的后缀名,有白名单也有黑名单

        黑白名单机制:

黑名单:不允许上传什么
白名单:只允许上传什么
白名单比黑名单更安全

    1.2 判断方式:

         在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包,所以可以通过抓包来 判断,如果弹出不允许上传,但是没有抓到数据包,那么就是前端验证

文件上传漏洞研究绕过(一)

    1.3 前端验证非常不可靠,传正常文件改数据包就可以绕过,甚至关闭JS都可以尝试绕过(以Pass-01为例)

先将shell.php文件改为png格式,使用notepad打开发现本质就是一句话木马

文件上传漏洞研究绕过(一)

点击上传后抓包

文件上传漏洞研究绕过(一)

再将数据包中的shell.png文件名改回php格式,点击发送

文件上传漏洞研究绕过(一)

上传成功

文件上传漏洞研究绕过(一)

右键上传图片在新标签页打开图片,在url栏添加  ?8=phpinfo();   进行测试,成功绕过

文件上传漏洞研究绕过(一)

2 服务端检测

    2.1 服务端检测几个常见的手段:

检查Content-Type (内容类型)

检查后缀 (检查后缀是主流)

检查文件头

    2.2 如何绕过Content-Type (内容类型)和文件头检测(以Pass-02为例)

         这个时候我们就要去制作一个图片马,图片马可以很好的绕过内容类型和文件头检测

         写一个一句话木马放在txt文件中,然后找一张你喜欢的图片(注意文件大小,越小越好),打开cmd,copy xm.jpg/b + shell.txt mm.jpg (将xm.jpg和shell.txt 合并为mm.jpg )

文件上传漏洞研究绕过(一)

    使用notepad打开,查找到一句话木马说明制作成功

文件上传漏洞研究绕过(一)

    上传mm.png文件后抓包,修改格式为php

文件上传漏洞研究绕过(一)

    右键上传图片在新标签页打开图片,在url栏添加  ?8=phpinfo();   进行测试,成功绕过

文件上传漏洞研究绕过(一)

3 靶场讲解

    3.1 Pass-03:黑名单绕过

$deny_ext = array('.asp','.aspx','.php','.jsp');

     php中,如果默认状态下 .php3,.php4,.php5,.phtml 都是会被解析为php的

文件上传漏洞研究绕过(一)

    当像Pass-02一样上传图片马抓包并修改格式名后,却出现报错

文件上传漏洞研究绕过(一)

    尝试抓包并将格式改为php3,能成功上传,但没有效果

文件上传漏洞研究绕过(一)

    靶场是用phpstudy环境搭建的,要进去修改一下配置文件,将httpd.conf文件里的 #AddType application/x-httpd-php .php .phtml更改为 AddType application/x-httpd-php .php .phtml .php5 .php3 ,重启一下phpstudy服务环境

文件上传漏洞研究绕过(一)

    再次抓包修改,进行测试,成功绕过

文件上传漏洞研究绕过(一)

    通过蚁剑也是可以直接连接

文件上传漏洞研究绕过(一)

    3.2 Pass-04:黑名单绕过,.htaccess

3.2.1 这里需要知道一个新的知识点 .htaccess 是什么东西?

    全称是Hypertext Access(超文本入口)  .htaccess文件也被称为分布式配置文件,提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

3.2.2 .htaccess 功能

    文件夹密码保护、用户自定义重定向、自定义404页面、扩展名伪静态化、禁止特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表

    很可惜,在Apache服务器中,这么一个强大的功能默认是不开启的 (有伪静态的都可以试试)

    phpstudy中启用 .htaccess,需要修改httpd.conf,启用AllowOverride,它里面有这样一段代码:AllowOverride None,如果我们把None改成All

文件上传漏洞研究绕过(一)

    例如:AddType application/x-httpd-php .jpg  代表着 .jpg文件会当做php来解析

3.2.3 当像Pass-03一样上传图片马抓包并修改格式名为php3后,却出现报错

文件上传漏洞研究绕过(一)

    先上传一个.htaccess 格式文件,文件内容填入 AddType application/x-httpd-php .jpg 

文件上传漏洞研究绕过(一)

 

    之后再上传图片马,直接在url栏添加  ?8=phpinfo(); 测试,成功绕过

文件上传漏洞研究绕过(一)

    3.3 Pass-06:后缀大小写绕过 

当像Pass-04一样上传.htaccess格式文件,出现报错

文件上传漏洞研究绕过(一)

发现前面的方法都不可用,尝试后缀大小写绕过

文件上传漏洞研究绕过(一)

在url栏添加  ?8=phpinfo(); 测试,成功绕过

文件上传漏洞研究绕过(一)

    3.4 Pass-07:文件后缀(空)绕过

    在文件名后面留一个空格,然后上传成功后空格会被自动的省略,但是由源码可知道,源码中黑名单中没有过滤空值,那么php和php  ,当然是不一样的

文件上传漏洞研究绕过(一)

    抓包将php格式后加空值

文件上传漏洞研究绕过(一)

    进行测试,成功绕过

文件上传漏洞研究绕过(一)

    3.5 Pass-08:文件后缀(点)绕过

    windows有一个特性,会自动去掉后缀名最后的 .

    查看Pass-08源码,发现其将格式名首尾去空,导致不能采取Pass-07的做法,但这里并没有去掉后缀名最后的 . 

文件上传漏洞研究绕过(一)

    抓包将php格式后加 .

文件上传漏洞研究绕过(一)

    进行测试,成功绕过

文件上传漏洞研究绕过(一)

    3.6 Pass-09:::$DATA(Windows文件流绕过)

    这里利用了NTFS交换数据流(ADS),ADS是NTFS磁盘格式的一个特性,在NTFS文件系统下,每个文件都可以存在多个数据流。通俗的理解,就是其它文件可以“寄宿”在某个文件身上,而在资源管理器中却只能看到宿主文件,找不到寄宿文件

    echo “nb” > 1.txt:2.txt

    notepad 1.txt:2.txt

文件上传漏洞研究绕过(一)

    利用windows特性,可在后缀名中加” ::$DATA”绕过,::$DATA就是默认不修改文件流的情况

    查看Pass-09源码,发现其删除了文件末尾的点,导致不能采取Pass-08的做法,尝试使用Windows文件流绕过

文件上传漏洞研究绕过(一)

    抓包并在php格式后加 ::$DATA

文件上传漏洞研究绕过(一)

    发现页面出现403,删除url栏末尾的::$data

文件上传漏洞研究绕过(一)

    进行测试,成功绕过

文件上传漏洞研究绕过(一)

    3.7 Pass-10:构造文件后缀绕过(与Pass-5同理)

    查看Pass-10源码,发现其去除了字符串::$DATA,导致不能采取Pass-09的做法,尝试自己构造文件后缀绕过

文件上传漏洞研究绕过(一)

    构造格式为 .php. . 由源码可知其先删除文件末尾的点,格式变为( .php. ),之后首尾去空,格式变为( .php. ),仍满足要求

    抓包修改php格式为 .php. .

文件上传漏洞研究绕过(一)

    进行测试,成功绕过

文件上传漏洞研究绕过(一)

    3.8 Pass-11:构造文件后缀绕过(双写绕过)

    查看Pass-11源码,发现  $file_name = str_ireplace($deny_ext,"", $file_name);  这里就是将检测到与deny_ext数组中相同的字符串替换为空,php被替换为空是空,那么只需构造格式后缀为pphphp,中间的php被替换为空,格式后缀就会就会变为php,从而达到了绕过

文件上传漏洞研究绕过(一) 

    抓包修改php格式为 pphphp

文件上传漏洞研究绕过(一)

进行测试,成功绕过

文件上传漏洞研究绕过(一)

 

    3.9 Pass-14:图片马unpack

    由任务知道这题需要使用图片马(与Pass-02制作图片马过程相同)

文件上传漏洞研究绕过(一)

    上传图片马后得到文件路径 /upload/8720240812112155.jpg

文件上传漏洞研究绕过(一)

    然后这关要使用文件包含才能解析木马的执行,文件包含页面链接就在那里

文件上传漏洞研究绕过(一)

    上传文件名   ?file= /upload/8720240812112155.jpg   并进行测试  ?file= /upload/8720240812112155.jpg&8=phpinfo(); 成功绕过

文件上传漏洞研究绕过(一)

4 总结

    4.1 对于客户端检测,攻击者可以通过抓包工具(如Burp Suite)拦截上传请求,修改文件的格式名称,从而绕过客户端的格式限制。这种方式利用了客户端检测的不足,因为客户端检测通常依赖于JavaScript等前端技术,而这些技术可以被攻击者轻松篡改或忽略。

    4.2 对于服务端检测,主要有两种方式:检查数据包的MIME类型和检查文件后缀。其中,检查文件后缀是更为常见的方法。

    4.2.1 MIME类型检测:

    MIME类型是文件的多用途互联网邮件扩展类型,用于描述文件的性质和格式。服务器通过检查上传文件的MIME类型来判断文件是否符合允许的格式。

    绕过方法:攻击者可以创建一个包含恶意代码的图片文件(例如JPG或PNG),俗称“图片马”。上传时,服务器会检测到这是一个图片文件并允许上传。然而,通过抓包工具,攻击者可以修改上传请求中的MIME类型和文件后缀,将其更改为.php或其他可执行文件格式,从而在服务器上成功执行恶意代码。

    4.2.2 文件后缀检测:

    文件后缀检测主要分为黑名单检测和白名单检测两种机制。

黑名单检测:

    机制:服务器禁止特定的文件后缀(如.php, .exe)上传。

    绕过方法:攻击者可以使用以下技巧绕过黑名单检测:

    变种后缀:将.php修改为其他类似但不在黑名单中的格式,如.ph3, .ph4。

    .htaccess文件:利用Apache服务器配置文件.htaccess,通过上传该文件修改服务器配置,从而允许上传的文件执行。

    后缀大小写变化:部分服务器对后缀的大小写不敏感,如将.PHP视为合法后缀。

    后缀空格或点绕过:在后缀后添加空格或点,如file.php 或file.php.,一些服务器可能会忽略这些字符。

    Windows文件流:利用Windows的文件流特性,如file.php::$DATA,某些服务器可能只会检测前半部分的.php,忽略后面的流数据。

    构造混淆后缀:如pphphp,在服务器检测规则不够严谨的情况下,可能被识别为合法文件。

白名单检测:

    机制:服务器只允许特定后缀的文件上传,如.jpg, .png。

    绕过方法:绕过白名单检测较为困难,但攻击者可以利用00截断技术。在上传文件名中插入一个空字符(通常是\0),使服务器误认为文件符合白名单要求,如file.jpg\0.php。一些旧版本的服务器在解析文件名时可能会忽略空字符之后的部分,从而允许恶意文件上传。

文件内容检测:

    某些服务器会进一步检测文件的内容,特别是文件的魔术字节(前几个字节),来确认文件类型。常见的图片文件如PNG、JPG、GIF都有特定的魔术字节。

    绕过方法的限制:如果攻击者通过抓包修改文件后缀为可执行文件,但文件内容仍然保留原始的图片数据,那么服务器可能会检测到文件类型不一致,从而拒绝上传。此时,攻击者需要利用服务器上的文件解析漏洞(如IIS解析漏洞)来执行恶意代码。该漏洞允许服务器在处理文件时,错误地解析文件内容或文件路径,从而绕过严格的检测机制。

 

 

- THE END -

huangxin0506

8月13日15:42

最后修改:2024年8月13日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论