#SQLとは
SQLとはStructured English Query Languageの略称で,データベースを操作するための言語です.基本的な構文としてSELECT,INSERT,UPDATE,DELETEの4つがあります.
命令 | 説明 | 文法 |
---|---|---|
SELECT | データの参照 | SELECT カラム名1, カラム名2, ... FROM テーブル名 [WHERE 絞込条件]; |
INSERT | データの挿入 | INSERT INTO テーブル名 (カラム名1, カラム名2, ...) VALUES (値1, 値2, ...); |
UPDATE | データの更新 | UPDATE テーブル名 SET カラム名1=値1 [, カラム名2=値2 ...] [WHERE 絞込条件]; |
DELETE | データの削除 | DELETE FROM テーブル名 [WHERE 絞込条件]; |
SQLインジェクションで起点となるのもこれらの4構文です.そのため基本的な使い方はマスターしておいた方が良いでしょう.
#SQLインジェクション
コンピュータで扱う言語の中で,特殊な意味をもつ文字をメタキャラクタと呼びます.SQLにおいても特殊な意味をもつメタキャラクタが存在しており,例えば以下のSQL文ではシングルクォーテーションマークを用いて,文字列とそうでない部分を区別しています.
SELECT * FROM users WHERE username='admin';
シングルクォーテーションで囲まれたadminは文字列として扱われ,囲まれていない部分はSQLの文として扱われます.
ではusernameに入力する文字列が' OR 1=1 --だった場合どうなるでしょうか.
SELECT users WHERE username='' OR 1=1 --';
このSQL文では条件を指定するWHERE句においてusernameが空であるか,1と1が等しい場合に真を返すという指定がなされています.そのため,入力したユーザ名・パスワードに関係なくクエリが成立してしまうのです.
このようにメタキャラクタを用いてSQL文を管理者の意図しない文に改変することで実行させるのがSQLインジェクションという攻撃手法です.
#最後に
いかがでしたでしょうか.SQLインジェクションは非常に簡単に書くことができるにもかかわらず,強力な攻撃手法です.CTF以外の実際のサービスで使用すれば不正アクセス禁止法に抵触してしまったり,データベースに被害を与えれば訴えられてしまうこともあります.そのため許諾を得ていない環境でのSQLインジェクションは絶対に行わないでください.