診断するとなんだかんだ検出されるシリーズ:エラー型SQLインジェクション:2025/02/18
- 晋次 宮田
- 2025年2月18日
- 読了時間: 4分

1. フレームワークでSQLインジェクションは防げるのか?
近年は、Ruby on Rails、Laravel、DjangoなどのWebアプリケーションフレームワークが普及し、ORM(Object-Relational Mapping)やプリペアドステートメントなどの機能が標準で利用できるようになりました。このおかげで、従来型のSQLインジェクションはある程度防ぎやすくなっています。
しかし、脆弱性診断をしていると「詳細エラーメッセージの管理」が甘いことで、フレームワークの基本対策をすり抜ける攻撃ができてしまうケースがあります。いわゆる、エラー型SQLインジェクションという手法です。
2. エラー型SQLインジェクションとは
エラー型SQLインジェクション(Error-Based SQL Injection)は、データベースが返すエラーメッセージを利用して、DB内部の構造や情報を取得する攻撃手法です。 アプリケーションがデバッグやテスト目的で詳細エラーを公開していたり、例外処理が不十分でSQLエラーがそのまま返される場合、攻撃者はあえて誤ったクエリを送り込みます。
すると、エラー文にテーブル名、DBバージョン、カラム構造などが記載されてしまい、それらを手がかりに攻撃をさらに深めることができてしまいます。
3. 被害事例
事例1:国内の経済調査会社
本番サイトに詳細エラーメッセージ表示が有効なままになっており、会員テーブル名やカラム名がエラー文経由で流出。攻撃者はその情報をもとにUNIONベースやブラインド型のSQLインジェクションを実行し、最終的に約10万件の会員データ(メールアドレスやハッシュ化パスワード)を盗み出しました。
事例2:大手ECサイトの旧ページ放置
既に運用停止しているはずの旧サイトページにデバッグ用設定が残存。監視対象外だったため、アクセスされても気づけず、数万件規模のユーザ情報が引き出される結果となりました。
事例3:海外就職ポータルでの大規模攻撃
XML関数(UPDATEXML())を用いたエラー型攻撃により、数十万件の応募者情報が抜かれた事例です。エラー文でDBの構造やバージョンを徐々に特定し、最終的に個人情報が流出しました。
4. 具体的な攻撃手法
4-1. MSSQLの型変換エラー
?id=1' AND 1=CONVERT(INT,@@VERSION)--文字列をINTに変換できないエラーを引き起こし、そのエラー文に@@VERSIONが表示される仕組みです。バージョン情報はもちろん、db_name()やuser_name()など他のシステム情報にも応用できます。
4-2. MySQLのXMLパスエラー(UPDATEXML / EXTRACTVALUE)
?id=1' AND UPDATEXML(NULL, CONCAT('/', (SELECT version())), NULL)--存在しないXMLパスを指定することで、エラー文中にversion()の結果がそのまま含まれます。database()やinformation_schemaテーブルを使えば、テーブル名・カラム名も順次推測可能です。
4-3. PostgreSQLの数値キャスト失敗
?id=1' AND CAST((SELECT version()) AS NUMERIC)--文字列のversion()を強制的にNUMERICへ変換しようとすると、「変換エラー」の詳細にバージョン情報が含まれるパターンです。
4-4. OracleのUTL_INADDRやXMLType
?id=1' AND UTL_INADDR.get_host_name((SELECT banner FROM v$version))--無効な値によるホスト名取得やXML関連関数でエラーを発生させ、エラー本文中にサブクエリ結果を挿入する手口があります。Oracle環境でも複数のアプローチが存在するので要注意です。
5. 具体的対策
5-1. (これはマスト)本番環境で詳細エラーを表示しない
デバッグモードはOFF:RailsやLaravelなど、フレームワークでdebug=falseに設定
カスタムエラーページ導入:予期しない例外が発生しても、スタックトレースやクエリ情報は外部に出さない
余裕のないベンチャー企業でもこれはマストにしましょう。
5-2. 通常のSQLインジェクション対策
プレースホルダ付きクエリ:SQL文を文字列連結しない
入力バリデーション:想定外の文字や型を排除
DBユーザの権限最小化:SELECTだけ許可、不要なCREATE/DROP等は不可に
権限周りの脆弱性があると意味を成さないですが。
パッチ適用・脆弱性スキャン:DBMS自体の脆弱性を放置しない
5-3. エラーログは内部で安全に管理
詳細な内容はログにのみ残す:原因調査には必要だが、ユーザーには抽象化したメッセージだけ返す
インフラやWAFと連携して異常検出:特定IPから同種のエラーが連続する場合などをアラートで検知
5-4. (できたら)WAF・監視・レガシーページの整理
WAF導入:機械学習型エンジンが難読化された攻撃も検出
レガシーサイトの定期点検:不要なページやテスト用サブドメインを放置しない
ログ監査:連続するSQLエラーや異常なHTTPリクエストを見逃さない
6. 最後に
エラー型SQLインジェクションは2025年段階ではもう古典的と言える手法ではあるものの、診断をすると、DBのエラーメッセージを検出できるケースは結構あります。とくに「自社で開発せず、SIerに委託して作ってもらった」というときには、発注元としては注意が必要です。発注元の情報システム部の方で、要求から漏れないように開発を進めるべきでしょう。



