文件上传绕过(基于upload-labs)

前端检测(Pass-01)

设置禁用Javascript即可绕过

后端检测

MIME类型检测(Pass-02)

修改上传文件的MIME类型为合法类型即可绕过

后缀名检测

黑名单 (Pass-03~11)

Pass-03

使用其他可解析的后缀名进行绕过

PHP:php2、php3、php5、phtml、pht
ASP:asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf

Pass-04

重写绕过

服务端将黑名单的后缀名替换为空,但是仅替换一次,所以可以上传.phphp p后缀,替换后就成了.php

中间的php被过滤

Pass-04还可以使用.htaccess绕过

Pass-11也使用了重写绕过

.htaccess绕过

上传一个.htaccess文件

文件内容:

文件内容为调用php解释器去解释as.png文件(文件名可以修改)

<FilesMatch "as.png">
setHandler application/x-httpd-php
</FilesMatch>

上传相应的as.png文件,文件内容为一句话木马

上传成功,蚁剑连接

Pass-05

拒绝上传 .htaccess 文件

依旧可以用重写绕过

使用windows特性绕过

在文件名后面加上. .(点 空格 点)

在源码中可以看到,代码的逻辑为:先删除空格,再删除文件名末尾的.,在删除空格

我们将文件名写为shell.php. .

尾部去空(shell.php. .)->删除文件名末尾的.(shell.php. )->再删除空格(shell.php.)->由于windows特性该文件最后的点会自动过滤掉(shell.php)

Pass-06

大小写绕过

windows对大小写不敏感,所以上传大小写混写的php进行绕过

(因为后端一般验证后缀字符串是否和‘php’相等,(前提是没有将你传入的字符串进行小写转换后再对比),大写字母和小写字母肯定不相等,所以可以利用这一点进行绕过,又因为windows对大小写不敏感,所以.Php文件被当成php文件解析)

Pass-07

源码中没有使用trim()去除文件名空格,我们使用空格绕过

空格绕过

前提:没有使用trim()去除文件名空格

在文件名后面加空格

而windows特性:在windows中文件后缀名末尾有空格会自动去掉,因此可以绕过检测并被解析

Pass-08

源码中没有使用deldot()过滤

点绕过

前提:没有使用deldot()过滤文件名末尾的点

在文件名后面加上点

还是利用了windows特性:会自动过滤文件名后的点

Pass-09

源码中没有,可以使用::$DATA绕过

$file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA

::$DATA绕过

前提:没有使用$file_ext = str_ireplace('::$DATA', '', $file_ext)去除字符串::$DATA

补充:php在windows中,如果文件名+“::$DATA”字符,会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名

在文件名后面加上::$DATA

在用蚁剑连接时文件名仍为shell.php

Pass-10

. .(点空格点)绕过

被骗到了,看这个提示我还以为是白名单,结果是黑名单…

Pass-11

直接传shell.php

能传上,但是发现文件名被改写为shell.(后缀名被改写为空)

经过检验发现,该目录下的确上传了一个shell文件

使用重写绕过(shell.pphphp)

这里第一次我使用shell.phphpp时,发现响应包中返回的目录中文件名后缀变成了hpp,于是更改了中间的php的位置

白名单(Pass-12~13)

Pass-12

发现请求URL里有保存路径

通过 $_GET 获取图片存储路径

%00截断

前提:通过$_GET 获取图片存储路径(路径在url中)

可以看到文件目录下存在了shell.php文件,上传成功

蚁剑连接

Pass-13

上传文件的路径在请求体中

通过 $_POST 获取图片存储路径

0x00截断

先更改文件名合法性,将上传文件请求包中图片存储路径写入php文件名,并在后面加上一个+

在hex中找到添加+的地方,将+对应的数值改为00

发送之后可以看到上传成功

文件内容检测(Pass-14~17)

十四到十六关都是图片马绕过,使用三种后缀名,操作类似,只需要修改后缀名即可

图片马绕过

1.准备两个文件,正常的图片和php文件(最好放在同一目录下,以便于命令的执行)

2.执行命令

copy 图片/b + php文件/a 生成的文件
例如:copy test.png/b + shell.php/a shell.png

生成的shell.png文件就是图片马

生成的图片马的图片和源图片文件看起来没有区别,但是将php文件中的php代码插入进去了

3.上传图片马

4.找到文件包含路径

5.使用文件包含漏洞执行

url里执行

?file=文件路径

6.蚁剑连接

png能够被解析,就是因为存在文件包含漏洞

文件包含漏洞:只要被包含的文件内容符合php语法,不管文件后缀名如何,都会被当成php文件解析执行

二次渲染绕过

Pass-17

我们上传文件马,利用文件包含漏洞解析时发现解析不了,查看上传后的文件内容,发现文件末尾我们所加上的php代码不见了,这是因为二次渲染图片导致图片内容改变了

服务器对我们的文件进行了二次渲染,将文件内容进行打乱了,虽然我们看起来图片还是一样的

这种情况下,我们需要进行二次渲染绕过,找到那个没有改变的地方,插入木马

1.先上传一张正确的gif图片(gif图片更容易绕过),再将图片下载下来

2.比较两张图片的差异

3.在相同的地方(经过二次渲染没有改变的地方)插入木马

4.上传,找到路径,利用文件包含漏洞执行,蚁剑连接

如果我们上传后无法连接,可以再次检查一下我们插入的木马是否被二次渲染了(下载上传后的图片,再次检查)

条件竞争绕过(Pass-18)

Pass-18

先保存文件,才去判断,判断之后不合法才删除

我们可以不断上传文件,在文件还没被删除前去读取文件

在我们日常中只能进行尝试,因为我们在黑盒中也无法看到源码

1.准备一个php文件,文件内容如下

<?php 
fputs(fopen('shell.php','w'),"<?php phpinfo();?>");
?>

在判断1.php的时候,服务器会解析写入一个内容为

的shell.php文件。这时使用BurpSuite的Intruder不断上传1.php,浏览器不断访问1.php,即可造成条件解析漏洞

2.上传文件,访问1.php

此时访问返回404,因为被删除了

3.抓包爆破

访问1.php文件的包也进行不断爆破,payload和上面相同

4.访问shell.php,发现已经成功上传

条件竞争+中间件解析漏洞绕过(Pass-19)

Pass-19

在Apache版本符合的条件下,对mime.types中没有涉及的文件后缀不会解析,查看httpd.conf文件下的mime.types,没有发现7z后缀,说明不会解析7z文件

Apache解析漏洞:Apache解析是从后往前,当一个后缀不能被解析时,会从后往前一直解析到可以解析的后缀为止,所以如果我们传入test.php.7z文件时,会被当作test.php执行

1.创建1.php.7z文件,文件内容如下

<?php 
fputs(fopen('shell.php','w'),"<?php phpinfo();?>");
?>

接下来的步骤和条件竞争绕过相同

2.上传1.php.7z文件并爆破

3.访问1.php.7z文件并爆破

4.访问shell.php

这里好像路径出了点问题,我最后也没有成功

Pass-20

我们上传php文件,保存为jpg文件

实际上是一个%00截断

1.上传php文件

2.将保存名称后缀改为php

3.使用00截断

4.蚁剑连接测试

数组绕过(Pass-21)

详解可以看这位师傅的https://www.cnblogs.com/LING5/articles/18064737

Pass-21

上传php文件,抓包,修改请求体信息

修改前:

修改后:

上传成功

测试,连接成功

总结

文件上传的过滤

前端检测:浏览器禁用js即可绕过

后端检测:

  • MIME类型检测
  1. 修改MIME类型为合法类型即可

常见的MIME类型

超文本标记语言.html文件:text/html

普通文本.txt文件:text/plain

PDF文档.pdf:application/pdf

PNG图像.png:image/png

GIF图像.gif:image/gif

JPG图像.jpg:image/jpg

MPEG文件.mpg、.mpeg:video/mpeg

  • 后缀名检测
黑名单
使用其他可解析的后缀名
> PHP:php2、php3、php5、phtml、pht
> ASP:asa、cer、cdx
> ASPX:ascx、ashx、asac
> JSP:jspx、jspf
重写绕过
> 后缀名进行双写,比如phphpp
.htaccess绕过
> 上传.htaccess文件,再上传有木马语句的合法文件
大小写绕过
> 后缀名大小写混用,比如Php(windows对大小写不敏感)
使用windows特性绕过
> 1. .(点)绕过,在文件名后缀加上.(windows会自动过滤文件名后的点)
> 2. (空格)绕过,在文件名后缀上加上空格(windows会自动过滤文件后缀名末尾的空格)
> 3. . .(点空格点)绕过,混合使用,在文件名后缀加上点空格点
> 4. ::$DATA绕过,在文件名后加上::$DATA,比如shell.php::$DATA
白名单

00截断
当通过$_GET方式获取图片路径(路径在url中)
%00截断
> 1. 将上传文件后缀改为合法
> 2. 在url中的文件路径后写一个php文件,后面加上%00
当通过$_POST方式获取图片路径(路径在请求体中) 0x00截断
> 1. 更改上传文件后缀为合法
> 2. 在请求体中的文件路径后写一个php文件,后面加上一个+(加号)
> 3. 进入hex编辑将+改为00
  • 文件内容检测
  1. 图片马绕过

将正常图片和php文件组合起来形成图片马再上传

copy 图片/b + php文件/a 生成的文件

例如:copy test.png/b + shell.php/a shell.png

要使用文件包含漏洞去解析这个图片马

  1. 二次渲染绕过

将上传后和上传前的文件进行对比,找到没有被二次渲染改变的部分,插入php代码,再上传