SQL Injection

OMSCS IIS での SQL Injection に関する振り返り

OMSCS で受講した Introduction to Information Security (IIS) にて学んだ SQL Injection に関しても、以前から名前だけは知っていたものの、実際の動作までは把握していなかったことから、CTF の問題を題材にして解法を整理する。

Overall

OMSCS で受講した Introduction to Information Security (IIS) にて、プロジェクトの 1 つに SQL Injection に関連するものがあった。以前から名前だけは聞いたことがあったが、どのような手順で実施するかなど具体的な情報は知らなかった。そのため、データベースを業務の中で扱っていても新たな学びがあったことから、以下に内容を解説する。今回も picoCTF から参照し、Web Exploitation の SQLLite を題材とした。

picoCTF

IIS を受講した時の内容や picoCTF に関する説明は、以下の記事で行っている。

CS 6035 Introduction to Information Security

Binary Exploitation

なお、本投稿は実際に攻撃することを目的としておらず、ここでの紹介はこれらの攻撃に対する注意を促すことが目的である。

Solution

対象の picoCTF の問題を始めると、Login 画面を確認することができ、以下のように Username と Password の入力が求められる。

login

何も情報がないことから、試しに何も入力せずに Login ボタンをクリックしてみる。その結果、画面が遷移し、以下のようなクエリを確認できる。

query

1
SELECT * FROM users WHERE name='' AND password=''

こちらの実装は、ログイン画面で username, password の入力を受け付け、その値を以下のような形でクエリに渡していると思われる。対象のクエリは、ログイン可能な user 名とパスワードが保存されていると思われる users テーブルに対して、where 句で name と password を指定し、一致するものだけを返すものとなっている。アプリでは、このクエリの結果が得られたらログイン成功として判断していると予測できる。

1
2
3
username = ''
password = ''
SELECT * FROM users WHERE name=@username AND password=@password

具体的なデータベースの動作を確認するため、以下の SQL Test というサイトを利用してみる。こちらでは、SQL Server, MySQL, Orcle などのデータベースに対して、データベースを構築することなくクエリを発行することができるため、動作検証を簡単に行うことができる。今回は SQL Server を対象にして、動作を確認してみる。

SQL Test

標示されていたクエリを参考に users テーブルを以下のように定義し、1 ユーザー登録してみると、テーブルには以下のようなデータが書き込まれる。

1
2
3
4
5
6
CREATE TABLE [users] (
    name NVARCHAR(50) NOT NULL,
    password NVARCHAR(255) NOT NULL
);

INSERT INTO users values ('user1', 'P@ssw0rd');

SQLTest_row

この状況で、先ほどログイン画面から入力したように、name と password に何も指定しない以下のクエリを直接実行してみると、もちろんユーザーが一致しないことから結果が得られない。

1
SELECT * FROM users WHERE name='' AND password=''

SQLTest_no_output

しかし、以下のように username = ’’ OR 1=1;--’ とすることで、最終的なクエリは以下のようになる。 その結果、--以降はコメントアウトになることから、 AND からは無視され、name = ’’ もしくは 1=1 が True である時に結果が返される。ここで、1=1 は常に Ture であることから、name の結果に関わらずこのクエリは常に結果を返すことになる。

1
SELECT * FROM users WHERE name='' OR 1=1;--' AND password=''

その結果、以下のように AND からコメントアウトされており、name と password が正しくなくとも結果を返している。こちらが非常にシンプルな SQL Injection の攻撃パターンである。

modified_query

modified_query_output

ログイン画面に戻り、username に ’ OR 1=1;-- を入力することで、password に何も入力しなくとも遷移先の画面からログインが成功したことが確認できる。 こちらの問題においてフラッグに関しては、この画面でブラウザの開発者ツールを利用することで確認できる。

login_wsolution

result

Reflection

以前から SQL Injection に関して名前だけは聞いたことがあったが、具体的な攻撃パターンを知ることができ、理解を深めることができたと思う。業務でデータベースを利用してきたが、このような脆弱性に関して今まで考えたことがなかったため、新たな学びを得ることができた。このような脆弱性に関して、どうやって思いつくのか想像することができず、攻撃者は想定もしない方法で脆弱性を突いてくると思ったため、セキュリティを高める上では柔軟な発想が必要であると感じた。

Licensed under CC BY-NC-SA 4.0
Hugo で構築されています。
テーマ StackJimmy によって設計されています。