[Perl] プログラム言語 Perl についての覚え書き

CGI での HTTP_* に関するクロスサイトスクリプティング脆弱性

Last Update: 2003--1-0- (Sun) 27: 1

※この脆弱性は おでん田中さん2ちゃんねる のどっかのスレッドで発見した物です。私はこれで何が出来るか、という部分を検証したりしてみました。クロスサイトスクリプティング脆弱性については、IPA の解説等を参考にして下さい。

これを知った時はびびりました。なんせ、自分が作ったCGIスクリプトで USER_AGENT を表示する奴は全部汚染しているからです。

HTTP_USER_AGENT はブラウザの識別子の事で、例えば InternetExplorer なら Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 等と決まってるわけですが、この USER_AGENT はその辺にあるサードパーティ製のブラウザを使えば自由に編集可能です。自分の好きな名前を名乗る事が出来るんですね。

実はこの USER_AGENT に、実行可能なタグを埋め込んだりする事も出来ちゃう、というのが今回のお話しです。

タグを埋めるとどんな被害があるかと言うと、「対策を取っていない USER_AGENT を表示するCGIスクリプト」にアクセスしただけで、攻撃者の仕掛けた任意のスクリプトが実行されてしまうのです。アクセスログに USER_AGENT を表示するようにしてませんか?もし対策を取っていない場合は非常に危険です。非公開のアクセスログなら、被害も管理人だけで済む(自業自得というヤツ)のですが、もし掲示板スクリプトに USER_AGENT が表示されたら?掲示板にアクセスしに来たユーザーがもれなく危険にさらされる事になってしまいます。

では、どんなスクリプトが動かせるのか?いくつか検証を行ってみました。

ブラウザクラッシュ --- 有名ですね、ウィンドウを無限に開いてブラウザを落とす事に成功しました。
任意のページを表示させる --- スパイウェアなんかと同じように、指定したページを強制的に開かせる事が可能です。
クッキー略取 --- これが一番危険、その掲示板なりログ解析ページだかで使用中のクッキーを取得可能です。

では対策方法 Perl 版。USER_AGENT 以外のもの(Refererとか)も危険なので、環境変数は全部 HTML エスケープしちゃうのが安心です。Perl 以外は詳しく無いので省きますが、基本的にタグに使う「<>」この二つを弾けば平気でしょう。

foreach (%ENV) {
   s/&(?!(?:amp|quot|lt|gt);)/&amp;/g;
   s/"/&quot;/g;
   s/</&lt;/g;
   s/>/&gt;/g;
}

一般ユーザーの対策は、JavaScript を切る、というとても消極的な方法くらいしか思い浮かばない。あとは、こういう脆弱性がある事を色々なサイトの管理人さんに伝える、という事でしょうか。

この脆弱性は自分にとってかなり盲点でびっくりしたので、ここで紹介しました。もし自分が無知なだけだったらごめんなさいです。

Posted by Kyosuke Takayama at 2003-10-27 (Mon) 11:35 printable version

この記事へのコメント

1) (2003-10-27 (Mon) 12:32)

8へぇということで(ぉぃ

2) おでん田中 (2003-10-27 (Mon) 22:48)

今後もセキュリティホールの発見に努力していきましょう ;-)

3) ガバ (2003-10-28 (Tue) 09:49)

頑張りましょう フフ

4) かっちん (2003-11-03 (Mon) 01:54)

どうもです。有り難うございました。

HTTP_系はユーザー任意の情報ってのは知ってたので、元々信用してなかったので、自分ではめったに使いませんでした。(頭の最初からHTTP_系は使わないって決めてる感じで)時々、USER_AGENTに日本語とか、凝ったかっこいい名前とか「あほ」とか書いてる人います笑。

CGI始めた頃にhttp://www.tokix.net/ ってところで、勉強したんですけど、、今ないですね、、、、(^^;
UNIXの部屋とかにも確か書いてあったような。
でも、うっかり使ってしまいそうな罠ですよね。(気を付けてても)。

5) かっちん (2003-11-03 (Mon) 02:02)

ユーザーエージェントとか表示するスクリプトって書いたことないんですけど(必要性がない)、このページなんかは、もろですね(^^; 何かの機会にうっかり書いてしまいそうですから、心に止めとかないとまずいですね。
タグ回避処理と一緒に環境変数も一緒にエスケープする癖をつければ大丈夫そうですかね。(セットみたいな感じで頭に叩き込めば)

6) かっちん (2003-11-03 (Mon) 02:10)

ちなみに、先のアドレスのページは、CGIをクラックする手法を
色々書いてあったサイトでした。
その中に、USER_AGENT やREFERERは、ユーザー側で書換え可能なので、要注意事項って書いてました。
1年位前、いやもうちょっと前だったの時に読んで、その当時の配布されているCGIでは、この危険をはらんでいるものが多いって書いてありましたね。
月日が経って、最近は対策済みのものが広まってるのかなぁ。

7) かっちん (2003-11-03 (Mon) 02:17)

http://air-ug.obi.ne.jp/link.html
上などでも紹介されていますが、やっぱりリンク切れですね。
確か、何かの雑誌の記事のコラムをやってる人でなかったかと思いますが。確かに、諸刃のサイトではありましたかね(^^;

8) ガバ (2003-11-03 (Mon) 11:00)

これっぽいですね。
http://web.archive.org/web/20021012175002/www.tokix.net/texts/012/index.html
ふむ、そのまんま書いてありますね。
何でこのサイト無くなっちゃったんだろう。

user-agent って、重複登録とか発見するのに結構有用だと思ってたんですが使ってませんか?
同一の PC だと証明する割りと簡単な方法だと思います。
なので、ゲーム系では多いかな〜と思ってました。
私もアクセスログ以外では使ってないっす。

コメントはお気軽にどうぞ

Cookie に保存しますか?


・スパム対策のため、http:// を含むコメントの投稿は出来ません。
・スパムチェックのため、投稿がすぐに反映されない場合があります。
・メールアドレス入力欄には何も入力しないでください。

トラックバック

トラックバックURL: http://espion.just-size.jp/mt-tb.cgi/27


この記事のリンク元

 
Copyright (C) Kyosuke Takayama, All rights reserved.