常见上传姿势

Lekou 2021年05月27日 99次浏览

常见上传姿势

JavaScript绕过

image-20210508171615539

直接上传PHP文件提示

image-20210508171731010

将文件后缀修改为.png上传并抓包,修改文件名放包突破限制上传。

image-20210508171847942

.htaccess 解析绕过

htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能

image-20210508171950151

通过之前的方式上传PHP文件发现无法上传。

上传.htaccess文件增加解析规则,将png文件当作php脚本文件进行执行

AddType application/x-httpd-php .png

image-20210508172155195

然后将shell以png格式上传即可。

MIME绕过

image-20210508172609352

增加了对Content-Type的校验,修改为png格式的MIME即可。

image-20210508172714464

文件头绕过

一个文件里面的内容到底是啥?用惯了Windows的人肯定是看后缀。但是后缀这个东西说改就改,不可靠。所以,最保险的还是把文件类型信息写到文件里面,通常来说,也就是写到文件开头的那几个字节。这是最方便,最快捷的用来辨别一个文件真实内容的方法。

常见的文件头标志如下:

JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
HTML (html),文件头:68746D6C3E
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Adobe Acrobat (pdf),文件头:255044462D312E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0

对文件头进行了校验,可以使用图片马进行绕过。

图片马的简单制作,default.gif为图片文件,shell.php为shell文件。

image-20210511110158773

修改上传即可。

image-20210511110301081

字符过滤绕过

image-20210508173613673

从源码中可以看到会对限制的黑名单进行字符过滤。上传test.php发现后缀php直接被替换为空。

image-20210508173915408

这里可以根据替换的规则进行双写绕过。pphphp

image-20210508174200173

00截断绕过

image-20210508174832497

00 截断多配合路径来截断,我们来抓包看看应该是存在路径信息的,然后直接在路径后面使用 %00 来截断一下就可以成功绕过,为啥 %00 直接就可以绕过了呢?这是因为路径信息是从 GET 方式传递个后端的,这样默认会进行一次 URL 解码,%00 解码后就是空字节:

image-20210510103424404

这样保存的完整URI就是

/var/www/html/upload/tt.php[空格]php.png

所以最终会在 upload 目录下面生成 tt.php 的 webshell

00截断绕过2

上传抓包可以看到这次的path在POST包里

image-20210511104639219

同样进行00截断。输入%00

image-20210511104720145

然后转为URL编码,上一节中不用转换是因为之前的PATH在URI中,传输过程中会进行一次URL编码。

image-20210511104748439

这样保存的完整URI就是

./upload/tst.php[空格]php.png

所以最终会在 upload 目录下面生成 tst.php 的 webshell

黑名单绕过

image-20210511105311847

本题同样题目的配图中暗示已经比较明显了,限制上传PHP格式的文件,但 Apache 把 phtml、pht、php、php3、php4、php5 解析为 PHP。所以上传php3格式即可。

image-20210511105409186

利用windows特性绕过
不符合Windows文件名规则

  • shell.php.
    加点绕过:
    当黑名单中限制上传.php后缀的文件时,我们可以上传test.php. 这时服务器获取到的后缀是空,不在黑名单中上传成功由于windows文件系统的特性 在生成的test.php.=test.php

  • shell.php(空格)
    加空格绕过:
    当黑名单中限制上传.php后缀的文件时,我们可以上传test.php+空格,这时服务器获取到的后缀是.php+空格,不再黑名单中,上传成功。由于windows文件系统的特性 在生成的test.php+空格=test.php

  • shell.php:1.jpg

  • shell.php::$DATA

  • shell.php::$DATA……
    ::$DATA绕过:
    ADS是nfts磁盘格式的一个特性,由于NTFS交换数据流,在上传文件时如果系统对请求正文的filename匹配不当的话可能会导致绕过

条件竞争

image-20210511105725805

这个图中已经说的非常详细了。

二次渲染绕过

目前很多网站都会对用户上传的图片再次压缩、裁剪等渲染操作,所以普通的图片马都难逃被渲染的悲剧,那么有没有那种可以绕过渲染的图片呢?

GIF格式:
渲染前后的两张 GIF,没有发生变化的数据库部分直接插入 Webshell 即可

PNG格式:
PNG 没有 GIF 那么简单,需要将数据写入到 PLTE 数据块 或者 IDAT 数据块

JPG格式:
JPG 也需要使用脚本将数据插入到特定的数据库,而且可能会不成功,所以需要多次尝试

具体的细节以后单独开一篇文章展开讲吧。(挖个坑)

move_uploaded_file绕过

image-20210511114645308

$img_path 可控的时候,还会忽略掉 $img_path 后面的 /. ,这一点发现最早是 Smile师傅于 2019 年 2 月份提出来的,既然知道 move_uploaded_file 的这个小缺陷的话,这样既可直接 Getshell:

image-20210511114757829

.user.ini绕过

自PHP5.3.0起,PHP支持基于每个目录的.htaccess风格的INI文件。此类文件仅被CGI/FastCGI SAPI处理。
除了php.ini之外,PHP还会在每个目录下扫描ini文件,从被执行的PHP文件所在目录开始一直上升到web根目录($_SERVER['DOCUMENT_ROOT']所指定的)。如果被执行的PHP文件在web根目录之外,则只扫描该目录。
在.user.ini风格的ini文件中只有具有PHP_INI_PERDIR和PHP_INI_USER模式的ini设置可被识别。
漏洞利用:
前提:所上传文件夹下有正常的php文件
上传.user.ini文件
.user.ini内容:

auto_prepend_file=01.gif

上传马<?php @eval($_REQUEST[shell]); ?> 后缀名改为01.gif
访问同目录下php文件 包含上传的马子进行解析 http://www.xxx.com/../../echo.php?shell=phpinfo();

IIS解析漏洞

IIS6.0有2种解析漏洞

  • 目录解析
    以*.asp命名的文件夹里的文件都将会被当成ASP文件执行。
    例如/xx.asp/xx.jpg
    其中/xx.asp/为文件夹,xx.jpg为我们上传的马。
  • 文件解析

*.asp;.jpg 像这种畸形文件名在“;”后面的直接被忽略,也就是说当成 *.asp文件执行。

IIS7/7.5

当服务器开启了"cgi.fix_pathinfo"功能,就会对路径进行修剪。
例如:上传一个内容为的文件,后缀为jpg,正常情况下这个文件无法被php解析

但是如果我们在访问这个文件的时候在后缀后面+/.php,服务器发现后缀是.php,便交给php处理

php发现这个路径无法访问,就会进行修剪,会去掉/.php,最终会用php去解析test.jpg文件

Nginx解析漏洞

/test.jpg/test.php
目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php 的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。

php为了支持path info模式创造了fix_pathinfo这个选项,当它被打开时fpm(FastCGI 进程管理器(FPM))就会判断请求的文件是否存在,如果不存在就去掉最后一个\开始的内容,再次查看文件是否存在,不存在再去掉从\开的内容,循环往复。所以当请求http://xx/admin/upload/shell.jpg/.php这么个文件时,fpm会把/.php去掉把shell.jpg当作php执行。后来出现了seccurity.limit_extensions选项,这个选项默认配置.php文件才能被fpm执行。

Apache 解析漏洞

apache解析有一个特点,解析文件时是从右往左判断,遇到不认识的后缀时,就跳过,于是就有了类似于“.php.123”这种绕过方式。