0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

脆弱性のあるサイトを作成してSQLインジェクションを体験してみる

Posted at

目次

#1.はじめに
#2.前提環境
#3.作成したサイト
#4.実際に攻撃してみる
#5.あとがき
#6.参考サイト

1.はじめに

情報処理試験の勉強をしているといろんな攻撃方法を学ぶことになります。
今回は数ある攻撃方法の中でも有名なSQLインジェクションを実際に体験してみました。

2.前提環境

python:3.12.2
django:5.0.4
postgresql:16.2

3.作成したサイト

SQLインジェクションの検証ができればいいので、ユーザIDを入力してPOSTするとユーザ名をテキストエリアに出力する簡易サイトを作成しました。

①ユーザIDを入力して送信するボタンを押す
image.png

②テキストエリアに対象のユーザ名が表示される
image.png

DBの状態は以下のようになっています。
image.png

4.実際に攻撃してみる

内部的に実行されているSQLは以下の実装になっています。
※本来djangoではあまり生のSQL文を実行することはありませんが、
 検証のためにあえて生SQLを発行する実装にしています。

views.py
        cursor = connection.cursor()
        cursor.execute(f'SELECT username FROM m_attack WHERE userid={userid}')

SQLインジェクション攻撃ではSQLのWHERE句を強制的にTRUEにすることで、任意のSQL文を発行する攻撃です。
今回の場合はユーザIDに「0001 OR 1=1」を入力してみます。

image.png

image.png

m_attackテーブルに登録されているユーザ情報を取得することができてしまいました。
今度はUPDATE文でテーブルを更新するために「0001 OR 1=1;UPDATE m_attack set username='SQLインジェクション' WHERE userid=0001」を入力してみます。

image.png

image.png

リクエストが通ってしまいました。
実際にDBを確認してみます。

image.png

userid 0001のユーザの名前が「SQLインジェクション」に書き換えられています。

5.あとがき

簡易的に脆弱性のあるサイトを作成し、SQLインジェクションを体験してみました。
最近ではフレームワークを利用することで開発者が意識せず対策が可能な場合も多いですが、理解しておくことは重要だと思います。
また、SQLインジェクションに限った話ではありませんが、ウェブサイトのセキュリティ対策としてIPAが公開している「安全なウェブサイトの作り方」はかなり有用なので一読をお勧めします。(個人的には以前受験した情報処理安全確保支援士試験の勉強にもなりました)

安全なウェブサイトの作り方 - 1.1 SQLインジェクション

6.参考サイト

djangoで素のSQLを実行する

Django#3(フォームの値を受け取る)

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?