渗透测试学习-漏洞讲解-03

渗透测试-上传漏洞

Posted by hmoytx on September 2, 2018

前言

前面讲到漏洞挖掘后一步是权限提升,再重新说明下,我理解的权限提升不是狭义上的提权,我把网站getshell和提权的步骤统一放在了权限提升这一步骤里面。拿下webshell的方法通常来说上传,本地写入,远程写入。这篇水文主要还是讲一下上传有关的内容。
在开始讲上传前,先说明下解析的问题,因为通常上传漏洞是要配合解析漏洞的。很多新手刚学的时候经常会有一个普遍的问题,会问:为什么我图片马传上去了,能访问了,菜刀连接不上。简单说就是基础不够扎实。任何一句话或者是大马要能利用的前提是必须能以网站脚本的格式执行,你上传了jpg,但是没有以php格式执行就没有卵用。

正文

网站后台的上传操作,通常是用来发布文章,其中需要一些图片,附件等。一般是不允许上传可执行脚本文件的,因为这样的危害很大。
简单的分析下php中的文件上传:

<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上传文件: <input type="file" name="upfile" />
    <input type="submit" value="上传" name="submit">
</form>
</body>
</html>
<?php

if (isset($_POST['submit'])) {
    var_dump($_FILES['upfile']);
    echo "文件名:".$_FILES['upfile']['name']."<br />";
    echo "文件大小:".$_FILES['upfile']['size']."<br />";
    echo "文件类型:".$_FILES['upfile']['type']."<br />";
    echo "临时路径:".$_FILES['upfile']['tmp_name']."<br />";
    echo "上传后系统返回值:".$_FILES['upfile']['error']."<br />";
    echo "====================保存分各线========================<br />";
if ($_FILES['upfile']['error'] == 0) {
    if (!is_dir("./uploads")) {
        mkdir("./uploads");
    }
    $dir = "./uploads/".$_FILES['upfile']['name'];
    move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
    echo "文件保存路径:".$dir."<br />";
    echo "上传成功...<br />";
    echo "图片预览:<br />";

}
}

表单提交文件,然后php通过全局变量$_FILES来接收文件的信息,move_uploadp_file()函数完成上传。在这个过程中,如果不对文件的进行检测就上传是十分危险的,攻击者直接就可以上传一个shell。
因此必须对文件进行检测,下面介绍下常见的几种防护方式。

防护方式

1.黑名单

黑名单防护机制主要是禁止上传特定格式的文件,如php,asp,aspx,jsp等格式的文件。

2.白名单

白名单防护机制主要是只允许上传特定格式的文件,如jpg,png等格式的文件。

3.文件后缀检验

检验文件的后缀名是否满足黑名单,白名单。

4.文件类型的检测

通过检测数据包中的content-type参数来判断是否为合法文件。代码如下:

<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上传文件: <input type="file" name="upfile" />
    <input type="submit" value="上传" name="submit">
</form>
</body>
</html>
<?php

if (isset($_POST['submit'])) {
    var_dump($_FILES['upfile']);
    echo "文件名:".$_FILES['upfile']['name']."<br />";
    echo "文件大小:".$_FILES['upfile']['size']."<br />";
    echo "文件类型:".$_FILES['upfile']['type']."<br />";
    echo "临时路径:".$_FILES['upfile']['tmp_name']."<br />";
    echo "上传后系统返回值:".$_FILES['upfile']['error']."<br />";
    echo "====================保存分各线========================<br />";
if($_FILES['upfile']['type'] != "image/gif") {     //获取Http请求头信息中ContentType
    echo "Sorry, we only allow uploading GIF images";
    exit;
   }
   $uploaddir = 'uploads/';
   $uploadfile = $uploaddir.basename($_FILES['upfile']['name']);
	 if (!is_dir("./uploads")) {
            mkdir("./uploads");
        }
        $dir = "./uploads/".$_FILES['upfile']['name'];
        move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
        echo "文件保存路径:".$dir."<br />";
        echo "上传成功...<br />";
        echo "图片预览:<br />";
}
}

如图
upload_1

5.文件头验证

特定如jpg,gif等文件,其文件用notepad打开可以看到总是以特定的一串字符开头,这种方式就检验这个文件头。

<html>
<head>
    <title>文件信息</title>
</head>
<meta charset="utf-8">
<body>
<form action="" enctype="multipart/form-data" method="POST" name="uploadfile">
    上传文件: <input type="file" name="upfile" />
    <input type="submit" value="上传" name="submit">
</form>
</body>
</html>

$imageinfo = getimagesize($_FILES['upfile']['tmp_name']);
if($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg') {
 echo "Sorry, we only accept GIF and JPEG images\n";
 exit;
}
$uploaddir = 'uploads/';
$uploadfile = $uploaddir . basename($_FILES['upfile']['name']);
if (!is_dir("./uploads")) {
            mkdir("./uploads");
        }
        $dir = "./uploads/".$_FILES['upfile']['name'];
        move_uploaded_file($_FILES['upfile']['tmp_name'],$dir);
        echo "文件保存路径:".$dir."<br />";
        echo "上传成功...<br />";
        echo "图片预览:<br />";
}

如图:
upload_2

绕过方式

1.黑名单

一般还是通过测试是否有遗漏的格式比如asa,ashx,cgi。

2.白名单

一般是要配合解析漏洞来利用。

3.文件后缀检测

通过特定的解析漏洞,或者使用%00截断。

%00截断

假定限制.php上传,将文件命名为.php.jpg,抓包以后将文件名改为.php%00.jpg。然后选中%00右键改为url编码。
upload_3

4.文件类型检测

修改content-type值为合法文件类型值即可。

5.文件头检测

通过构造图片马,上传注意命名为可执行格式,这个又要配合前面几种绕过方式来操作。

常见解析漏洞

IIS 6.0

目录解析:
1.asp/1.jap 该目录下所有文件都会以asp格式执行。
文件解析:
1.asp;.jgp 分号后面的不解析。

IIS7.5/Nginx < 8.0.3 fast-cgi开启导致的畸形解析

1.jpg/1.php 在文件后缀后加/x.php,文件便会以php格式执行。

apache解析漏洞

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断。
比如 a.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把a.php.owf.rar解析成php。

.htaccess文件

.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
实战中的应用:

            <Directory path>
            AddType  application/x-httpd-php  .jpg
            </Directory>

上传该文件到网站目录后,在上传图片马便会以php解析。

结语

由于作者很菜,所以讲得其实并不全面,其实上传漏洞的防护没有文中讲的那么简单,实际情况中还会有防护软件等。还是需要具体情况具体分析,没有代码只能一点点测试。编辑器漏洞这块这里就不展开了。