[RingZer0] – PHP Fairy

Diberi sebuah login form yang hanya meminta password.

Jika kita mencoba memasukkan kutip, outputnya sebagai berikut

Dan jika mencoba input random stuff akan mengoutput “Wrong password”. Maka saya mencoba melihat code nya dengan mengklik button “Code please!”

Kode lengkapnya sebagai berikut:

Dari source code ini kita dapat melihat berbagai hal yang menarik di:

  1. Line 12 (filter)
  2. Line 16 (variable)
  3. Line 17 (filter (dengan sedikit obfuscation))
  4. Line 18 (filter)

Kita coba mengerti hal-hal ini satu per satu,

Line 12:

if(!preg_match(‘/^[^\W_]+$/’, $_GET[‘pass’]))
regex apa ini… untungnya ada sebuah regex “explainer” di  http://rick.measham.id.au/paste/explain.pl yang sangat memudahkan kita dalam mengerti regex ini.
Ternyata cukup simple, regex ini membatasi kita agar hanya dapat menginput a-z, A-Z, 0-9, tanpa batas string length.
Line 16
$pass = md5(“admin1674227342”);
masih simple, masukkan saja di php di local machine.
Maka $pass = 0e463854177790028825434984462555
Line 17:
if ((((((((($_GET[‘pass’] == $pass)))) && (((($pass !== $_GET[‘pass’]))))) || ((((($pass == $_GET[‘pass’])))) && ((($_GET[‘pass’] !== $pass)))))))) { // Trolling u lisp masta
Filter ini sengaja dirumitkan terlihat dari comment-nya. maka kita coba untuk sederhanakan menjadi:
if (($_GET[‘pass’] == $pass) && ($pass !== $_GET[‘pass’]))
Sekarang terlihat bahwa filter hanya menginginkan $pass dan $_GET[‘pass’] untuk mempunyai value yang sama (==) namun type yang berbeda (!==). Setelah sedikit googling, eksperimen, dan menemukan web ini tersimpul bahwa:
  • ($pass == 0) akan menjadi TRUE, karena char pertama dari $pass adalah ‘0’
  • ($pass !=== 0) akan menjadi TRUE, karena $pass adalah string dan 0 adalah int

Maka kita coba input “0” di password.

Ternyata salah, sang penulis melupakan 1 hal terakhir.

Line 18:

if (strlen($pass) == strlen($_GET[‘pass’]))
Kita coba input “00000000000000000000000000000000” di password.
Flag:
FLAG-K7PY48gt02T1yvoO9jzP694FztgR1jIS

Leave a Reply

Your email address will not be published. Required fields are marked *