1. ๋ฌธ์
https://dreamhack.io/wargame/challenges/329
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"๋ก ๋ณํ์ง ์์๊น ํ๋ ๊ฒ์ด์๋๋ฐ ๋คํํ ํ๋๊ทธ๊ฐ ์ ์ถ๋ ฅ์ด ๋์๋ค.
๊ทธ ์ด์ ๋ ์ ์ ์ ๊ธ์ ์ ๋ฆฌ๊ฐ ๋์ด์๋ค.