WebHacking/Wargame.kr

Wargame.kr type confusion

HSr00t 2018. 2. 25. 06:40
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?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>
cs


이번 문제는 JSON문제다 

{'key':'0'}을 넣게 되면 JSON decode를 해주면 key='0'이 된다.

우리가 비교하게 되는 $key는 문자열이다.

우리가 넣는 JSON은 문자열을 넣어도 되고 숫자를 넣어도 된다.

그리고 비교는 ==를 쓴다.


느낌이 온다 .. "0SECRET_FLAG" == 0을 비교하면 문자열 맨 앞에 있는 숫자와 비교를 하기 때문에 True가 될 것 이다.

{"key":0}을 넣으면 이상하게 안 된다.. 내가 쓰는 웹 서버에서는 잘 되던데 ..

그래서 조금 야매?를 써서 풀기로 하였다.


우리는 JSON값을 보내면 submit_check함수가 호출된다.



이곳에서 JSON디코드 된 값을 submit(값)을 넣어서 호출하는데 

submit(0)을 넣어주면 내가 넣을려 했던 숫자 0이 제대로 들어갈 것 이다.