400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

文件上传漏洞原理与实例测试

0x00 什么是文件上传

成都创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为崆峒企业提供专业的网站建设、网站制作,崆峒网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制开发。

0x01 为什么文件上传存在漏洞

0x02 哪里存在文件上传漏洞

0x03 文件上传实例(本地测试)




    文件信息




    上传文件: 
    




";
    echo "文件大小:".$_FILES['upfile']['size']."";
    echo "文件类型:".$_FILES['upfile']['type']."";
    echo "临时路径:".$_FILES['upfile']['tmp_name']."";
    echo "上传后系统返回值:".$_FILES['upfile']['error']."";
    echo "====================保存分各线========================";
    if ($_FILES['upfile']['error'] == 0) {
        if (!is_dir("./upload")) {
            mkdir("./upload");
        }
        $dir = "./upload/".$_FILES['upfile']['name'];
        move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
        echo "文件保存路径:".$dir."";
        echo "上传成功...";
        echo "图片预览:";
        echo "";
    }
}
 ?>

文件上传漏洞原理与实例测试

设置本地代理用Burp Suite 抓包,通过对比我们可以看到,PHP中的<文件名>和<文件类型>分别对应数据包中




    文件信息




    上传文件: 
    




";
    echo "文件大小:".$_FILES['upfile']['size']."";
    echo "文件类型:".$_FILES['upfile']['type']."";
    echo "临时路径:".$_FILES['upfile']['tmp_name']."";
    echo "上传后系统返回值:".$_FILES['upfile']['error']."";
    echo "====================保存分各线========================";
    $flag = 0;
    switch ($_FILES['upfile']['type']) {
        case 'image/jpeg':
            $flag = 1;
            break;
        default:
            die("文件类型错误.....");
            break;
    }
    if ($_FILES['upfile']['error'] == 0 && $flag ) {
        if (!is_dir("./upload")) {
            mkdir("./upload");
        }
    $dir = "./upload/".$_FILES['upfile']['name'];
    move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
    echo "文件保存路径:".$dir."";
        echo "上传成功...";
        echo "图片预览:";
        echo "";
    }
}
 ?>

在这段代码里,我们通过 <$_FILES['upfile']['type']> 来检测文件上传的类型,通过第一个图里的对比我们知道Http数据包请求头里的对应的是上传文件的类型,那么我们是不是可以通过修改数据包的内容来实验绕过.ok,现在我们上传一个PHP一句话***。

文件上传漏洞原理与实例测试

看返回的页面我们知道我们成功绕过了对文件类型的检测,并且菜刀连接成功

url:http://ctf4.shiyanbar.com/web/upload/

文件上传漏洞原理与实例测试

首先我们对抓取的数据包做出以上修改

文件上传漏洞原理与实例测试

通过16进制我们知道 <.>的16进制是<2e>在<2e>出插入一个字节,右键菜单里有插入。

文件上传漏洞原理与实例测试

ok,现在我们成功获取了flag。

现在我们说下这个实验的实现原理:

1.为什么在文件后面加上<.jpg>和在数据包后面加上修改后的文件名?
     PHP在对文件后缀进行判断时是对最后一个 <.xxx> 来判断的。这样我们修改过后的文件
  名,PHP会将其判断为.jpg文件这样我们可以绕过对文件名的检测。
  
2.为什么我们对文件名修改过后还需要添加%00截断?
    尽管我们知道我们上传的是一个PHP文件,但是如果不进行%00截断,我们上传的文件在服务
  器上是以格式保存也就是说这是一个图片文件,PHP是不会解析这个文件。
  当我们进行%00截断后,服务器就会将%00后的<.jpg>进行截断,这是我们的的文件将以
  的形式保存在服务器上,我们的一句话***也就成功的时上传成功了。




    文件信息




    上传文件: 
    



";
    echo "文件大小:".$_FILES['upfile']['size']."";
    echo "文件类型:".$_FILES['upfile']['type']."";
    echo "临时路径:".$_FILES['upfile']['tmp_name']."";
    echo "上传后系统返回值:".$_FILES['upfile']['error']."";
    echo "====================保存分各线========================";
    $flag = 0;
    $path_parts = pathinfo($_FILES['upfile']['name']);
    echo '---
';     var_dump($path_parts);    //返回文件路径信息     if ($path_parts['extension'] == 'jpg' && $_FILES['upfile']['type'] == 'image/jpeg') {         $flag = 1;     }else{         die("文件类型错误....");     }     if ($_FILES['upfile']['error'] == 0 && $flag ) {         if (!is_dir("./upload")) {             mkdir("./upload");         }         $dir = "./upload/".$_FILES['upfile']['name'];         echo "文件保存路径:".$dir."";         move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);         echo "上传成功...";         echo "图片预览:";         echo "";     } }  ?>

上传一张正常的图片。

文件上传漏洞原理与实例测试

上传一句话***进行绕过检测

文件上传漏洞原理与实例测试

为什么这次不能进行绕过?
     我们对文件名进行截断后,当数据包到Apache的时候,Apache会对截断处理这时截断的文件
     名变为当PHP判断时会发现文件的后缀为,然后我们就上传失败了....

 (以上只是我对上传失败的一点理解,欢迎指正。
  欢迎技术讨论,可以将上述方法绕过的同学欢迎指教。
  致谢...)

0x04 上传漏洞的防御

  1. 对面文件后缀进行检测

  2. 对文件类型进行检测

  3. 对文件内容进行检测

  4. 设置上传白名单


当前题目:文件上传漏洞原理与实例测试
本文链接:http://mzwzsj.com/article/jceigj.html

其他资讯

让你的专属顾问为你服务