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이 제대로 들어갈 것 이다.