Upload_labs by L0st

8474 ワード

ミドルウェアの脆弱性


IIS

  • IIS6.0ファイル解析xx.asp;.jpg
  • IIS6.0ディレクトリ解析xx.asp/1.jpg
  • IIS 7.0奇形解析xxx.jpg/x.asp

  • Apache

  • %0a(CVE-2017-15715)
  • 未知の接尾辞test.php.xxx

  • Nginx

  • アクセス接続プラス/xxx.php test.jpg/xxx.php
  • 奇形解析脆弱性test.jpg%00xxx.php
  • CVE-2013-4547 test.jpg(非符号化スペース)0 x.php

  • Tomcat

  • xxx.jsp/
  • xxx.jsp%20
  • xxx.jsp::$DATA

  • Upload-Labs練習


    pass-01


    phpファイルを転送して、ポイントアップロードして、弾窓はこのファイルがアップロードできないと言って、処理の速度によってフロントエンドがファイルが合法かどうかを判断するべきだと推定して、だからソースコードを見て、やはりjavascriptがあります:
    
        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;
            }
        }
    
    

    ページ要素からonsubmitイベントを直接削除すると、アップロードできます.ファイル名を1に変更することもできます.jpg、burp suiteパッケージでファイル名を1に変更します.php、フロントエンドチェックを迂回します.

    pass-02


    アップロード1.jpgでburpsuiteで接尾辞を変更すればいいです.
        $is_upload = false;
        $msg = null;
        if (isset($_POST['submit'])) {
            if (file_exists($UPLOAD_ADDR)) {
                if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
                    if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                        $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                        $is_upload = true;
    
                    }
                } else {
                    $msg = ' , !';
                }
            } else {
                $msg = $UPLOAD_ADDR.' , !';
            }
        }
    
    

    サービス側はMIMEをチェックすることでファイルタイプを決定することがわかります

    pass-03


    アップロードします.phpファイル、ヒントasp、aspx、php、jsp接尾辞ファイルのアップロードは許可されていません.では、接尾辞から始めましょう.
    Apacheサーバには、右から左へファイル接尾辞を解析する特性があり、右端の拡張子が認識できない場合は、認識可能な接尾辞に出会うまで左へ判断し続けるので、ここでは1をアップロードする.php.xxxxは迂回できます
    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists($UPLOAD_ADDR)) {
            $deny_ext = array('.asp','.aspx','.php','.jsp');
            $file_name = trim($_FILES['upload_file']['name']);
            $file_name = deldot($file_name);// 
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); // 
            $file_ext = str_ireplace('::$DATA', '', $file_ext);// ::$DATA
            $file_ext = trim($file_ext); // 
    
            if(!in_array($file_ext, $deny_ext)) {
                if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR. '/' . $_FILES['upload_file']['name'])) {
                     $img_path = $UPLOAD_ADDR .'/'. $_FILES['upload_file']['name'];
                     $is_upload = true;
                }
            } else {
                $msg = ' .asp,.aspx,.php,.jsp !';
            }
        } else {
            $msg = $UPLOAD_ADDR . ' , !';
        }
    }
    

    ブラックリストの判断に基づいている以上、Apacheがphp、phtml接尾辞のファイルを解析できることを知る必要があるので、アップロードします.phtml直接迂回

    pass-04

  • ここでは、依然としてアップロードすることができる.php.xxxxバイパス検査
  • アップロードhtaccessを上書きするもよい:1つアップロードする.htaccessファイルには、
  • という内容が含まれています.
    SetHandler application/x-httpd-php 
    

    または
    
    SetHandler application/x-httpd-php
    
    

    そして任意の接尾辞のファイルを勝手にアップロードするとapacheはphp解析として扱われる.ソース:
    $is_upload = false;
    $msg = null;
    if (isset($_POST['submit'])) {
        if (file_exists($UPLOAD_ADDR)) {
            $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
            $file_name = trim($_FILES['upload_file']['name']);
            $file_name = deldot($file_name);// 
            $file_ext = strrchr($file_name, '.');
            $file_ext = strtolower($file_ext); // 
            $file_ext = str_ireplace('::$DATA', '', $file_ext);// ::$DATA
            $file_ext = trim($file_ext); // 
    
            if (!in_array($file_ext, $deny_ext)) {
                if (move_uploaded_file($_FILES['upload_file']['tmp_name'], $UPLOAD_ADDR . '/' . $_FILES['upload_file']['name'])) {
                    $img_path = $UPLOAD_ADDR . $_FILES['upload_file']['name'];
                    $is_upload = true;
                }
            } else {
                $msg = ' !';
            }
        } else {
            $msg = $UPLOAD_ADDR . ' , !';
        }
    }
    

    pass-05

  • apache解析特性を利用してアップロード1.php.xxxxは
  • を迂回する
  • ソースコードを見ると、ファイル名の大文字と小文字が統一されていないことが分かった.PHPは検証
  • を迂回することができる

    pass-06

  • apache解析特性を利用してアップロード1.php.xxxxは
  • を迂回する
  • Burpsuiteパッケージでファイル名を変更し、接尾辞の末尾にスペースを付けると
  • を迂回できます.

    pass-07

  • 直接アップロード1.php.xxxx
  • ファイル接尾辞名に加算.(Windowsシステムはファイル名の末尾の.とスペースを自動的に除去します)
  • pass-08


    ソースコードを見ると、ここにはファイル名がありません.DATAは迂回できます.

    pass-09


    ソースコードのフィルタルールを表示し、ファイル名を'1に設定します.php. .' ルールチェックを省略できます

    pass-10


    プログラム使用str_Ireplace関数はファイル名の敏感な字を置き換えたが、この関数は1回しか一致しないので、接尾辞名を2回書いて迂回した:1.pphphp

    pass-11


    ソースコードを表示するとホワイトリストでフィルタリングされますがurlでgetでsave_がコミットされます.pathパラメータをファイル名に接続するため、/?を変更します.sava_path=../upload/1.php%00使用%00は$GET('save_path')の後ろのファイル名が切り捨てられています.次に1をアップロードします.jpg迂回
    $is_upload = false;
    $msg = null;
    if(isset($_POST['submit'])){
        $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;
    
            if(move_uploaded_file($temp_file,$img_path)){    
                $is_upload = true;
            }
            else{
                $msg = ' !';
            }
        }
        else{
            $msg = " .jpg|.png|.gif !";
        }
    }
    

    pass-12


    pass-11と変わらずsave_をコミットするだけですpathパラメータの方法はPOSTに変更し、burpsuiteでパッケージをキャプチャして修正すればよい.

    pass-13


    ソースコードを見ると、ファイルの最初の2バイトを読み取ることでファイルのタイプが判断されるので、画像馬を作成する必要があります:copy normal.jpg/b+shell.php/a webshell.jpgパラメータ/bは、ファイルをバイナリ形式でコピー、マージすることを指定します.画像クラス/音声クラスファイルパラメータ/aは、ASCII形式でファイルをコピー、マージすることを指定します.txtなどのドキュメントクラスファイルに使用

    pass-14


    プログラムはgetimagesize()関数を用いて画像情報を取得するので,画像馬を作成してチェックを迂回する

    pass-15


    プログラムはexif_を使用します.imagetype()関数はファイルタイプを取得するので、画像を作成して馬を迂回してチェックします.

    pass-16


    ソースコードを見てバックエンドプログラムが画像に対してimagecreatefromgif()操作を行ったことを見て、つまりファイルが合法gifファイルであるかどうかを判断して、ここで私達は画像馬をアップロードして、burpsuiteでパッケージをつかんで、Content-Typeの下で2行、つまりファイルの内容の冒頭でGIF 89 aを追加して、検証を迂回することができます
    imagecreatefromgif()関数を迂回する方法https://secgeek.net/bookfresh-vulnerability/

    pass-17


    競合条件

    pass-18


    競合条件

    pass-19


    ファイル名で0 x 00トランケートを使用して迂回