ポイント

●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になっているのが確認できます。

この先は会員の登録が必要です。有料会員(月額プラン)は初月無料!

日経 xTECHには有料記事(有料会員向けまたは定期購読者向け)、無料記事(登録会員向け)、フリー記事(誰でも閲覧可能)があります。有料記事でも、登録会員向け配信期間は登録会員への登録が必要な場合があります。有料会員と登録会員に関するFAQはこちら