文件上传绕过技巧(基于upload-labs)
前端检测(Pass-01)
后端检测
MIME类型检测(Pass-02)
后缀名检测
黑名单 (Pass-03~11)
使用其他可解析的后缀名进行绕过
PHP:php2、php3、php5、phtml、pht
ASP:asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf
重写绕过
服务端将黑名单的后缀名替换为空,但是仅替换一次,所以可以上传.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)
大小写绕过
windows对大小写不敏感,所以上传大小写混写的php进行绕过
(因为后端一般验证后缀字符串是否和‘php’相等,(前提是没有将你传入的字符串进行小写转换后再对比),大写字母和小写字母肯定不相等,所以可以利用这一点进行绕过,又因为windows对大小写不敏感,所以.Php文件被当成php文件解析)
Pass-07
源码中没有使用trim()去除文件名空格,我们使用空格绕过
空格绕过
前提:没有使用trim()去除文件名空格
在文件名后面加空格
而windows特性:在windows中文件后缀名末尾有空格会自动去掉,因此可以绕过检测并被解析
点绕过
前提:没有使用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-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的时候,服务器会解析写入一个内容为
的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文件,抓包,修改请求体信息
修改前:
修改后:
上传成功
测试,连接成功