はじめに
サイバー攻撃には様々な手法があります。
セキュリティ対策を講じるには、それらの手法を知ることが重要です。
「サイバー攻撃手法」シリーズとして、私が学んだサイバー攻撃手法を随時アウトプットします。
SQLインジェクションとは
ログイン画面等に設置されている入力フォームに、SQL文を含んだ細工した文字列を入力することで、Webアプリケーションのデータベースを不正に操作する攻撃手法です。
手法例
例①:認証の突破
Webアプリケーションのログイン機能で、SQLが以下のように実装されていたとします。
SELECT * FROM users WHERE username = 'ユーザ名の入力値' AND password = 'パスワードの入力値';
一方で、攻撃者が以下のように情報を入力したとします。
- ユーザ名(username):
takashi' OR '1'='1'--
- パスワード(password):
任意の文字列(なんでもOK)
すると、Webアプリケーション側で実行されるSQLは以下のようになります。
SELECT * FROM users WHERE username = 'takashi' OR '1'='1'-- AND password = '任意の文字列(なんでもOK)';
'1'='1'
の部分が常に成立してしまうため、ログインは成功してしまいます。
(-- により、AND password以降はコメントアウトされます)
例②:任意のSQL文の実行
例①と同様、Webアプリケーションのログイン機能で、SQLが以下のように実装されていたとします。
SELECT * FROM users WHERE username = 'ユーザ名の入力値' AND password = 'パスワードの入力値';
そして、攻撃者が以下のように情報を入力したとします。
- ユーザ名(username):
' OR '1'='1'; DROP TABLE users; --
- パスワード(password):
任意の文字列(なんでもOK)
すると、Webアプリケーション側で実行されるSQLは以下のようになります。
SELECT * FROM users WHERE username = '' OR '1'='1'; DROP TABLE users; --' AND password = 'パスワードの入力値';
例①と同様、'1'='1'
の部分が常に成立してしまうことに加え、「:(セミコロン)」で区切ると2つ目のSQL文を実行できるためDROP TABLE
が実行されます。
(-- により、AND password以降はコメントアウトされます)
このように、例①の手法にひと手間加えるだけで、任意のSQL文を実行できます。
想定されるリスク
攻撃者が任意のSQL文を実行できるため、想定されるリスクは多岐に渡ります。
リスクの例を以下に示します。
- SELECTの実行による情報漏洩
- DROP TABLEの実行による情報破壊(=実質のサービス停止)
ターゲットとなったWebアプリケーション等が持つDBユーザの権限が大きいほど被害も大きくなります。
対策
SQLインジェクションへの対策として、以下が挙げられます。
-
プリペアドステートメントの利用
プリペアドステートメントとは、SQLの骨組みと値を分離する仕組みです。
「プレースホルダ」と呼ばれる、値を埋め込む場所を表す記号を使い、あらかじめSQL文を定義します。例えばpythonなら以下のようになります。
SELECT * FROM users WHERE username = ? AND password = ?;
##「?」がpythonにおけるプレースホルダです。
上記のでSQLを実行する際、内部的な処理の流れは以下のようになります。
①SQLの骨組み SELECT * FROM users WHERE username = ? AND password = ?;
を送る。
→「実行するSQLはこれ、値は後から送ります」という処理
②プレースホルダ「?
」の値を送る。
→「値はこれ」という処理(値は単なる文字列として扱われる)
このようにSQLの骨組みと値を分離することで、先述のtakashi' OR '1'='1'--
のような不正な入力が行われても、「takashi' OR '1'='1'--
」というユーザ名を検索することになり、SQLインジェクションが成立しません。
SQLインジェクション対策としては最優先で実装されるべき仕組みです。
-
入力値の検証
想定している入力値以外は弾くように実装します。
例えば、数値の入力を想定している場合は、数値以外が入力された場合にエラーを返す といった実装にします。単純ですが、確かな効果があります。 -
最小権限の付与
Webアプリ用のDBユーザに与える権限を必要最小限にします。
DROPやUPDATE等が可能な強い権限を与えなければ、仮にSQLインジェクションが成立した際の被害を抑制できます。(あくまで被害の抑制であり、防止対策にはならない点に注意) -
WAF(Web Application Firewall)製品の導入
SQLインジェクションを含む、広範なサイバー攻撃対策となる製品の1つにWAFが挙げられます。製品であるため有償にはなりますが、手っ取り早く対策を講じることができます。
ただし、WAFも完璧ではありません。先述の対策を講じたうえで、念押しとして導入するという位置づけにしてください。
おわりに
SQLインジェクションの手法や対策をまとめました。
広く認知されている攻撃ではありますが、改めて学んでみて良かったと思います。
参考になれば。