Hatena::ブログ(Diary)

思い立ったら書く日記

 | 

2010-07-18

XMLHttpRequestオブジェクトを使ったTRACEメソッド送信のブラウザ対応状況を確認してみる

| 11:45 | XMLHttpRequestオブジェクトを使ったTRACEメソッド送信のブラウザ対応状況を確認してみるを含むブックマーク

HTTPのTRACEメソッドを悪用する古い攻撃手法に「Cross Site Tracing(XST)」というものがあります。この攻撃手法を悪用すると、第三者が Cross Site Scripting(XSS)の脆弱性が存在するWeb サイトとブラウザの間でやり取りされる HTTP リクエスト・ヘッダを取得できてしまいます。この手法は一般的に HTTP リクエスト・ヘッダに含まれる Authorization ヘッダや Cookie ヘッダを奪取するために悪用されるようですね。

XST では一般的に JavaScriptXMLHttpRequest オブジェクトを悪用するようですが、最新のブラウザでも XMLHttpRequest オブジェクトで TRACE メソッドの HTTP リクエストを送信できるのでしょうか。というのも、W3CXMLHttpRequest オブジェクトに関する Working Draft*1 では、「TRACEメソッドであった場合、セキュリティ例外を発生させ、処理を中止すべき(should)である」*2との記述があります。このことから、現状のブラウザでは XMLHttpRequest オブジェクトを使って TRACE メソッドを送れないのでは?と考えました。そこで、最新の主要 5 ブラウザ(Internet Explorer, Mozilla Firefox, Opera, Safari for Windows, Google Chrome)で XMLHttpRequest オブジェクトを使った TRACE メソッドの HTTP リクエストを送信できるか確認してみました。

結論

主要 5 ブラウザでは、XMLHttpRequest オブジェクトを使った TRACE メソッドの HTTP リクエストを送信できませんでした(この日記執筆時点)。少なくとも JavaScript + XMLHttpRequest オブジェクトを悪用する XST は、現在はそもそも成功しづらい手法となっているようですね*3。XST が発見されたのが 2003 年 1 月頃であり、すでに 7 年以上も経過しています。この期間にブラウザもきちんと対策をすすめてきたと言えそうですね。過去にコンセプトとして発表されたが、実害が起きることもなく、現在では成立しない攻撃手法は他にも多そうです。

次節から確認方法、確認結果をまとめています。興味のある方のみどうぞ。

主要 5 ブラウザの対応状況の確認

確認方法

VMware Server上で動作している Ubuntu 8.04(IP: 192.168.0.250) に以下の HTML ファイルを用意し、主要 5 ブラウザでこの HTML ファイルを閲覧しました。この HTML ファイルを閲覧し、[CLICK] ボタンをクリックし、TRACE メソッドが送信されるか確認しました。正常に送信されれば、HTTP レスポンスをダイアログウインドウで確認できるという簡単な仕組みです。

<html>
<head>
<title>xmlHttpRequest Test -TRACE- </title>
<script type="text/javascript">
function a(){
var xmlHttp = new XMLHttpRequest;
xmlHttp.open("TRACE", "http://192.168.0.250/",false);
xmlHttp.send();
xmlDoc=xmlHttp.responseText;
alert(xmlDoc);
}
</script>
<body>
<input type="button" name="b" value="CLICK" onclick="a();">
</body>
</html>

ちなみに、"TRACE" を "GET" に変更し、手順どおり実行すると、以下のようになります。http://192.168.0.250/ の内容がダイアログウインドウに表示されました。

f:id:kaito834:20100718021135p:image:w383:h323


確認結果

主要 5 ブラウザの確認方法を実施した結果を以下の表にまとめました。大体のブラウザでは、確認方法を実施すると、JavaScript 実行時にエラーが発生します。主要 5 ブラウザすべてで XMLHttpRequest オブジェクトを使った TRACE メソッドの HTTP リクエストを送信できないことが分かります。

ブラウザバージョン結果
Internet Explorer8.0.6001.18702送信できない
Mozilla Firefox3.6.6送信できない
Opera10.60送信できない
Safari for Windows5.0送信できない
Google Chrome5.0.375.99送信できない

各ブラウザにおいて、確認方法を実施した際に生じたエラーを以下にまとめます。

Internet Explorer

f:id:kaito834:20100718022417p:image:w383:h323

なお、過去 Internet Explorer では "TRACE" を "\nTRACE" に変更することで、TRACE メソッドを送信できたようですが(参考情報を参照)、現在は修正されているようです。実際に "TRACE" を "\nTRACE" に変更して確認してみましたが、上図と同じ結果となりました。


Mozilla Firefox

f:id:kaito834:20100718023624p:image:w383:h323


Opera

f:id:kaito834:20100718023935p:image:w383:h323


Safari for Windows

f:id:kaito834:20100718024730p:image:w383:h323

Safari では初期設定で開発メニューが表示されていません。エラーコンソールを確認するためには、[設定]メニューから[詳細]タブの[メニューバーに"開発"メニューを表示]を有効にしておく必要があります。


Google Chrome

f:id:kaito834:20100718025628p:image:w383:h323

参考情報

*1:the 19 November 2009 Last Call Working Draft

*2Working Draft の「4.6.1 The open() method」の 4. を参照

*3:ブラウザの文字列チェックを回避して TRACE メソッド送信を可能とする回避手法の可能性、また Java Applet や Flash 等を悪用する方法の可能性があるため、100% 成功しないとは言えません

トラックバック - http://d.hatena.ne.jp/kaito834/20100718/1279421129
 |