0x01.
在问题一(详见上文)中,获取文件后缀名$file_type = $_FIELS[‘file‘][‘type‘],通过和白名单比较,假如相同,则取上传文件的后缀名。上文说过,MIME头欺骗问题(这里不考虑重命名文件名问题),如果上传数据包修改Content-type的类型,$file_type就获取修改后文件类型。
如:上传1.php=>burpsuite拦截修改数据包中的Content-Type为:image/jpg=>$file_type="image/jpg",$file_name="1.php"。
1.GIF89a文件头绕过,程序规定只能上传gif文件,由于获取文件类型也是通过$file_type获取,程序判断上传文件头部信息是否符合白名单类型。
伪代码:$filetype = fileHeaderRead($uploadFile);if $fileType ==‘GIF89a‘ echo ‘upload success‘;
修改上传webshell里的头部信息,由于GIF代码头部信息是GIF89a,所以webshell里代码:GIF89a<?php code?>
2.黑名单绕过
事先规定不允许上传的类型列表,asp|aspx|jsp|php|asa|....
加入上传shell.cer,或者大小写绕过,shell.Asp/shell.pHp....
3.后缀名解析漏洞
IIS6.0/Apache/Nginx(php-fpm)
常见shell.asp;.jpg,/shell.asp/shell.jpg,shell.php.xxx(apache从右往左解析,不识别,跳到下一个解析)
4.0x00截断
上传shell.php.jpg=>burpsuite拦截,在.php后加空格,在十六进制,对应的0x20修改为0x00(空),程序在处理这个文件名时,直接丢弃后面的.jpg,保存的文件名为shell.php
5.apache重写文件.htaccess。move_uploaded_file()函数,在移动文件时,如果文件存在,新文件直接覆盖旧文件。