この日はとあるお2人の結婚式の二次会(Operation Wedding)へ向かい、帰宅後に続きをしようとサイトにアクセスしたのですが、この頃から、サイトにDDoS攻撃が仕掛けられていたとのことで、ほとんどサイトが表示できない状況に。しばらく待っても復旧しなかったため、諦めてゆっくりと睡眠を取ることにしました。
翌朝、あらためて「ログイン」「会員登録」「FEEDBACK」に対して、再度、脆弱性の見逃しがないかどうかの確認を始めました。すると、「FEEDBACK」の「Referer:ヘッダー」に、「sleep」などの特定のキーワードを送信した場合に、「Attack detected」というエラーが発生することが分かりました。
「これは何かある!」ということで、「Referer:ヘッダー」を中心にSQLインジェクションの確認を行いました。が、SQLインジェクションが存在する場合であれば「'」「\」などで反応がありそうなところ、何もそれらしい応答を得ることができませんでした。
ところが、「'」ではなく、URLエンコードした状態の「%27」として送信すると、「Error Occured :(」という表示となることに気付きました。また、「''」を意味する、「%27%27」を送信すると、正常に送信が完了することも分かりました。これはSQLインジェクションがある場合の典型的な反応です。
ターゲットは決まりました。「FEEDBACK」の「Referer:ヘッダー」にURLエンコードされた状態でSQLインジェクションの文字列を送信すればよいようです。
ターゲットに対して、SQLインジェクションを通じてデータを取得するためのセキュリティツール「sqlmap」を実行してみることにしました。
※ご注意
本記事に掲載した行為を自身の管理下にないネットワーク、コンピューターに行った場合は、攻撃行為と判断される場合があり、最悪の場合、法的措置を取られる可能性もあります。
また、本記事を利用した行為による問題に関しましては、筆者、株式会社ラックおよびアイティメディア株式会社は一切責任を負いかねます。ご了承ください。
「sqlmap」は、通常であれば、URLにパラメーターを持つGETメソッドの場合はURLを、POSTメソッドの場合はURLとPostデータを指定するだけで、SQLインジェクションの存在する個所を特定して、データの取得を行う準備までを半自動で行ってくれる便利ツールです。
試しに、まずURLとPostデータだけを指定してツールを実行してみたところ、さすがに「脆弱性が存在しない」という一次結果となりました。いろいろな手法を自動で試してくれるので、もしかしたらターゲットを特定してくれるのではないかと期待したのですが。
あらためて、「Referer:ヘッダー」をターゲットとすること、SQLインジェクションの文字列をURLエンコードした状態で送信することを意味するオプションを指定してツールを実行しました。
./sqlmap.py -u "http://ctf.notsosecure.com/9128938921839838/f33db4ck_flag/submit.php" --data "name=keigo&email=user%40example.jp&message=test&submit=Submit" --level 3 --referer "http://ctf.notsosecure.com/9128938921839838/f33db4ck_flag/index.php" -p referer --tamper charencode --dump
この各パラメーターやオプションの意味は以下の通りです。
パラメーター | 意味 |
---|---|
-u | 対象URL |
--data | Postデータ |
--level 3 -p referer | Refererヘッダーを対象とする |
--tamper charencode | URLエンコード形式で送信する |
--dump | データの取得を行う |
すると……ツールがさまざまな手法でリクエストの送信を行い、無事に「Referer:ヘッダー」にSQLインジェクションの脆弱性が存在することが確認されました。
続いて、MySQLが動作していること、接続しているデータベースが「seven」であること、「flag」と「temp」というテーブルが存在していることを取得してきてくれました(優秀なツールですね!)
次に、テーブル「flag」の内容を取得します。テーブル「flag」には、「flag」というカラムがあり、その中に1つだけデータが入っていること、そのデータは「1362390」であることが分かりました。
これが2つ目のフラグです。BINGO!!!
今回のCTFでは、最初にフラグが2つであることが明示されていたので、これで挑戦終了です。あとは、入手した2つのフラグを運営側のメールアドレスに送信することで、全てクリアと認定されました。
第2回 NotSoSecure CTF参戦記、いかがだったでしょうか? 少しでも当日の雰囲気を感じていただけたならば嬉しいです。今回はそもそも脆弱性が存在しそうなポイントの特定ができず苦戦しましたが、普段筆者が行っているセキュリティ診断と同じで、ちょっとしたエラー表示などのささいな兆候を見逃さないことが勝利の鍵であったと感じました。
もしも本記事を読んで、Webサイトのセキュリティに興味を持たれた方は、ぜひ、Webサイトなどを通じて情報収集していただければと思います。私のオススメする最初のステップは、情報処理推進機構(IPA)が公開している資料です。
例えば以下のURLでは、代表的な10種類の脆弱性について学習することができます。
また以下のURLでは、脆弱性の発見方法や対策について実習形式で学べるツールが公開されています。
これらの資料で基礎力を付け、その後は、皆さんのモチベーションの方向性によって、その先の学習に進んでいけばいいと思います。例えば……、
→日本国内のセキュリティコンテスト「SECCON」に参加する(筆者も実行委員の一員として参画しています)。現在は、まだ2014年のWebページが完成していませんが、近々公開されます。いろいろと新しい試みも企画されていますので、お楽しみに!
→基本的な脆弱性対策が行われているかを確認する方法が『ウェブ健康診断仕様』にまとめられています(くれぐれも許可なく他者のサイトに攻撃しないようご注意を)。
→脆弱性を作り込まないWebアプリケーションの実装方法について『安全なウェブサイトの作り方』に解説があり、チェックリストも公開されています。
→英語の資料になってしまいますが、OWASPのサイトに詳細がまとまっています。
こうした情報を参考にしつつ、皆さんが各々の興味のある分野で活躍されることを期待しています。今後のWebセキュリティ業界のどこかでお会いできるかもしれませんね。楽しみにお待ちしています。
株式会社ラック セキュリティプロフェッショナル本部 ペンテスト技術部に所属。同社サイバー・グリッド研究所シニア・リサーチャー・チーフを兼任。2000年からセキュリティサービスに携わり、Webアプリケーション診断サービスを体系化した。現在は、診断サービスの他にWebアプリケーションファイアウォール(WAF)の製品同梱シグネチャの作成なども手がける。SECCON実行委員、セキュリティ・キャンプCTFオーガナイザー、IPA情報システム等の脆弱性情報の取扱いに関する研究会委員、CODE BLUE実行委員、ISOG-J WG1メンバーなど。
Copyright © ITmedia, Inc. All Rights Reserved.