详解php文件上传漏洞及upload-labs-master下载

本文实验环境:upload-labs-master

链接:https://pan.baidu.com/s/1AD3eaAOrAqJDd0c5UTQZNw
提取码:9rsd

php文件上传漏洞

接下来我会从php文件上传如何用开发写起,同时希望渗透测试的小白们,不要忽略开发,只有懂开发,才能更好的进行测试。

文件上传

  • 定义:文件上传,指给定用户提供文件上传表单,用户将文件从本机电脑上传到服务器的过程,而且这个过程需要操作系统为中间媒介来完成。

制作文件上传表单

  • 文件上传表单 input中 file实现
  • post方式上传(文件通常比较大)
  • 文件以二进制方式上传,不是普通字节流(需要用http协议上传)
  • 表单form使用属性enctype,enctype保单内容处理属性
enctype分类

1.enctype=‘appliaction/x-www-form-urlencoded’,默认值(ASCII编码)
2.enctype=‘multipart/form-data’,表示不对数据进行编码(二进制不编码)
3.enctype=‘text/plain’,只对空格进行编码,其他不编码


详解php文件上传漏洞及upload-labs-master下载_第1张图片

PHP接收器

  • 一旦客户端文件上传成功,可使用$_FILES来接受文件
简单接受文件

//查看post提交的数据
var_dump($_POST);
echo "
"
; //查看文件数据 var_dump($_FILES);

在这里插入图片描述

_FILE(5个信息)
  • name:文件在客户端本地的客户名
  • type:文件的类型(MIME类型)
  • tmp_name:文件在服务器端操作系统接受后保存的临时文件名字;默认是操作系统的临时文件存储目录(通过PHP配置文件修改)
  • error:错误代码
  • size:文件大小
通过文件上传,上传的文件会保存在临时文件中,PHP如果不做处理,那么操作系统就会认为数据没有意义,自动清除。因此PHP需要将临时文件内进行转移到指定位置,使用函数:move_uploaded_file(临时文件路径,目标存储位置),存储到目标位置

//取出文件操作
$file = $_FILES['file'];
//简单判断
if($file['error']==0) {
	//移动文件
	move_uploaded_file($file['tmp_name'],'目标文件地址');
//move_uploaded_file($file['tmp_name'],'D:\PhpStudy20180211\PHPTutorial\WWW\WWW\upload\upload\upload'.$file['name'] );
}

通过这段代码,就会将上传的文件,移动指定位置。

由于上传的文件可能是木马或者病毒,所以我们对用户上传进行检测和过滤(测试的小伙伴这是重点)

//文件后缀进行检测
$allowed = array(
    "gif",
    "jpeg",
    "jpg",
    "png",
    "php",
    "phtml",
);
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp);
if(in_array($extension, $allowed)){ }
//文件类型进行检测
if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/pjpeg") || ($_FILES["file"]["type"] == "image/x-png") || ($_FILES["file"]["type"] == "image/png")) || ($_FILES["file"]["type"] == "application/octet-stream")){}
//有效性检测
if(!isset($file['error'])){}
//路径判断
if(!is_dir($path)){}
//文件大小判断
if($file['size']>$size){}

其中对文件后缀、文件类型、文件有效性、文件路径、文件大小进行检测

文件上传漏洞

  • 攻击者可以利用提供的文件上传功能,将恶意代码植入到服务器,之后通过rul去访问执行代码达到执行代码攻击的目的

文件上传漏洞原因

  • 服务器配置不当
  • 本地文件上传限制被绕过
  • 服务器过滤不严格或被绕过
  • 文件解析漏洞导致文件执行
  • 文件路径截断

利用条件

  • 恶意文件可以上传成功
  • 知道上传后文件的路径
  • 恶意文件可被访问或执行

文件上传过程(上面已经详细介绍,这里不再细说)

  • post方式上传(文件通常比较大)
  • 文件以二进制方式上传,不是普通字节流(需要用http协议上传)

实战

文件上传漏洞有各种姿势的绕过,各种奇淫技巧,下面我将详细介绍

客户端(js绕过)

  • 我们以upload-labs Pass-1为例
    在这里插入图片描述
    1.客户端检测函数
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;
    }
}
  • 通过前端检测函数checkFile(),发现只有后缀名为.jpg.png.gif允许上传,其他的都不允许
  • 在渗透测试中,无法获得目标网站对文件上传的源代码设计,那么如何判断是客户端校验还是服务器的校验,流程如下
利用方式

1.我们可以将一句话木马1.php,改名为1.jpg
2.打开burpsuit进行抓包,并且上传1.jpg
3.将bp抓到的包,上传的文件后缀进行修改,将1.jpg改为1.php
详解php文件上传漏洞及upload-labs-master下载_第2张图片
通过上面的步骤,我们就绕过了浏览器前端检测,php一句话木马上传到了服务器,我们访问我们上传的文件
详解php文件上传漏洞及upload-labs-master下载_第3张图片
4.通过蚁剑进行链接即可

  • 对于客户端检测,还可以配置浏览器禁用js脚本,也可以绕过,这里不做演示

服务器端type(MIME类型检测绕过)

  • MIME类型检测属于白名单检测的一种,在服务器端完成检测,他会对上传文件请求包中Content-Type的内容进行校验,判断是否属于白名单,如果不属于则不允许上传
  • 一般Content-Type会通过http头进行传输,所以我们就可以尝试抓包改包绕过

Pass-2

在这里插入图片描述

  • 由于进行了MIME检测,所以我们直接上传1.php是不行的。当然也不能像绕过web前端一样绕过

1.服务器端检测代码

  • 通过代码审计我们发现,只有图片类型的,其他类型都无法上传

2.于是我们有两种想法:

  • 上传图片马,但是这种比较麻烦,即使上传成功也无发直接利用
  • 上传php文件,通过bp抓包,修改文件类型,将其改为MIME允许的类型

我们尝试第二种方法

  • 我们上传了1.php文件
  • 通过bp抓包,发现Content-Type是我们可控的
  • 我们将Content-Type修改为MIME允许的类型
    详解php文件上传漏洞及upload-labs-master下载_第4张图片
  • 这样就可绕过

服务器目录路径检测绕过(%00截断)

  • 检测路径的合法性

Pass-12

在这里插入图片描述

  • 服务器端检测代码
  • 通过审计源代码我们发现,这个检测会对文件后缀进行检测,它并不会检测他的类型,并且在最后会拼接文件路径
绕过方式:

1.我们可以使用截断绕过(上传一个1.php%00.jpg)这样就可以绕过检测
在这里插入图片描述

  • 1.php,服务器会检测文件后缀,发现是jpg,从而绕过检测
  • 1.php%00,在路径拼接时%00会将后面的内容全部截断,这样就可以注释掉后面的内容,上传到服务器的文件就会以php脚本进行解析
    详解php文件上传漏洞及upload-labs-master下载_第5张图片
  • 这样就会上传成功

php %00截断,在php 5.3.4中php修复了0字符,但是在之前的版本中00在php中危害较大。

文件扩展名检测绕过

  • 假定服务器采用黑名单检测方式,检测我们文件的扩展名
Pass-06

详解php文件上传漏洞及upload-labs-master下载_第6张图片

1.对于黑名单绕过,其实比较简单,我们可以上传PhP或者PHP这写不在黑名单里的,就可以绕过文件检测
2.将1.php改为1.PhP
在这里插入图片描述
2.上传成功
在这里插入图片描述
3.上传后的大小写绕过的php文件,比如:PHP、PhP等等,是无法执行的,我们还需要将它的名字修改为php才可以

服务器端文件内容检测绕过

  • 文件检测内容对应上传的文件的内容进行检测,常见检测犯法有:幻术检测、exif_imagetype()检测、getimagesize()检测、二次渲染等
  • 我们通常使用图片马绕过
Pass-14

详解php文件上传漏洞及upload-labs-master下载_第7张图片
1.制作图片马(copy 1.jpg/a + 1.php/b 2.jpg)
在这里插入图片描述
2.上传图片马
2.图片马无法直接连接执行,所以我们不能直接使用,所以要配合其他漏洞使用
3.我们在当前文件夹中,发现了文件包含的代码include.php
详解php文件上传漏洞及upload-labs-master下载_第8张图片

4.使用文件包含漏洞,使得include.php解析上传图片马

http://localhost/WWW/upload2/upload2/Pass-14/include.php?file=4220200601214152.png

5.蚁剑直接连接就行

你可能感兴趣的:(详解php文件上传漏洞及upload-labs-master下载)