Post

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-취약점을-이용한-인증-우회


”==” 으로 비교할 때 image

”===” 으로 비교할 때 image


burp suite를 이용해서 flag값을 배열로 바꿔서 주면 된다.
flag[]=123






This post is licensed under CC BY 4.0 by the author.