Websec - Level 17
Level 17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
include "flag.php";
function sleep_rand() { /* I wish php5 had random_int() */
$range = 100000;
$bytes = (int) (log($range, 2) / 8) + 1;
do { /* Side effect: more random cpu cycles wasted ;) */
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
} while ($rnd >= $range);
usleep($rnd);
}
if (isset ($_POST['flag'])):
sleep_rand(); /* This makes timing-attack impractical. */
if (! strcasecmp ($_POST['flag'], $flag))
echo '<div class="alert alert-success">Here is your flag: <mark>' . $flag . '</mark>.</div>';
else
echo '<div class="alert alert-danger">Invalid flag, sorry.</div>';
Solution
strcasecmp는 strcmp함수랑 똑같은 함수다.
- 정리하면 PHP 5.3 버전에서 발생하는 문제로, 인자값에 배열을 넣게되면 NULL 값을 반환해서
PHP loose comparison vulnerability
에 의해 true를 리턴해서 우회가 가능함. - hackability.kr/entry/PHP-strcmp-취약점을-이용한-인증-우회
- burp suite를 이용해서 flag값을 배열로 바꿔서 주면 된다.
flag[]=123
This post is licensed under CC BY 4.0 by the author.