SQLインジェクション
SQLインジェクションとは??
アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、 データベースシステムを不正に操作する攻撃方法のこと。
代表的な不正操作の例
- ユーザーログイン画面に対して、不正なSQL文を実行しPasswordを取得する。
- 一覧表示画面に不正なSQL文を流しデータの削除を行う。
- データの改竄などを行う。
イメージがつきやすいように実際にやってみましょう。
実際にやってみる
ログインしてみる
ユーザーIdとPasswordが正しければログインできる画面を作成しました。
画面のレイアウトなどから、おそらく検索用のSQLはWHERE Id = '入力値' AND Password = '入力値'
ではないかと予想。
ユーザーId入力フォームに適当な値+セミコロンを入力してみる
1;
ログインすることができました。
なぜログインできる??
;
を入力することでセミコロン以降のSQLを無効にすることができるためIdのみ一致すればログインすることができる。
WHERE Id = '入力値' AND Password = '入力値' → WHERE Id = '入力値'
となる。
そのため適当なIDを打ちこんでもし一致すれば、Passwordなしでログインすることができる。
ログインIdに関しては、ユーザーネームとして使われることもあるため、人目につきやすく見破られやすい。
そのためSQLインジェクションしやすい。
Idがわからないは '' or 1 = 1;
でログインすることができる。
1 = 1の部分が検索条件が真となるためログイン可能。
一度ログイン成功するとセミコロンを利用して他のSQL文も入力できるようになるため、他のテーブルを検索したり、データの改竄や破壊することもできる。
対策を考えてみる
1. 正規表現でセミコロンが1個以上入力された場合のチェックを入れる。
var regix = /;+/;
2. エスケープ処理をする。
エスケープ処理とは、その文字本来の機能とは違う意味を与えるもしくは付与すること。
今回の場合はセミコロンより後ろのSQLを無効化する機能を別の意味に置き換える。
escape()
"@*_+-./"以外を符号化することができる。
developer.mozilla.org
3. プレースホルダーを使う
パラメーター部分を?等の記号で示し、そこへ実際の値を割り当てる。
`SELECT * FROM User WHERE Id = ? AND Password = ?`, [qsdata.id, qsdata.password]
実際にやってみた感想
※DBの種類によっては';'以外でも無効化できるのと他の攻撃方法もたくさん存在するため、これらの対策だけでは万全ではないため安心できない。
以下を参考にさせていただきました。
https://www.nic.ad.jp/ja/materials/iw/2010/proceedings/s3/iw2010-s3-01.pdf
参考サイト
SQLインジェクション
www.amiya.co.jpSQLインジェクションを防ぐ対策とは|わかりやすく仕組みを解説|セキュリティコラム|株式会社網屋
IPA
https://www.ipa.go.jp/files/000017320.pdf
エスケープ
https://wa3.i-3-i.info/word11732.html