SQLインジェクションとは、Webアプリケーションの脆弱性を悪用して、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法である。
また、その攻撃を可能とする脆弱性のことである。
SQLインジェクションの仕組み
SQLインジェクションの攻撃は、Webアプリケーションの入力フォームやリクエストパラメータに、攻撃者が意図的にSQL文を埋め込むことで実現される。アプリケーションが入力値を適切にエスケープ処理を行わない場合、攻撃者が埋め込んだSQL文がそのままデータベースに送信され、想定しない結果を招くことになる。
具体的には、次の例のようなSQL文を入力フォームに埋め込むことで、攻撃者はデータベースから情報を取得したり、データを改ざんしたりすることができる。
SELECT * FROM users WHERE name = '田中 太郎';
このSQL文を入力フォームに埋め込むと、アプリケーションは「田中 太郎」という名前のユーザーの情報をデータベースから取得し、画面に表示することになる。
SQLインジェクションの種類
SQLインジェクションには、次の2つの種類がある。
- インバンドSQLインジェクション
インバンドSQLインジェクションは、攻撃者が入力した不正なSQL文が、そのままSQL文として実行される攻撃である。
- ブラインドSQLインジェクション
ブラインドSQLインジェクションは、攻撃者が入力した不正なSQL文が、SQL文として実行されるかどうかを、攻撃者が判別することで、データベースから情報を抜き出す攻撃である。
インバンドSQLインジェクション
インバンドSQLインジェクションは、攻撃者が入力した不正なSQL文が、そのままSQL文として実行される攻撃である。
具体的には、攻撃者は、入力フォームやパラメータに、次のようなものを入力する。
- データベースのテーブル名や列名
- データベースの操作方法(SELECT、INSERT、UPDATE、DELETE)
- データベースの操作対象のデータ
これにより、攻撃者は、データベースから情報を抜き出したり、データベースのデータを改ざんしたりすることができる。
ブラインドSQLインジェクション
ブラインドSQLインジェクションは、攻撃者が入力した不正なSQL文が、SQL文として実行されるかどうかを、攻撃者が判別することで、データベースから情報を抜き出す攻撃である。
具体的には、攻撃者は、入力フォームやパラメータに、次のようなものを入力する。
- データベースのテーブル名や列名
- データベースの操作方法(SELECT)
- データベースの操作対象のデータの一部
これにより、攻撃者は、データベースから情報を抜き出すのではなく、データベースから情報を抜き出すことができるかどうかを判別することができる。
攻撃者は、判別結果から、データベースから情報を抜き出すための不正なSQL文を導き出すことができる。
SQLインジェクションの目的
SQLインジェクションの目的には、次の3つの種類がある。
- データの取得
攻撃者がデータベースから情報を取得する攻撃。ユーザー名やパスワード、クレジットカード情報などの個人情報や、システムの内部情報などを取得することができる。
- データの改ざん
攻撃者がデータベースのデータを改ざんする攻撃。注文履歴や在庫状況、成績などのデータを改ざんすることで、不正な利益を得たり、被害者を不利益に陥れたりすることができる。
- データベースの破壊
攻撃者がデータベースを破壊する攻撃。データベースを削除したり、テーブルやレコードを削除したりすることで、システムを停止させたり、データを消失させたりすることができる。
SQLインジェクションの対策
SQLインジェクションの攻撃を防ぐためには、アプリケーションの入力値を適切にエスケープ処理を行うことが重要である。また、アプリケーションの開発・運用においてセキュリティ対策を徹底することも必要である。
入力値のエスケープ処理
アプリケーションの入力値をエスケープ処理することで、SQL文の特殊文字をエスケープし、データベースに送信されるSQL文を安全なものにすることができる。
エスケープ処理を行う方法は、使用するプログラミング言語やフレームワークによって異なる。一般的に、次の表のような特殊文字をエスケープする必要がある。
特殊文字 | エスケープ処理後の文字 |
---|---|
' |
'' |
" |
' |
; |
\; |
, |
\, |
- |
\- |
* |
\* |
` | ` |
() |
\() |
セキュリティ対策の徹底
SQLインジェクションの攻撃を防ぐためには、アプリケーションの開発・運用においてセキュリティ対策を徹底することも重要である。具体的には、次の対策を行う必要がある。
- 入力値の検証
入力値の型や値域を検証することで、不正な入力を検知し、攻撃を防ぐことができる。
- ログの取得
アプリケーションのログから攻撃の兆候を検知することで、攻撃を早期に発見し、被害を抑制することができる。
- 脆弱性診断の実施
アプリケーションの脆弱性を定期的に診断することで、攻撃のリスクを低減することができる。
まとめ
SQLインジェクションは、Webアプリケーションの脆弱性を悪用してデータベースを不正に操作する攻撃である。攻撃の種類は多岐にわたるため、アプリケーションの開発・運用においてセキュリティ対策を徹底することが重要である。