SQLインジェクションを行いすべてのデータを取得する

WEBアプリケーション

本記事では、SQL インジェクションの説明、および自環境の DVWA に対して実際に SQL インジェクションを行い、すべてのデータを取得する手順を紹介します。
DVWA のインストール、セットアップ方法については以下の記事で紹介しているので併せてご覧いただければと思います。

SQL インジェクションとは?

IPA の試験でも頻出する SQL インジェクションと呼ばれる攻撃。
ざっくり説明すると、想定しないSQL 文を実行させることでデータベースを不正に操作する攻撃のことです。
こう説明されてもピンと来ないので、本ブログでは具体的な攻撃手法を交えながら説明していきたいと思います。

今回の記事では、基本的な SQL インジェクションとしてよく紹介されている、特定のデータベース内のすべてのデータを取得する方法について説明します。

SELECT 文について

まず、SQL でデータベースからデータを取得するには SELECT 文を使用します。SELECT 文では多数の句が存在しますが、今回は「FROM」「WHERE」に絞って説明します。
「FROM」「WHERE」句を記述する場合は、以下の文法に従います。

SELECT <列名> FROM <表名> WHERE <条件式>;

例えば、以下のような構文は『「社員表」という表から「部署名がA部署」の「すべての列」を取得する』という意味になります。

SELECT * FROM 社員表 WHERE 部署名 = 'A部署';

以下の表があるとすると、1列目と3列目のデータが取得できます。

社員番号社員名部署名
001太郎A部署
002花子B部署
003次郎A部署
社員表

SELECT 文はどういった場面で使われる?

普段、SQL の文法なんて気にする必要もないですし、こういった構文を見かける機会も多くありません。

では一般的に使われていないのかというと全くそういうわけではなく、WEB アプリケーションが裏でデータベースサーバに対して SQL 文を実行してくれています。

どのように SQL 文が実行されているかを、自環境に用意した DVWA を使って説明していきます。
DVWA にログインし、左ペインの「SQL Injection」をクリックします。

「User ID:」欄に数字を入力して「Submit」ボタンをクリックすると、その User ID に対応したデータを取得できます。

このページでは、以下のような流れで SQL 文が実行されています。

このように、ユーザは意識することなく、WEBアプリケーションがデータベースに対して SQL 文を実行しデータを出力させています。

ここまでが SELECT 文の説明です。
この SQL 文を不正な構文に改ざんし、WEB アプリケーション側が意図しないような操作をデータベースに対して行わせる行為を SQL インジェクションと呼びます。
今回は、すべての行を一括で取得する攻撃手法を紹介します。

SQL インジェクションによりすべての行のデータを取得する

上述の流れを見てわかるように、データを取得するにはその行に対応した ID を入力する必要があります。
したがって、ID がわかっていないとそのデータは取得できない仕組みになっています。

これらのデータを、ID がわかっていなくとも SQL 文を改ざんすることで不正にデータを取得する方法を説明します。

まず、DVWA で Security Level を「Low」に変更します。
デフォルトだと「Impossible」になっており SQL インジェクションが成功ないため、脆弱性がある状態にします。

それでは攻撃を行います。
結論から言うと、入力部に「1′ OR ‘a’=’a」と入力し Submit をクリックすると全データが表示されます。

なぜ、「1′ OR ‘a’=’a」と入力すると全てのデータが表示されるのでしょうか?
上述した流れに沿って説明していきます。

WEBブラウザに「1′ OR ‘a’=’a」と入力すると、DVWA がデータベースに対して以下の SQL 文を実行します。

SELECT First name,Surname FROM User list WHERE ID='1' OR 'a'='a';

この構文は『User list 表から 「ID =1」もしくは「a=a」いずれかの条件式が正となる行の First name と Surname を出力する』というものです。

条件式に注目すると、ID=1が正となる行は1つしか存在しないのですが、「a=a」は必ず正となります。この部分は「b=b」でも「c=c」でも構わないです。

そのため、すべての行で正を返し、First name と Surname が全データ出力されてしまうというわけです。

この構文は最も初歩的な SQL インジェクションであり、ログインページでパスワード部に「1′ OR ‘a’=’a」を指定することで、パスワードがわかっていなくてもログインすることができます。

このように、WEB アプリケーション側が意図しない構文を実行させることでデータベースを不正に操作することができました。

今回は SQL インジェクションの一例を紹介しました。
次回以降の記事でも SQL インジェクションの攻撃手法をいくつか紹介していきたいと思います。

くどり

この記事は「ハッキング・ラボのつくりかた 第7章 」をベースに作成しています。購入リンクは以下です。
※Amazonアソシエイトを使用しています。

コメント

タイトルとURLをコピーしました