ポイント●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文による問い合わせと実行結果 |
◆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でテーブル内の情報を修正する [画像のクリックで拡大表示] |
Webアプリケーションを介してRDBを操作_
次に,Webアプリケーションを利用して,ネット経由でユーザーのパスワードを変更するためのシステムを考えます。サーバー上ではRDBが稼働しているものとします。
ユーザーがサーバーにアクセスすると,ブラウザにパスワード変更ページが表示されます。ここに自分のユーザー名(ユーザーID)と変更後のパスワードを入力して送信します(図3(1))。
| |
図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になっているのが確認できます。