水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > SQLのエラーで分かったり分からなかったり

SQLのエラーで分かったり分からなかったり

2009年2月27日(金曜日)

SQLのエラーで分かったり分からなかったり

公開: 2024年12月21日18時25分頃

続:SQLのバインド機構は「エスケープ処理された値」をはめ込むのか (d.hatena.ne.jp)」。

概ねよいのだが、『ブラウザ上には、処理が失敗したことが分かる程度の簡単なエラーメッセージを表示』という部分がよくない。処理が『失敗した』ことが分かれば、攻撃に対するヒントになり、ブラインドSQLインジェクションに利用される場合もあるだろう。処理が失敗したのか、入力値検証ではじいたのかを含めて、もっと大雑把なメッセージにしたほうがよい。

たとえば、普通に検索すると「見つかりません」になるのに、シングルクォートを含む検索では「メンテナンス中です」という表示になる、なんて検索システムがあったりしますね。何故かシングルクォートを偶数個連続して入れると「見つかりません」に、奇数個だと「メンテナンス中」になるという。こういう場合、SQLインジェクションが強く疑われます。が、「メンテナンス中」の場合であっても「見つかりません」と表示するようにしておけば、SQLインジェクションがバレにくいというわけですね。

※まあ、バレなきゃ良いという話ではないのですが。

もっとも、届出者の立場としては、大胆なエラーが出てくれた方がありがたかったりもします。基本的に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)ネタ。

関連する話題: Web / セキュリティ / 情報セキュリティ早期警戒パートナーシップ

最近の日記

関わった本など