Upload-labs文件上传(11-19)

十一关(00截断GET方式)

首先查看一下源代码:

  $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;

基础补充两个函数:substr()、strrpos()

strrpos()
定义和用法
strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。
注释:strrpos() 函数对大小写敏感。
相关函数:
stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)
语法
strrpos(string,find,start)
参数  描述
string  必需。规定被搜索的字符串。
find    必需。规定要查找的字符。
start   可选。规定在何处开始搜索。
substr()
这里写代码片语法
substr(string,start,length)
参数  描述
string  必需。规定要返回其中一部分的字符串。
start   必需。规定在字符串的何处开始。正数 - 在字符串的指定位置开始  负数 - 在从字符串结尾开始的指定位置开始0 - 在字符串中的第一个字符处开始
length  可选。规定被返回字符串的长度。默认是直到字符串的结尾。正数 - 从 start 参数所在的位置返回的长度负数 - 从字符串末端返回的长度

理解测试代码:

<?php
$a = '1.jpg';
$file_ext = substr($a,strrpos($a,".")+1);
var_dump($file_ext);
?>
返回jpg

分析代码:

$img_path = $_GET['save_path']."/".rand(10,99).date("YmdHis").".".$file_ext;

发现那个路径没有处理直接拼接上去的。所以可以利用00截断绕过。但是发现怎么截断都没有用。查阅资料:

截断条件:
    php版本小于5.3.4 详情关注CVE-2006-7243
    php的magic_quotes_gpc为OFF状态

这里写图片描述
准备就绪,开始测试:
这里写图片描述
上传成功,而且可以利用!
这里写图片描述


十二关(00截断POST方式)

和十一关不同的是这次的save_path是通过post传进来的,还是利用00截断,但这次需要在二进制中进行修改,因为post不会像get对%00进行自动解码。
我们依然使用00截断方法:
这里写图片描述

来到+号对应的二进制2b将他改为00
这里写图片描述
就可以进行上传且成功利用。
这里写图片描述


十三关(图片马上传)

我们查看主要代码:

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

发现主要是取上传文件的头两个字节判断文件类型,因此直接上传图片马即可,制作方法:
copy normal.jpg /b + shell.php /a webshell.jpg
上传图片马:
这里写图片描述
成功上传,而且得到文件的名称。我们后期如果存在文件包含漏洞就可以利用。
这里写图片描述
比如我们简单写一个存在文件包含漏洞的页面:

<?php

$file = $_GET[ 'page' ];
include($file);

?> 

发现可以成功利用漏洞:
这里写图片描述


十四关(图片马上传getimagesize函数)

查看关键代码:

$types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);

这里用getimagesize获取文件类型,还是直接就可以利用图片马就可进行绕过,
知识补充点:

array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。

如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条 E_WARNING 级的错误。

用上一关的图片木马进行上传
这里写图片描述
依然可以上传。利用方式和上一关一样,需要文件包含漏洞

十五关(图片马上传php_exif)

本关还是要上传一个图片马,这里用到php_exif模块来判断文件类型,还是直接就可以利用图片马就可进行绕过就不多说。

十六关(图片马上传,重新渲染)

本关还是要上传一个图片马。

imagecreatefrom 系列函数用于从文件或 URL 载入一幅图像,成功返回图像资源,失败则返回一个空字符串。
该系列函数有:
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
imagecreatefromwbmp():创建一块画布,并从 WBMP 文件或 URL 地址载入一副图像
imagecreatefromstring():创建一块画布,并从字符串中的图像流新建一副图像

十七关(图片马上传)

本关考察的是条件竞争利用比较鸡肋。。。。,这里先将文件上传到服务器,然后通过rename修改名称,再通过unlink删除文件,因此可以通过条件竞争的方式在unlink之前,访问webshell。具体没实现成功。后面再研究

十八关(图片马上传)

可以直接上传图片马

十九关(CVE-2015-2348 move_uploaded_file() 00截断)

$img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $img_path)) { 
                $is_upload = true;
            }else{
                $msg = '上传失败!';
            }

CVE-2015-2348 move_uploaded_file() 00截断,上传webshell,同时自定义保存名称,直接保存为php是不行的
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过:
利用方式:
这里写图片描述

利用成功!
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29647709/article/details/81264120