CTF, War game

[wargame.kr] type confusion

mnzy๐ŸŒฑ 2024. 8. 19. 03:09

1. ๋ฌธ์ œ 

https://dreamhack.io/wargame/challenges/329

 

[wargame.kr] type confusion

Description Simple Compare Challenge. hint? you can see the title of this challenge. :D

dreamhack.io

2. ํ•ด๊ฒฐ ๊ณผ์ •

(1) ์ฝ”๋“œ ๋ถ„์„

post ์š”์ฒญ์„ ํ†ตํ•ด json ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„์™€์„œ decodeํ•ด์ค€๋‹ค. 

์ด ๊ฒฐ๊ณผ๊ฐ€ post ์š”์ฒญ์‹œ ์‹คํ–‰๋˜๋Š” gen_key() ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜จ key๊ฐ’๊ณผ ์ผ์น˜ํ•  ๊ฒฝ์šฐ์—๋งŒ flag๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค. 

์ด๋•Œ ๋น„๊ต์—ฐ์‚ฐ์—์„œ ==์œผ๋กœ ๋А์Šจํ•œ ๋น„๊ต๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

2024.06.20 - [Study/WebHacking] - [PHP] Type Juggling ์ทจ์•ฝ์ 

<?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>

 

๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด util.js์„ ํ™•์ธํ•ด๋ณด๋ฉด key๋ผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ค์‹์œผ๋กœ ๋ฐ›์•„์˜ค๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

[์ฐธ๊ณ ] ajax๋กœ post/get ์š”์ฒญ : https://blog.naver.com/PostView.nhn?blogId=ka28&logNo=222038499551

https://webinformation.tistory.com/22

 

์ฝ”๋“œ๋ฅผ key๋ณ€์ˆ˜์— ์ €์žฅ๋œ key๊ฐ’์„ json์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๊ฐ’์„ ๋ฐ›์•„์˜จ๋‹ค. 

์ฆ‰ key:key ์˜ ๋‘๋ฒˆ์งธ ๊ฐ’์ด ์œ„ php ์ฝ”๋“œ ๋น„๊ต์—ฐ์‚ฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” json์˜ key๊ฐ’์ธ ๊ฒƒ์ด๋‹ค. 

๋”๋ณด๊ธฐ

์ด ํ‘œํ˜„์€ JavaScript ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. JavaScript ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•œ ๋‹ค์Œ, ํ•ด๋‹น ๋ฌธ์ž์—ด์„ json์ด๋ผ๋Š” ์ด๋ฆ„์˜ POST ๋ฐ์ดํ„ฐ๋กœ ์„œ๋ฒ„์— ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • key: ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” key๋ผ๋Š” ์†์„ฑ ์ด๋ฆ„์œผ๋กœ JSON ๊ฐ์ฒด์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • {key: key}: ์ด ๊ตฌ๋ฌธ์€ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ key๋Š” ๊ฐ์ฒด์˜ ์†์„ฑ์ด๋ฉฐ, ๊ทธ ๊ฐ’์€ key ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋งŒ์•ฝ key ๋ณ€์ˆ˜์˜ ๊ฐ’์ด "my_secret_key"๋ผ๋ฉด, ๊ฐ์ฒด๋Š” {key: "my_secret_key"}๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

{json: JSON.stringify({key: key})}: ์ฆ‰, ์ด ๊ตฌ๋ฌธ์€ ๋˜ ๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” json์ด๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ๊ฐ’์€ ๋ฐฉ๊ธˆ ์ƒ์„ฑํ•œ JSON ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ด ๊ฐ์ฒด๋Š” {json: '{"key":"my_secret_key"}'}์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

//chat gpt

 

+)

  • ๋ฐ์ดํ„ฐ ์ „์†ก ํ˜•์‹ ํ†ต์ผ:
    • ์„œ๋ฒ„์—์„œ ํŠน์ • ํ˜•์‹(JSON ๋ฌธ์ž์—ด)์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. PHP ์ฝ”๋“œ์—์„œ๋Š” $_POST['json']์„ ํ†ตํ•ด JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ , ์ด๋ฅผ json_decode๋กœ ๋””์ฝ”๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JSON.stringify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์„œ๋ฒ„์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, {key: key}๋ผ๋Š” JavaScript ๊ฐ์ฒด๋ฅผ JSON.stringify๋ฅผ ํ†ตํ•ด {"key": "some_value"}์™€ ๊ฐ™์€ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์ฒด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜:
    • AJAX ์š”์ฒญ์˜ data ํ•„๋“œ์— ์ „๋‹ฌํ•˜๋Š” ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JSON.stringify๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด JavaScript ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ AJAX ์š”์ฒญ์˜ ๋ฐ์ดํ„ฐ๋กœ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

function submit(key){
	$.ajax({
		type : "POST",
		async : false,
		url : "./index.php",
		data : {json:JSON.stringify({key: key})},
		dataType : 'json'
	}).done(function(result){
		if (result['code'] == true) {
			document.write("Congratulations! flag is " + result['flag']);
		} else {
			alert("nope...");
		}
		lock = false;
	});
}

 

(2) ์ต์Šคํ”Œ๋กœ์ž‡

๊ฒฐ๊ตญ ๋А์Šจํ•œ ๋น„๊ต๋ฅผ ํ†ตํ•œ ๋ฌธ์ž์—ด ๋น„๊ต๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•˜๋ฏ€๋กœ key๊ฐ’์„ ๋ฌธ์ž์—ด์ด ์•„๋‹Œ true ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟ”์ค„ ๊ฒƒ์ด๋‹ค.

(์ˆ˜์ •ํ•˜๊ณ  ctrl+s๋ฅผ ํ•ด์ค˜์•ผ ๋ฐ˜์˜์ด ๋œ๋‹ค.)

 

์ด๋•Œ ํ•œ๊ฐ€์ง€ ๊ถ๊ธˆํ–ˆ๋˜ ๊ฒƒ์ธ true ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ "true"๋กœ ๋ณ€ํ•˜์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋Š”๋ฐ ๋‹คํ–‰ํžˆ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์ž˜ ์ถœ๋ ฅ์ด ๋˜์—ˆ๋‹ค.

๊ทธ ์ด์œ ๋Š” ์œ„ ์ ‘์€ ๊ธ€์— ์ •๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๋‹ค.