1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

セキュリティごった煮一人完走チャレンジAdvent Calendar 2024

Day 21

SQL Injectionの脆弱性をあえて作り込んでみた

Last updated at Posted at 2024-12-20

これは何?

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の場合ANDORより優先されます。そのため,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

image.png

  • john/johnpasswordが正しいクレデンシャルなのですが,john/' OR '1'='1を入力します

image.png

  • SQLの条件がTrueになり,全ユーザのデータが出力されました。

image.png

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?