はじめに
SQLインジェクションは、Webアプリケーションの脆弱性を突いてデータベースを不正操作する攻撃手法です。
ここでは、ログインフォームや検索フォームを例に、簡単なSQLインジェクションの手口を紹介します。
警告
ここで紹介する手口を試す際は絶対に他人の環境に試さないでください。
普通につかまります。
捕まったとしても私は責任を負いません。
楽しくセキュリティを学びましょう!
ログインフォームを狙ったSQLインジェクション
想定されるSQL文
SELECT COUNT(*) FROM user_info WHERE user_id='$user_id' AND password='$password';
$user_id と $password はフォームからの入力値です。
攻撃者の入力例
ユーザーID欄:
admin' OR '1'='1
パスワード欄:
(何でもOK)
実際に生成されるSQL文
SELECT COUNT(*) FROM user_info WHERE user_id='admin' OR '1'='1' AND password='(何でもよい)';
または、コメントアウトを使って
ユーザーID欄:
admin' OR 1=1--
パスワード欄:
(空欄でもOK)
SELECT COUNT(*) FROM user_info WHERE user_id='admin' OR 1=1--' AND password='';
-- 以降はコメント扱いになり無視されます。
何が起きるか
OR 1=1 の条件が常に真(TRUE)になるため、認証が突破されてしまう可能性があります。
脆弱な実装だと、全ユーザー情報の取得やデータ改ざん・削除のリスクもあります。
わかりやすく擬人化
攻撃者=A
認証システム=B
A『お疲れ様です。ここ通らせてください!』
B『私がこの門は守る!!ユーザー名とパスワードを教えろ!さもなければ絶対にここは通さない!!!』
A『あ!そういえば1って1ですよね?1じゃなければ私のことは通さなくていいです。パスワードとかは無視していいです』
B『よし!1は1だ!通れ!』
今の環境でこんなに脆弱な環境はないですが
『1は1であるか否か』という哲学的な問答によって突破をしてしまいます。
対策
プレースホルダ(プリペアドステートメント)の利用
入力値のエスケープ処理
入力値のバリデーション
まとめ
SQLインジェクションは、入力フォームなどに悪意あるSQL文を仕込むことで、本来意図しないデータベース操作を実現してしまう攻撃手法です。
簡単な例としては、OR 1=1 や --(コメントアウト)を使って認証を突破したり、情報を抜き出したりするものがあります。
社内勉強会ではこのように脆弱な環境を立てた上で突破をして
対策で何ができるのかというところまで実演と解説をしていこうと思います。
参考:
OWASP SQL Injection
IPA 安全なウェブサイトの作り方 SQLインジェクション