SQL の基本(SELECT 文など)を理解している前提でこの記事を書いています。 ハッキングは犯罪です。実際に試すのはセキュリティチェックの意味を込めて自分で作ったアプリだけに留めましょう。また以下の実践的な SQL インジェクションはすべて RangeForce のラボ上で行われています。
以前書いた記事は SQL インジェクション攻撃の基礎とログインの悪用を実践しています。対策もザックリまとめてあるのでまだ見ていない方はこちらからどうぞ。
ユニオンセレクトを使った SQL インジェクション
SQL インジェクションでユニオンセレクトを使うとデータベース名、テーブル名、コラム名が簡単に調べられます。この辺の情報が手に入るだけでもすべてのデータが手に入りやすくなってしまいます。ハッカーとしてはきっと嬉しいものですが、開発者には相変わらず嫌な話です。
そもそも UNION SELECT が分からない人は SQL 基礎を勉強してください。簡単にいうと普通の SELECT 文に加えて別のものを SELECT できる※ただしコラムの数が同じかつ値も似たデータタイプでいないといけないというものです。w3schoolsが分かりやすいと思います。
実践してみる

例えばこんなサイトがあったとします。まずは前回と同様に途中でコメントアウトさせるような SQL 文を打ってテーブル名やコラム名を取得したいです。そんなときは
union select TABLE_NAME, COLUMN_NAME from information_schema.columns;
がとても便利に使えます。このままだと動かないので実際に動かしてみましょう。 今回は表には 4 個の要素(Code、Description、Stock、Price)がありますが、適当に入れた SQL が出したエラー文によるとこの検索バーで使われている SQL 文は
SELECT id, name, description, stock, price FROM shop_items where name like '%'
の 5 個を SELECT しています。UNION SELECT を使うときは、この数が大事になります。5 個ということを意識して
' union select 1,2,TABLE_NAME, COLUMN_NAME,5 from information_schema.columns; # --
上を入れてみましょう。中身は以下の通りになります。
SELECT id, name, description, stock, price FROM shop_items where name like '%' union select 1,2,TABLE_NAME, COLUMN_NAME,5 from information_schema.columns; # -- %' or description like '%' union select 1,,TABLE_NAME, COLUMN_NAME,5 from information_schema.columns; # -- %'
こんなものを入れてみましょう。UNION SELECT を使って information_schema からテーブル名とコラム名を取得するようなクエリです。12,5 は数合わせのために SELECT しているだけなので実際はなにを入れていてもかまいません。

いい感じに大量のデータが返ってきました。password でページ内を検索するとかなりハッカーだったら欲しい部分のテーブル名とコラム名をゲットできました。じゃあそのままそのユーザー情報を抜き取ってしまいましょう。少し自分で考えてみるのも楽しいです。
' union select id,username,password,email,role from shop_users; # --
わたしはこんなものを検索バーに入れてみました。先ほどは information_schema.columns テーブルから取得していた情報ですが、既にテーブル名とコラム名が分かっているのでそのまま shop_users テーブルから username や password を取得します。ちなみに Role も SELECT したので管理者も丸わかりです。

SQL インジェクションの対策がされていないかつパスワードも平文のまま保存されているというなかなかにヤバイサイトです。ハッカーにとっては万々歳の結果となりました。
パスワードは必ずハッシュ化(できればソルトやペッパーも)し平文のまま扱うことがないようにしましょう。また一部のハッシュアルゴリズム(md5 など)は既に安全でないことが分かっています。その場合は簡単にクラックできてしまうので安全性の高いものを選びましょう。
まとめ
何度も書いていますが、実際には行わないでください。 他にもインジェクションの種類はたくさんありますが、今回はユニオンセレクトを使った SQL インジェクションを紹介してみました。使える場所も限られてきますが、検索バーあたりが最も怪しい場所だと言えます。特に入力のチェックもなくデータを返している場合は要注意です。是非あなたのサイトで確認してください!もしインジェクション出来てしまうようであればしっかり対策してセキュリティを改善しましょう。

Comments
コメントを読み込み中...
コメントを残す