これは何?
SQL Injectionについて知るため,サンプルリポジトリを作成しました。
GitHub Repository
この記事ではSQL Injectionについて解説します。
SQL Injectionとは
わかりやすい説明が書いてあるサイトを貼っておきます。
データベースと連携したウェブアプリケーションの多くは、利用者からの入力情報を基にSQL文(データベースへの命令文)を組み立てています。ここで、SQL文の組み立て方法に問題がある場合、攻撃によってデータベースの不正利用をまねく可能性があります。このような問題を「SQLインジェクションの脆弱性」と呼び、問題を悪用した攻撃を、「SQLインジェクション攻撃」と呼びます。
仕組み
例えばこのようなコードがあるとします。
query = f"SELECT * FROM users WHERE user_id = '{user_id}' AND password = '{password}'"
この際にuser_idにjohn
,passwordに' OR '1'='1
を入れるとSQL文は以下のようになります。
SELECT * FROM users WHERE user_id = 'john' AND password = '' OR '1'='1'
SQLの場合AND
がOR
より優先されます。そのため,SQL文は次のように解釈されます。
SELECT * FROM users WHERE (user_id = 'john' AND password = '') OR '1'='1'
つまり,ORにより(user_id = 'john' AND password = '')
もしくは`'1'='1'のどちらかがTRUEになればよいです。'1'='1'は常に成り立つのですべてのデータがSELECTされます。
POCを作ってみる
構成
- MySQLにユーザデータを入れておく
- FlaskでMySQLに接続し,ログイン処理を行う
SQL Injectionを使う
GitHub RepositoryからソースをダウンロードしてDockerコンテナを起動します。
cd sqli
docker compose up -d
- localhost:8000にアクセスします。
- john/johnpasswordが正しいクレデンシャルなのですが,john/
' OR '1'='
1を入力します
- SQLの条件がTrueになり,全ユーザのデータが出力されました。