SQLインジェクション脆弱性(CWE-89)

このブログではウェブサイトやその上で動作しているウェブアプリケーションの脆弱性について紹介すると共に注意喚起をする目的でまとめられています。

今回は2005年以来継続して攻撃被害のあるSQLインジェクションについて解説をしています。

概要

大半のWebアプリケーションでは、データベースの問い合わせにSQLを用いています。SQL文をアプリケーションで組み立てる際に、外部からのデータをSQL文の一部としてはめ込むプログラム処理にバグがあると、本来「データ」であるはずの文字列がSQL文として認識される場合があります。これにより、SQL文を本来とは別の意味に改変してしまう技法がSQLインジェクション攻撃です。また、SQLインジェクション攻撃を許す状況をSQLインジェクション脆弱性と言います。

日本では2005年にSQLインジェクション攻撃による被害が初めて報告され、それ以来継続して大きな被害が出続けています。

攻撃のイメージと影響

掲示板の投稿を登録したテーブルpostsがあり、以下のSQL文を実行しているとします。$idは外部から指定する変数で、掲示板の投稿IDです。

SELECT body,subject FROM posts WHERE id=’$id’

ここで、$id = “‘ union select id, password from users — ” と外部から指定された場合、生成されるSQL文は以下の通りです。

SELECT body,subject FROM posts WHERE id=” union select id, password from users — ‘

ここで、SQLのunionは、2つの検索結果を合わせて(和集合)検索結果とする演算子です。これにより、本来投稿内容のみを表示する問い合わせが、個人情報を表示する問い合わせに変化し、個人情報の漏洩に悪用されることになります。

脆弱性による影響

この脆弱性による影響の例として下記がありますが、これらに限りません。SQLインジェクション攻撃を受けると、脆弱性のあるSQL文アクセスするデーブルとは無関係に、データベース内のすべての情報が漏洩する可能性がある点に注意が必要です。

  • データベース内の任意情報の漏洩
  • データベースの内容の改変
  • データベースの内容変更から派生して、Web閲覧ユーザの端末のマルウェア感染
  • データベースサーバー内のファイルの漏洩(環境依存)

脆弱性の有無の確認方法

脆弱性検査ツールがない場合は、手動診断で脆弱性の有無を検証することもできます。この場合、独立行政法人情報処理推進機構(IPA)が公開している「安全なウェブサイトの作り方」別冊の「ウェブ健康診断仕様」に診断の方法が説明されており、参考になります。

対策

SQLインジェクション脆弱性はアプリケーションのバグなので、アプリケーション改修による対策が基本です。SQL呼び出しの際に、文字列を連結してSQL文を組み立てるのではなく、プレースホルダという仕組みを利用して、SQLを呼び出すことを徹底することが大切です。

なお、デジサートの「クラウド型WAF」では、SQLインジェクション脆弱性をからウェブサイトが攻撃を受けるのを防ぐことができます。

参考文献

安全なウェブサイトの作り方、安全なSQLの呼び出し方、ウェブ健康診断仕様(独立行政法人情報処理推進機構)
https://www.ipa.go.jp/security/vuln/websecurity.html

修正の上再掲しました。

Posted in WAF