websec.fr level17 write up
2017. 12. 11. 18:16
한국인이니까 한국어로 write up쓰는 거 이해 부탁.
websec.fr 의 전체적인 문제 수준과 비교해서 제일 쉬웠던 문제였다. 이미 알고 있는 취약점이였기 때문이기도 함ㅋㅋ
Challenge Analyse
일단 소스가 제공되니까 소스부터 보도록하자. (최근에 블로그에 syntax highlighter 깐 건 덤으로 자랑...ㅎㅎ)
<?php 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); } ?> <!DOCTYPE html> <head> <title>#WebSec Level Seventeen</title> <link rel="stylesheet" href="../static/bootstrap.min.css" /> <meta http-equiv="content-type" content="text/html;charset=UTF-16"> </head> <div id="main"> <div class="container"> <div class="row"> <h1>Level Seventeen <small> - Guessing is fun!</small></h1> </div> <div class="row"> <p class="lead"> Can you guess the flag? You can check the sources <a href="source.php">here</a>. </p> </div> </div> <div class="container"> <div class="row"> <form class="form-inline" method='post'> <input name='flag' class='form-control' type='text' placeholder='Guessed flag'> <input class="form-control btn btn-default" name="submit" value='Go' type='submit'> </form> </div> </div> <?php if (isset ($_POST['flag'])): sleep_rand(); /* This makes timing-attack impractical. */ ?> <br> <div class="container"> <div class="row"> <?php 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>'; ?> </div> </div> <?php endif ?> </div>
일단 플래그를 POST 데이터로 보내게 되면, sleep_rand() 함수로 인해 약간의 sleep을 거치게 된다. 그리고 입력받은 플래그를 flag.php에서 정의되어 있는 $flag 변수와 strcasecmp()함수로 비교한다.
strcasecmp(), strcmp() 함수는 PHP내부에서 상당히 위험한 함수에 속한다. 만약에 사용자가 값을 Array() 형식으로 주었다면 쉽게 escape가 가능하기 때문이다.
strcasecmp() 함수 취약성의 PoC(Proof of Code)
공격 시나리오
RESTful API를 이용해서 스슥- 하면 될 것 같다.
Exploit
Chrome 플러그인 중에 REST API가 있는데 이것을 이용해서 쉽게 HTTP Request를 보낼 수 있다.
요거슬 이용해서 스슥-하면 플ㄹ래그가 나온다.
flag : WEBSEC{It_seems_that_php_could_use_a_stricter_typing_system}
'write-ups > websec.fr' 카테고리의 다른 글
websec.fr level25 write up (0) | 2018.07.03 |
---|---|
websec.fr level28 write up (1) | 2018.06.28 |
websec.fr level14 solving (0) | 2018.03.24 |
websec.fr level15 write up (0) | 2018.03.21 |
websec.fr level06 write up (0) | 2017.12.11 |