プログラミングBlog

SQLインジェクション

SQLインジェクションとは??

アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、 データベースシステムを不正に操作する攻撃方法のこと。

ja.wikipedia.org

代表的な不正操作の例

  • ユーザーログイン画面に対して、不正なSQL文を実行しPasswordを取得する。
  • 一覧表示画面に不正なSQL文を流しデータの削除を行う。
  • データの改竄などを行う。

    イメージがつきやすいように実際にやってみましょう。

実際にやってみる

ログインしてみる

ユーザーIdとPasswordが正しければログインできる画面を作成しました。

f:id:Tokuty:20210416200651p:plain
画面のレイアウトなどから、おそらく検索用のSQLWHERE Id = '入力値' AND Password = '入力値'ではないかと予想。

ユーザーId入力フォームに適当な値+セミコロンを入力してみる

1;
f:id:Tokuty:20210416200253p:plain

ログインすることができました。

f:id:Tokuty:20210416200301p:plain

なぜログインできる??

;を入力することでセミコロン以降のSQLを無効にすることができるためIdのみ一致すればログインすることができる。
WHERE Id = '入力値' AND Password = '入力値' → WHERE Id = '入力値'となる。
そのため適当なIDを打ちこんでもし一致すれば、Passwordなしでログインすることができる。
ログインIdに関しては、ユーザーネームとして使われることもあるため、人目につきやすく見破られやすい。
そのためSQLインジェクションしやすい。

Idがわからないは '' or 1 = 1; でログインすることができる。

f:id:Tokuty:20210416200410p:plain

1 = 1の部分が検索条件が真となるためログイン可能。

f:id:Tokuty:20210416200301p:plain
一度ログイン成功するとセミコロンを利用して他の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