ポイント

●SQLインジェクションとは,Webアプリケーションに不正なSQL文を実行させることにより,データを改ざんしたり破壊する手法のことである。OSコマンド・インジェクションやディレクトリ・トラバーサルと同様に,Webアプリケーションの脆弱性を突いた攻撃手法である
●堅牢なWebアプリケーションを開発するためには,セキュア・プログラミング技法を学ぶことはもちろん,コーディング規約の整備やレビューの実施など,開発体制を整えることも重要である

 前回はWebアプリケーションの脆弱性を利用する攻撃手法として,「ディレクトリ・トラバーサル」と「OSコマンド・インジェクション」を勉強しました。今回は「SQLインジェクション」の手法を学びます。SQLインジェクションもWebアプリケーションの脆弱性(=入力されるデータに対する考慮不足,あるいは処理忘れ)を突いた攻撃手法です。

SQLとは

 SQL(structured query language)とは,リレーショナル・データベース(RDB)を定義したり操作したりするための言語です。国際標準(ISO)や日本工業規格で規格化されています。人間が直接DBMS(data base managament system)にSQL文を打ち込んで操作するほかに,Webアプリケーションなどが動的にSQL文を作成してデータベースにアクセスする使い方もできます。

 ここでは,SQL文の例として検索で利用する「SELECT」と,既存のテーブルを修正する「UPDATE」の書式を紹介します。後ほどSQLインジェクションの仕組みを確認するときに必要になりますので,目を通しておいてください。

◆SELECT
SELECT 列名 FROM 表(テーブル)名 WHERE 検索条件

 実験環境では,MySQLというRDBをセットアップし,p_tableという表(テーブル)を作っています。このテーブルの中身をすべて見たい場合は,

SELECT * FROM p_table;

と打ち込んで問い合わせをします(図1(1))。「*」(アスタリスク)は,すべての列を意味します。また,WHERE以降(すなわち検索条件)はありません。このため,回答としてテーブルすべての列,すべての行(レコード)が実行結果として表示されます。実行結果にあるuser_idとpasswordが列名です。そして,データが3件格納されているのがわかります(2)。

図1●SELECT文による問い合わせと実行結果
図1●SELECT文による問い合わせと実行結果

◆UPDATE
UPDATE 表(テーブル)名 SET 列名及び修正後のデータ WHERE 検索条件

 UPDATEは,その名の通り,データベースの修正(アップデート)を実行します。図1で見たテーブルの1行目「yamada」のpasswordを'999'から'abc'に書き換えてみましょう。

UPDATE p_table SET password='abc' WHERE user_id='yamada';

と打ち込みます(図2(1))。ただし,この時点で画面には正常終了の旨しか表示されませんので,先ほどのSELECTを利用してテーブルの中身を再確認します。するとyamadaのpasswordが999からabcに書き換わっていることが確認できます。

図2●UPDATEでテーブル内の情報を修正する
図2●UPDATEでテーブル内の情報を修正する
[画像のクリックで拡大表示]

Webアプリケーションを介してRDBを操作_

 次に,Webアプリケーションを利用して,ネット経由でユーザーのパスワードを変更するためのシステムを考えます。サーバー上ではRDBが稼働しているものとします。

 ユーザーがサーバーにアクセスすると,ブラウザにパスワード変更ページが表示されます。ここに自分のユーザー名(ユーザーID)と変更後のパスワードを入力して送信します(図3(1))。

図3●Webアプリケーションを利用してRDB上のパスワードを修正する
図3●Webアプリケーションを利用してRDB上のパスワードを修正する
[画像のクリックで拡大表示]

 Webアプリケーションはこの情報を受け取って,データベースにアクセスするためのSQL文を組み立てます。この部分のプログラムは『UPDATE p_table SET password='入力されたパスワード' WHERE user_id='入力されたユーザーID'』 のようになっています。

 今回は,パスワードに「4545454」,ユーザーIDに「yamada」と入力されているので,実際には『UPDATE p_table SET password='4545454' WHERE user_id='yamada'』というSQL文が作られて実行されます(2)。実行後のデータベースの中身をのぞいてみると,yamadaのpasswordが4545454になっているのが確認できます。