촉촉한초코칩

wargame.kr type confusion 본문

Study/Web Hacking

wargame.kr type confusion

햄친구베이컨 2024. 9. 13. 21:00

 

코드

<?php
 if (isset($_GET['view-source'])) {
     show_source(__FILE__);
    exit();
 }
 if (isset($_POST['json'])) {
     usleep(500000);
     require("./lib.php"); // include for FLAG.
    $json = json_decode($_POST['json']);
    $key = gen_key();
    if ($json->key == $key) {
        $ret = ["code" => true, "flag" => $FLAG];
    } 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>

key 값이 맞아야 flag가 출력된다. 

 

공격

php의 Type Confusion에 대해 알아보았다. → 문자열끼리 동일한지 비교할 때 배열로 보내서 비교를 하게 되면 무조건 true를 반환하게 된다고 한다. 
그래서 key 값을 쓸 때 배열로 입력해보았는데 잘 안된다.. 

 

key 값은 uniqid("", true) 함수를 통해 생성된다. 

  • 이 함수는 특정 시간 기반으로 고유한 문자열 ID를 생성한다. 
  • ""에 문자열을 넣으면 앞에 해당 문자열을 포함해서 생성한다. 
  • true로 설정하면 밀리초 값을 더 많은 엔트로피 값으로 대체하여 ID를 생성한다. 

→ 그렇다면 앞에 어떤 문자열이 나오는지는 알게 된 건가?? 해당 문자열을 sha1로 바꾸면 1E29E079CDDB3EFE60E062A1DB585FD9A5FD1C90가 나온다. 

그렇다면 입력하는 key 값을 json_decode하고, 이 값과 sha1한 key 값을 비교한다는 건가? 
sha1한 key 값을 json_decode로 복호화 

 

아닌 것 같다.

 

brupe suite 이용해서 풀어보았다. 

문자열이 true와 비교하면 true가 되므로 true를 입력해준다..? https://jwcs.tistory.com/66

'Study > Web Hacking' 카테고리의 다른 글

Dreamhack - blind sql injection advanced  (0) 2024.09.29
wargame.kr md5 password  (0) 2024.09.23
wargamme.kr - tmitter  (1) 2024.09.13
Dreamhack - login filtering  (1) 2024.09.06
Dreamhack - baby-union  (0) 2024.08.25