본문 바로가기

웹해킹/wargame.kr

type confusion

type confusion 문제를 눌러보면

start를 누르면

 view-source를 누르면

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 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));
 }

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

<html>
    <head>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
        <script src="./util.js"></script>
    </head>
    <body>
        <form onsubmit="return submit_check(this);">
            <input type="text" name="key" />
            <input type="submit" value="check" />
        </form>
        <a href="./?view-source">view-source</a>
    </body>
</html>

 

다음과 같은 코드가 나오는데 여기서 중요한 코드만 해석해보면

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));
 }

if(isset($_POST['json'])) :  text 필드에서 값을 받아오면

$json = json_decode($_POST['json']) : 받은 값을 $json 변수에 저장

$key = gen_key() 함수를 통해 키를 생성한다.(gen_key()함수에 대한 설명은 밑에서 하도록 하겠다.)

if($json -> key == $key) ~~ : 만약 받은 json 변수 값과 key 값이 동일할 경우 flag 획득

 

gen_key() 함수

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

key라는 변수에 uniqid() 함수를 이용하여 고유 id를 만드는데 앞에는 welcome to wargame.kr!_이라는  접두어가 붙고 뒤에 true라는 매개변수 때문에 16진수 23자리의 고유 id를 만들어낸다.

그 후 고유 id를 sha1 암호화를 한다.

 

문제를 한 문장으로 표현하면 내가 넣은 값과 $key의 값이 일치하면 flag를 획득한다.

이제 문제를 풀어보자

먼저 burpsuite를 킨다.

그 후 텍스트 필드에 아무 값이나 집어넣은 후 패킷을 잡는다.

패킷을 잡으면 다음과 같이 json값이 나오는데 이 json 값은 URL Encode 되어 있다.

이 값을 decode 하는 방법은 json 값을 누르고 오른쪽 마우스를 누른 다음에 convert selection -> URL -> URL decode를 누르면

다음과 같이 {"key":"123"}라는 값이 나온다.

문제를 풀기 전에 PHP 느슨한 비교를 알아야 한다.

다음 표는 PHP에서 '=='를 통한 느슨한 비교표이다.

"" 안에 문자가 들어가 있는 경우 True 값이나 0, 똑같은 문자를 집어넣게 되면 true를 리턴하게 된다.

이를 이용하여 key : ~에서 ~에 0을 집어넣고

다음과 같이 flag 값이 나온다.

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

php? c?  (0) 2019.11.07
img recovery  (0) 2019.10.24
type confusion  (0) 2019.10.22
tmitter  (0) 2019.08.12
md5 compare  (0) 2019.08.12
strcmp  (0) 2019.08.12