文件上传之后端黑白名单绕过
文件上传常见验证:
后缀名:黑名单、白名单
文件类型:MIME信息
文件头:内容头信息
黑名单:明确不能上传的后缀
php,jsp,asp等
白名单:明确能够上传的后缀
jpg,png,gif等等
塒NG:png的文件头
xFFxD8:jpg的文件头
GIF89a:gif的文件头
文件类型MIME绕过
数据包中的Content-Type就是MIME,通过格式猜测哪种类型的MIME
文件头信息绕过
简要上传代码分析解释
$_FILES函数
$_FILES[‘upfile’][‘name’]; //客户端上传文件的原名称,不包含路径
$_FILES[‘upfile’][‘type’]; //上传文件的MIME类型
$_FILES[‘upfile’][‘tmp_name’]; //已上传文件在服务器端保存的临时文件名,包含路径
$_FILES[‘upfile’][‘error’]; //上传文件出现的错误号,为一个整数
$_FILES[‘upfile’][‘size’]; //已上传文件的大小,单位为字节
trim() 函数
移除字符串两侧的空白字符或其他预定义字符。
windiws系统下,对文件名中空格会被作为空处理,程序中的检验代码却不能自动删除空格。从而绕过黑名单。
deldot($file_name)函数
去掉最后面得点
windows系统下,文件后缀名最后一个点会被自动去除,如果在上传中,没把末尾的.去除则会绕过。
例如 windows下新建一个1.php. 文件,会自动更正为1.php
php别名解析
php3、php5、phtml能解析成php文件
httpd.conf配置文件
.htaccess文件解析
1、只有apache具有此文件
2、 .htaccess文件(分布式配置文件)是针对每个目录改变配置的方法,就是把.htaccess文件放在一个目录中,其中里面的指令作用于此目录及其所有子目录。
3、上传漏洞指令:
<FilesMatch “yucedu”>
SetHandler application/x-httpd-php
作用是文件名包含yucedu的都会以php代码执行
.user.ini文件解析
1、服务器脚本语言为PHP
2、服务器使用CGI/FastCGI模式
3、上传目录下要有可执行的php文件
.user.ini作用:所有的php文件都自动包含jpg文件
4、字符串::$DATA
在window的时候如果文件名+”::$DATA”会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名
例如:”phpinfo.php::$DATA”Windows会自动去掉末尾的::$DATA变成”phpinfo.php”
5、一次过滤与循环过滤(递归过滤)
作用:将字符串里的php替换为空
一次过滤:
1.php –> 1.[空]
1.phphpp –> 1.php
循环过滤(递归过滤)
1.php –> 1.[空]
1.phphphpphppp –> 1.[空]
6、%00截断与0x00截断
前提:php的版本要小于5.3.4并且魔术引号必须关闭
%00:主要针对地址上的截断
0x00截断:主要针对文件命名上的截断
0x:16进制表示
00:表示0
0x00:就是代表16进制的0
有的函数在处理这个字符时,会当做结束符
%00 和 00 是一样的,只是在get提交时,经过url编码后,00就成了%00
为什么post要进行编码,get就不用?
因为get提交方式会自动解码一次
然而post并不会