目次
#1.はじめに
#2.前提環境
#3.作成したサイト
#4.実際に攻撃してみる
#5.あとがき
#6.参考サイト
1.はじめに
情報処理試験の勉強をしているといろんな攻撃方法を学ぶことになります。
今回は数ある攻撃方法の中でも有名なSQLインジェクションを実際に体験してみました。
2.前提環境
python:3.12.2
django:5.0.4
postgresql:16.2
3.作成したサイト
SQLインジェクションの検証ができればいいので、ユーザIDを入力してPOSTするとユーザ名をテキストエリアに出力する簡易サイトを作成しました。
4.実際に攻撃してみる
内部的に実行されているSQLは以下の実装になっています。
※本来djangoではあまり生のSQL文を実行することはありませんが、
検証のためにあえて生SQLを発行する実装にしています。
cursor = connection.cursor()
cursor.execute(f'SELECT username FROM m_attack WHERE userid={userid}')
SQLインジェクション攻撃ではSQLのWHERE句を強制的にTRUEにすることで、任意のSQL文を発行する攻撃です。
今回の場合はユーザIDに「0001 OR 1=1」を入力してみます。
m_attackテーブルに登録されているユーザ情報を取得することができてしまいました。
今度はUPDATE文でテーブルを更新するために「0001 OR 1=1;UPDATE m_attack set username='SQLインジェクション' WHERE userid=0001」を入力してみます。
リクエストが通ってしまいました。
実際にDBを確認してみます。
userid 0001のユーザの名前が「SQLインジェクション」に書き換えられています。
5.あとがき
簡易的に脆弱性のあるサイトを作成し、SQLインジェクションを体験してみました。
最近ではフレームワークを利用することで開発者が意識せず対策が可能な場合も多いですが、理解しておくことは重要だと思います。
また、SQLインジェクションに限った話ではありませんが、ウェブサイトのセキュリティ対策としてIPAが公開している「安全なウェブサイトの作り方」はかなり有用なので一読をお勧めします。(個人的には以前受験した情報処理安全確保支援士試験の勉強にもなりました)
安全なウェブサイトの作り方 - 1.1 SQLインジェクション