2006-08-28
■[SECURITY] IE7 によるファイルアップロード時のフルパスの送信

Internet Explorer 6 では、<input type="file"> を使用してファイルのアップロードを行うときに、ファイル名をフルパスで送信するため、マイドキュメントなどに置かれてるファイルをアップロードすると、ログインユーザ名がサーバ側に漏洩するという問題がありました*1。
例えば、マイドキュメントに置かれているファイルを送信した場合、IEから送られるリクエストは以下のようになります(抜粋)。
POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d611f24420292
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache
-----------------------------7d611f24420292
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\hasegawa\My Documents\test.txt"
Content-Type: text/plain
Content-Disposition として送信しているファイル名中に、Windows へのログインユーザ名である hasegawa が含まれているのが見て取れます。
さて、IE7 では、リリース ノートを見てみると、次のような記述があります。
ファイル選択のコントロール - Input TYPE=FILE コントロールは、完全修飾パスを送信せず、ファイル名のみを送信するようになりました。
これで安心と思いたいところですが、デフォルトでは相変わらずファイル名をフルパスで送信しています。
これを抑制するには、"Internet Option" の "Securit" タブを表示させ、各ゾーンで "Custom level" をクリックし、
Include local directory path when uploading to a server
というオプションを "Disable" に変更してやる必要があります*2。これで、ファイルをアップロードした場合にファイル名がフルパスで送信されることはなくなります。
POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d611f24420292
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache
-----------------------------7d611f24420292
Content-Disposition: form-data; name="file1"; filename="test.txt"
Content-Type: text/plain
…が、マイコンピュータゾーンからファイルをアップロードした場合には、ファイル名がフルパスで送信されるようです。
以下、実験。インターネットゾーンでのファイル送信時にフルパスを送信しないように、"Include local directory path when uploading to a server" を Disable に設定します。次に、以下のような HTML をマイコンピュータ上に作成します。
<html><html><body> <form method="post" action="インターネットゾーンのURL" enctype="multipart/form-data"> <input type="file" name="file1"> <input type="submit"> </form></body></html>
IE7 でその HTML を開くと、ゾーンがマイコンピュータゾーンとなっていることを確認します。その状態で適当なファイルを選択し、ファイルをアップロードするとファイル名がフルパスで送信されてしまいます。うーむ。
POST /upload.cgi HTTP/1.1
Content-Type: multipart/form-data;
boundary=---------------------------7d6da325a104fc
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: XXX.XXX.XXX.XXX
Pragma: no-cache
-----------------------------7d6da325a104fc
Content-Disposition: form-data; name="file1"; filename="C:\Documents and Settings\hasegawa\My Documents\test.txt"
Content-Type: text/plain
- 127 http://www.st.ryukoku.ac.jp/~kjm/security/antenna/
- 82 http://pooh.gr.jp/link.html
- 7 http://reader.livedoor.com/reader/
- 4 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=Office personal Editionとは
- 4 http://stressfulangel.cocolog-nifty.com/
- 2 http://a.hatena.ne.jp/comiken/simple
- 2 http://b.hatena.ne.jp/nyakashin/c++/?mode=detail
- 2 http://b.hatena.ne.jp/t?tag=unicode&of=25&sort=hot&threshold=5
- 2 http://pooh.gr.jp/archive-1-2006-05.html
- 2 http://r.hatena.ne.jp/hajikko/受信箱/http://d.hatena.ne.jp/hasegawayosuke/rss
今までのWebアプリ開発側は、アップロードファイルのファイル名を取得するのには、フルパスで到着したデータを「¥」で分割して....って処理を行っていたものですが、この仕様が普及していけば、怠惰なSEによっては、ファイル名だけで渡されるものと期待してしまうでしょうね。....数年後にファイルアップロード可能なWebアプリサイトで、ディレクトリトラバーサルが多発する予感。
現実化しなければいいけど....