SQLのエラーで分かったり分からなかったり
2009年2月27日(金曜日)
SQLのエラーで分かったり分からなかったり
公開: 2024年12月21日18時25分頃
「続:SQLのバインド機構は「エスケープ処理された値」をはめ込むのか (d.hatena.ne.jp)」。
概ねよいのだが、『ブラウザ上には、処理が失敗したことが分かる程度の簡単なエラーメッセージを表示』という部分がよくない。処理が『失敗した』ことが分かれば、攻撃に対するヒントになり、ブラインドSQLインジェクションに利用される場合もあるだろう。処理が失敗したのか、入力値検証ではじいたのかを含めて、もっと大雑把なメッセージにしたほうがよい。
たとえば、普通に検索すると「見つかりません」になるのに、シングルクォートを含む検索では「メンテナンス中です」という表示になる、なんて検索システムがあったりしますね。何故かシングルクォートを偶数個連続して入れると「見つかりません」に、奇数個だと「メンテナンス中」になるという。こういう場合、SQLインジェクションが強く疑われます。が、「メンテナンス中」の場合であっても「見つかりません」と表示するようにしておけば、SQLインジェクションがバレにくいというわけですね。
※まあ、バレなきゃ良いという話ではないのですが。
もっとも、届出者の立場としては、大胆なエラーが出てくれた方がありがたかったりもします。基本的にSQLインジェクションは脆弱なのかどうか分からない、疑惑段階での届出になるのですが、希に脆弱性の存在をほぼ確信できる場合があります。それはたとえば、以下のような場合です。
- 組み立て後のSQL文がそのまんまエラーメッセージとして表示されている
- エラーメッセージにソースコードのファイル名(拡張子.inc)と行番号が表示されており、相当するURLにアクセスしてみたら実際にソースが見えて、SQL文組み立て周辺のコードが確認できた
たとえば、こんな感じのエラーですね。
Warning: db2_exec() [function.db2-exec]: Statement Execute Failed in /www/htdocs/sqlexecution.inc on line 11
SELECT goods_status FROM goods_table WHERE goods_id = test
こういう場合はかなりの自信を持って脆弱だと言えるので、ある意味、ありがたいと言えます。
※届出する人だけでなく、攻撃者にも情報与えすぎですが。恐ろしいことに、私はいずれのケースも複数見たことがあります。
ところで余談ですが、
日本には、47の都道府県があるのだから、説明なしに「01~48」とすると読者は面食らう。私の身の回りでは、48番目の県について「海外を示す」とか「いや、ぷりぷり県だ」とか、さまざまな憶測があったが、説明がないので本当のところは不明だ。
JISハンドブックでJIS X 0401の都道府県コードを確認しましたが、やはり01~47しか定義されていないですね。48番目は「あなたシナリオ」かもしれません……。
※四八(仮) (www.amazon.co.jp)ネタ。
- 「SQLのエラーで分かったり分からなかったり」にコメントを書く
関連する話題: Web / セキュリティ / 情報セキュリティ早期警戒パートナーシップ
- 前(古い): 森の生活 97日目: 雪解け
- 次(新しい): 苺ましまろ6