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

前端检测(Pass-01)

设置禁用Javascript即可绕过
image.png

后端检测

MIME类型检测(Pass-02)

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

后缀名检测

黑名单 (Pass-03~11)

Pass-03
image.png

使用其他可解析的后缀名进行绕过
PHP:php2、php3、php5、phtml、pht
ASP:asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf

image.png

Pass-04
image.png

重写绕过

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

image.png
中间的php被过滤

Pass-04还可以使用.htaccess绕过
Pass-11也使用了重写绕过

.htaccess绕过

上传一个.htaccess文件
文件内容:

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

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

上传相应的as.png文件,文件内容为一句话木马
image.png
上传成功,蚁剑连接
image.png

Pass-05
image.png

拒绝上传 .htaccess 文件
依旧可以用重写绕过

使用windows特性绕过

在文件名后面加上. .(点 空格 点)
在源码中可以看到,代码的逻辑为:先删除空格,再删除文件名末尾的.,在删除空格
image.png
我们将文件名写为shell.php. .
尾部去空(shell.php. .)->删除文件名末尾的.(shell.php. )->再删除空格(shell.php.)->由于windows特性该文件最后的点会自动过滤掉(shell.php)
image.png

Pass-06
image.png

大小写绕过

image.png

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

Pass-07
image.png
image.png
源码中没有使用trim()去除文件名空格,我们使用空格绕过

空格绕过

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

在文件名后面加空格

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

image.png

Pass-08
image.png
源码中没有使用deldot()过滤
image.png

点绕过

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

在文件名后面加上点

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

image.png

Pass-09
image.png
源码中没有,可以使用::$DATA绕过

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

::$DATA绕过

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

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

在文件名后面加上::$DATA
image.png

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

Pass-10
image.png

. .(点空格点)绕过

image.png

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

Pass-11
image.png
直接传shell.php
image.png
能传上,但是发现文件名被改写为shell.(后缀名被改写为空)
经过检验发现,该目录下的确上传了一个shell文件
image.png
使用重写绕过(shell.pphphp)
image.png

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

白名单(Pass-12~13)

Pass-12
image.png
发现请求URL里有保存路径
image.png

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

%00截断

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

image.png
可以看到文件目录下存在了shell.php文件,上传成功
image.png
蚁剑连接
image.png

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

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

image.png

0x00截断

先更改文件名合法性,将上传文件请求包中图片存储路径写入php文件名,并在后面加上一个+
image.png
在hex中找到添加+的地方,将+对应的数值改为00
image.png
发送之后可以看到上传成功
image.png

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

image.png

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

图片马绕过

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

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

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

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

3.上传图片马
4.找到文件包含路径
image.png
5.使用文件包含漏洞执行
image.png

?file=文件路径

6.蚁剑连接
image.png

png能够被解析,就是因为存在文件包含漏洞
文件包含漏洞:只要被包含的文件内容符合php语法,不管文件后缀名如何,都会被当成php文件解析执行

二次渲染绕过

Pass-17

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

image.png

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

这种情况下,我们需要进行二次渲染绕过,找到那个没有改变的地方,插入木马
1.先上传一张正确的gif图片(gif图片更容易绕过),再将图片下载下来
image.png
2.比较两张图片的差异
image.png
3.在相同的地方(经过二次渲染没有改变的地方)插入木马
image.png
4.上传,找到路径,利用文件包含漏洞执行,蚁剑连接
image.png

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

条件竞争绕过(Pass-18)

Pass-18
image.png

先保存文件,才去判断,判断之后不合法才删除
我们可以不断上传文件,在文件还没被删除前去读取文件

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

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

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

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

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

2.上传文件,访问1.php
此时访问返回404,因为被删除了
3.抓包爆破
image.png
image.png
访问1.php文件的包也进行不断爆破,payload和上面相同
image.png
4.访问shell.php,发现已经成功上传
image.png

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

Pass-19
image.png

在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
image.png
我们上传php文件,保存为jpg文件

实际上是一个%00截断

1.上传php文件
2.将保存名称后缀改为php
image.png
3.使用00截断
image.png
image.png
4.蚁剑连接测试
image.png

数组绕过(Pass-21)

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

Pass-21
image.png
上传php文件,抓包,修改请求体信息
修改前:
image.png
修改后:
image.png
上传成功
测试,连接成功
image.png

总结

文件上传的过滤
前端检测:浏览器禁用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会自动过滤文件名后的点)

  1. (空格)绕过,在文件名后缀上加上空格(windows会自动过滤文件后缀名末尾的空格)
  2. . .(点空格点)绕过,混合使用,在文件名后缀加上点空格点
  3. :: D A T A 绕过,在文件名后加上 : : DATA绕过,在文件名后加上:: DATA绕过,在文件名后加上::DATA,比如shell.php::$DATA

|
| 白名单

| 00截断 |
| | 当通过$_GET方式获取图片路径(路径在url中)
%00截断> 1. 将上传文件后缀改为合法

  1. 在url中的文件路径后写一个php文件,后面加上%00

|
| | 当通过$_POST方式获取图片路径(路径在请求体中)
0x00截断> 1. 更改上传文件后缀为合法

  1. 在请求体中的文件路径后写一个php文件,后面加上一个+(加号)
  2. 进入hex编辑将+改为00

|

  • 文件内容检测
  1. 图片马绕过

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

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

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

  1. 二次渲染绕过

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

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值