본문 바로가기
wargame/wargame.kr

12번 type_confusion

by NTART 2019. 11. 4.

type-confusion

 

별다른게 없으니 소스를 보러 가겠다.

 

 function gen_key(){
     $key = uniqid("welcome to wargame.kr!_", true);
    $key = sha1($key);
     return $key;
 }

gen_key 함수를 선언하였다. 

key 변수에 php 내장함수인 uniqid 함수를 통해 (welcome to wargame.kr!_)+16진수의 23자리 id값을 저장하였다.

uniqid함수는 기본형은 16진수 13자리, true를 붙히면 23자리의 랜덤한 고유 아이디값을 생성한다.

ref-https://zetawiki.com/wiki/PHP_uniqid()

그리고 그 id값을 sha hash 한다.

 

 if (isset($_POST['json'])) {
     usleep(500000);
     require("../lib.php"); // include for auth_code function.
    $json = json_decode($_POST['json']);
    $key = gen_key();
    if ($json->key == $key) {
        $ret = ["code" => true, "flag" => auth_code("type confusion")];
    } else {
        $ret = ["code" => false];
    }
    die(json_encode($ret));
 }

 문제 첫 화면의 텍스트 입력폼의 입력값을 json 형식으로 받는다. 이 수의 key값과, gen_key 함수를 하여 (welcome to wargame.kr!_)+16진수의 23자리 id값을 저장한 key변수 값이 같으면 flag 값을 얻을 수 있다. 때려맞추기가 거의 불가능해 보이지만 php에서 느슨한 비교인 == 연산을 사용하였다. 

 

이미지에서 보듯이 php ==비교에서는 문자열과 true, 0값 등을 비교하면 무조건 참을 반환하는 취약점이 있다.

 

버프쉿을 사용하여 아무값이나 넣어 전송하면, 인코딩 된 값으로 나온다. 

 

이 값을 디코딩한 후,

 

true로 바꿔 전송하였다.

 

플래그 값을 얻을 수 있다.

'wargame > wargame.kr' 카테고리의 다른 글

14번 php? c?  (0) 2019.11.12
13번 img recovery  (0) 2019.11.05
11번 tmitter  (0) 2019.11.01
10번 md5_compare  (0) 2019.10.31
9번 strcmp  (0) 2019.10.30