前端检测(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”
字符,会把:: D A T A 之后的数据当成文件流处理 , 不会检测后缀名,且保持 : : 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.使用文件包含漏洞执行
?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的时候,服务器会解析写入一个内容为
<?php phpinfo();?>的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)
Pass-21
上传php文件,抓包,修改请求体信息
修改前:
修改后:
上传成功
测试,连接成功
总结
文件上传的过滤
前端检测:浏览器禁用js即可绕过
后端检测:
- MIME类型检测
- 修改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会自动过滤文件名后的点)
- (空格)绕过,在文件名后缀上加上空格(windows会自动过滤文件后缀名末尾的空格)
- . .(点空格点)绕过,混合使用,在文件名后缀加上点空格点
- :: D A T A 绕过,在文件名后加上 : : DATA绕过,在文件名后加上:: DATA绕过,在文件名后加上::DATA,比如shell.php::$DATA
|
| 白名单
| 00截断 |
| | 当通过$_GET方式获取图片路径(路径在url中)
%00截断> 1. 将上传文件后缀改为合法
- 在url中的文件路径后写一个php文件,后面加上%00
|
| | 当通过$_POST方式获取图片路径(路径在请求体中)
0x00截断> 1. 更改上传文件后缀为合法
- 在请求体中的文件路径后写一个php文件,后面加上一个+(加号)
- 进入hex编辑将+改为00
|
- 文件内容检测
- 图片马绕过
将正常图片和php文件组合起来形成图片马再上传
copy 图片/b + php文件/a 生成的文件
例如:copy test.png/b + shell.php/a shell.png
要使用文件包含漏洞去解析这个图片马
- 二次渲染绕过
将上传后和上传前的文件进行对比,找到没有被二次渲染改变的部分,插入php代码,再上传