文件上传漏洞

目录

一丶文件上传漏洞原理:

二丶绕过方法:

1.客户端javascript(检测文件扩展名)绕过:

2.服务端MIME类型检测(检查Content-Type内容)绕过:

3.文件幻数:

4.黑名单绕过:

1.windows特性:

2.三种绕过方式:

5.htaccess文件攻击:

6.白名单绕过:

1.%00截断

 2.图片马:

7.条件竞争:

8.中间件解析漏洞:

1.apache 解析漏洞

2.IIS5.x/6.0解析漏洞

3.IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

三丶防御上传漏洞:


一丶文件上传漏洞原理:

文件上传漏洞是由于对用户上传文件的代码过滤与验证做得不够严谨,导致攻击者可以上传可执行文件的脚本(php、cer、asp、xml等文件)到服务器的web目录中,使得攻击者在执行上传的恶意文件(木马、病毒、恶意脚本)时拿到服务器的控制权限从而达到控制网站的的目的。


二丶绕过方法:


1.客户端javascript(检测文件扩展名)绕过:

原理:

利用js的过滤方式只在前端限制了上传文件的类型 后端一般不再做过滤 。

绕过方式:

所以正常上传符合格式的文件,通过BP抓包,修改前端发送给后端的数据 ,达到绕过前端js过滤的目的。

这里用得靶场是upload-labs的pass-4

从图中得知,需要向服务器上传jpg之类的文件,而我想要上传php文件,可以先将php改为jpg,然后在提交时抓包,将文件后缀再更改为php

查看源码,可以看到上传功能只做了前端的检查,那就很简单了,直接BP抓包就好了

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $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 = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

开始实战:

1.首先,记事本写入我们php的代码,尾缀修改成jpg之类的格式

 2.上传我们刚刚修改的jpg格式的文件,BP抓包,将shell.jpg改成shell.php即可

3.通过服务器的上传路径访问我们上传的文件即可


2.服务端MIME类型检测(检查Content-Type内容)绕过:

原理:

MIME检测的是数据包里面的content-type字段。常见的图片格式的MIME类型有:

PNG:image/png

GIF:imaged/gif

JPG:image/jpeg

绕过方式:BP抓包修改Content-Type

开始实战:

1.通过BP抓包,检查Content-Type内容

2.上传文件后,进行抓包,将content-type字段修改成以上类型

3.修改完后路径访问即可 


3.文件幻数:

原理:

图片格式往往不是根据文件后缀名去做判断的。文件头是文件开头的一段二进制,不同的图片类型,文件头是不同的。文件头又称文件幻数。

 常见文件幻数:

  • JPG: FF D8 FF EO 00 10 4A 46 49 46.
  • GIF:47 49 46 3839 61(GIF89a).
  • PNG:89 50 4E 47

文件头伪装绕过:

过程:上传一张正常jpg图片,BP抓包的时候在内容中插入PHP代码即可


4.黑名单绕过:

原理:

所谓黑名单就是不让用户上传的文件扩展名(php,asp,xml,php2等等)

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $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",".ini");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');
        $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.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

从源码可以看出在后端做了黑名单的校验与过滤

1.windows特性:

1.windows会自动去除 . 和 空格的特性,在后缀加 . 和空格绕过。

2.在window的时候如果文件名+'::$DATA'会把::$DATA之后的数据当成文件流处理,不会检测后缀名。且保留::$DATA之前的文件名,可在后缀名中加::$DATA绕过。

2.三种绕过方式:

点空格绕过:

1.我通过DEBUG得知源码过滤的点与空格都都只能过滤几次,这时候我们多来几个点和空格的组合即可。

 ::$DATA绕过:

2.还可以看出源码对::$DATA的过滤只做了一次,这时候我们对::$DATA复写,这种方法也可以绕过。

大小写绕过:

3.因为后端没有将后缀名转换为统一格式进行对比,所以我们可以上传后缀为pHp,Php的文件,又因为Windows操作系统大小写不敏感,所以pHp,Php等被扔回被当成PHP文件解析。


5.htaccess文件攻击:

原理:

.htaccess文件攻击即结合黑名单攻击服务器的 .htaccess文件 。 通过move_uploaded_file函数把自己写的 .htaccess文件覆盖掉服务器上的这样就可以解析定义名单了。 .htaccess文件用处:         通过.htaccess文件调用php解释器去解析一个文件名中只要包含“haha”这个字符串的任意文件,无论你文件名是什么样子,只要包含”haha”这个字符串,都可以被以php的方式来解析。

.htaccess文件内容:

<FilesMatch “haha”> SetHandler application/x-httpd-php </FilesMatch>

开始实战:

1.首先,这次操作可以不需要抓包(除非名字修改不成.htaccess),准备两个文件,一个是.htaccess的txt文件与名为haha的马子文件且尾缀为jpg的文件。

2.将它们两都上传到服务器

3.通过网站的upload路径访问我们的haha.jpg文件,这时候服务端就会将我们的jpg文件当php文件执行了。 


6.白名单绕过:

原理:

所谓的白名单就是允许用户上传的文件扩展名(jpg,png,gif等)


直接看源码,明显看出此时的代码是白名单上传,只允许jpg,png,gif这3种后缀上传,那之前的什么大小写绕过,复写绕过,.htaccess文件上传等方式都无效了

$is_upload = false;
$msg = null;
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 = $_POST['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.%00截断

前提条件:

  1. php版本小于5.3.4

  2. php的magic_quotes_gpc为OFF状态

%00能截断的原理:

无论0x00还是%00,最终被解析后都是一个东西:chr(0)
chr()是一个函数,这个函数是用来返回参数所对应的字符的,也就是说,参数是一个ASCII码,返回的值是一个字符,类型为string。
那么chr(0)就很好理解了,对照ASCII码表可以知道,ASCII码为0-127的数字,每个数字对应一个字符,而0对应的就是NUT字符(NULL),也就是空字符,而截断的关键就是这个空字符,当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。

要想%00能绕过后端验证其实还得有有个先天条件
对方的文件路径可控,从对方源码可以看出$_GET['save_path']没有做任何过滤且被我们可控

$is_upload = false;
$msg = null;
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;

开始实战:

1.一样的准备一个jpg尾缀的马子

2.BP抓包分析,filename我们不用改,让它们尽管验,我们在upload/后面下手,加入文件名.php%00

 3.上传成功之后我们就开始访问吧,在Response模块右键点击Show response in browser,rh

 点击Copy,将路径拷贝下来

将Copy的路径输入之后发现有个破损的图片,右键破损的图片,以新建标签页打开图像

 发现报了个404 页面,问题不大,但是我们发现shell.php也上传成功了

删除后面的乱七八糟的东西即可,这样我们的马子就上传成功了

 第二种%00截断,这种是针对POST请求的或者是有时候直接BP抓包打上%00不管用,这时候就用上了BP的Hex模块,16进制的null字符也就是00,也能做到截断(这里我在php后面打多个w是为了做个标记) 

找到刚刚标记的w也就是77,把它改成00即可,后面的过程和上面一样也就不多赘述了。

 2.图片马:

原理:

由于一般直接上传木马文件都会被过滤拦截,这时候就需要用到图片马。

所谓图片马,就是将一句话木马与图片相结合,使得图片中包含代码。

1.创建图片马:

首先,准备一个php文件(写入一句马)与一张正常的图片

cmd 执行 copy /b 2.png+2.php=shell.jpg

/b 表示以二进制方式打开

/a 表示以ASCII方式打

然后向网站上传我们的图片马

 我们可以发现上传图片马到服务器之后,右键打开图像发现并不会帮我们执行php的代码

这时候我们就需要利用,文件包含漏洞访问图片马,这题参考的是upload-labs靶场的第14题

文件包含漏洞前提条件:

1.php的配置文件allow_url_include为On

2.拿到include文件的路径

使用路径加?file=upload/文件名.jpg

使用本地访问,这样就可以执行我们的马子了

7.条件竞争:

条件竞争其实利用的是程序员没正确使用好move_uploaded_file()函数导致出现的逻辑漏洞,源码大概的意思是即使用户上传了非法文件,但move_uploaded_file()函数会先将上传文件临时保存进网站的保存目录,然后再检查,检查失败则使用unlink函数删除文件。

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);

渗透思路:

使用BurpSuite的Intruder不断上传shell.php,并且使用BurpSuite不断访问shell.php,即可造成条件解析漏洞。

漏洞复现:

1.首先准备一个shell.php文件 

shell.php的内容是file_put_contents(文件名,文件内容),目的是执行shell.php的时候,shell.php又给我们创建了另外一个php文件 

2.使用BP抓两个包,一个用来不断上传shell.php,另一个用来不断访问shell.php

 然后发送到BP的intruder模块,去到payload,调整Payload type为number,次数调成10000次

然后去Options模块调线程为30(多大就具体看电脑抗不抗造) ,然后点击Start attack

接下来就看跑包就可以了,可以看到我才跑了不到一千个包,我的shell_second.php就出来


8.中间件解析漏洞:

1.apache 解析漏洞

前提:

无版本限制至今都有这种漏洞

漏洞原理:

对于Apache来说,它认为一个文件可以有多个后缀,例如:

test.txt.php.gif,但是在大多是的Windows操作系统中,认为最后一个“.”后的才为后缀。

Apache解析文件的规则就是从右到左开始判断,如果在识别过程遇到Apache不认识的不可解析的文件的时候,则继续往左判断,比如test.php.xxxx.iloveu,xxxx与iloveu这种尾缀固然不存在,Apache也固然解析不了所以Apache就会将test.txt.php.gif解析成test.php,就只解析它认识的东西。

漏洞形式:www.xxx.com/test.php.xxxx

开始操作:

可以看到即使最后的尾缀为xxx,还是执行了我的phpinfo()的php代码

 现在修改一下文件里面的内容,该文执行system函数

 我执行了ping命令,可以看到虽然有点乱码,但是还是可以看出ping命令执行成功了

2.IIS5.x/6.0解析漏洞

前提:

IIS5.0-6.0版本

因为IIS5.0-6.0版本服务器大多为windows server 2003,由于网站比较古老,开发语句一般为asp,所以该解析漏洞只能解析asp文件

1.目录解析漏洞:

漏洞原理:

服务器会默认把asp,asa目录下的文件都解析成asp文件

例如创建一个文件夹,将文件夹重命名为test.asp,那么在此文件夹内创建一个一句话木马,会被当成asp解析,如果攻击者可以控制上传文件夹路径,那么就可以拿到shell的控制权

漏洞形式:www.xxx.com/xx.asp/xx.txt

漏洞复现:

1.创建一个带.asp尾缀的目录

 2.这里我创建了一个没有执行功能的.txt文件

 3.写入一个打印当前时间的函数

 

 4.访问路test.asp路径下的1.txt文件,发现我们的1.txt被当做asp文件解析执行了我们的函数

 

2.文件解析漏洞:

漏洞原理:

服务器默认不解析;后面的内容,因此xx.asp;.jpg会解析成asp文件

漏洞形式:www.xxx.com/xx.asp;.jpg

漏洞复现:

1.一样的首先创建一个2.asp;jpg格式的文件,里面写上需要执行的函数

 2.使用路径访问文件,可以发现服务器并没有解析;后面的内容,而是直接当成asp文件解析执行了

3.IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞

前提:

IIS 7.0/IIS 7.5/ Nginx <8.03 版本

漏洞原理:IIS 7.0/IIS 7.5/ Nginx <8.03在Fast-CGI运行模式下,在一个文件路径例如xx.jpg后面加上/xx.php会将/xx.jpg/xx.php 解析为 php 文件。

漏洞形式:www.xxx.com/xx.jpg/xx.php

漏洞复现:

因为IIS 7.0/IIS 7.5/ 与Nginx <8.03的原理都一样我就拿Nginx举例子就好了

这里首先我上传了一个图片马(图片马的创建在上面6.2有,这里我就不多赘诉)

用路径访问图片马,发现服务器执行的是jpg格式的文件

然后我们在路径后面加上/1.php发现这时shell.jpg就以php执行了。利用这个漏洞就使用文件包含就能做到执行图片马了。


三丶防御上传漏洞:

1.使用白名单的方式检验文件扩展名

2.隐藏用户文件上传目录

3.php配置文件magic_quotes_gpc为On

4.设置用户对上传文件的目录只有读写权限,没有执行权限

5.文件幻数检测(只能防住没有恶意的用户)

6.以时间戳和随机数的方式对上传的文件重命名

7.检验文件内容(预防图片马)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值