반응형
type confusion 문제를 눌러보면
start를 누르면
view-source를 누르면
<?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>
다음과 같은 코드가 나오는데 여기서 중요한 코드만 해석해보면
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));
}
if(isset($_POST['json'])) : text 필드에서 값을 받아오면
$json = json_decode($_POST['json']) : 받은 값을 $json 변수에 저장
$key = gen_key() 함수를 통해 키를 생성한다.(gen_key()함수에 대한 설명은 밑에서 하도록 하겠다.)
if($json -> key == $key) ~~ : 만약 받은 json 변수 값과 key 값이 동일할 경우 flag 획득
gen_key() 함수
function gen_key(){
$key = uniqid("welcome to wargame.kr!_", true);
$key = sha1($key);
return $key;
}
key라는 변수에 uniqid() 함수를 이용하여 고유 id를 만드는데 앞에는 welcome to wargame.kr!_이라는 접두어가 붙고 뒤에 true라는 매개변수 때문에 16진수 23자리의 고유 id를 만들어낸다.
그 후 고유 id를 sha1 암호화를 한다.
문제를 한 문장으로 표현하면 내가 넣은 값과 $key의 값이 일치하면 flag를 획득한다.
이제 문제를 풀어보자
먼저 burpsuite를 킨다.
그 후 텍스트 필드에 아무 값이나 집어넣은 후 패킷을 잡는다.
패킷을 잡으면 다음과 같이 json값이 나오는데 이 json 값은 URL Encode 되어 있다.
이 값을 decode 하는 방법은 json 값을 누르고 오른쪽 마우스를 누른 다음에 convert selection -> URL -> URL decode를 누르면
다음과 같이 {"key":"123"}라는 값이 나온다.
문제를 풀기 전에 PHP 느슨한 비교를 알아야 한다.
다음 표는 PHP에서 '=='를 통한 느슨한 비교표이다.
"" 안에 문자가 들어가 있는 경우 True 값이나 0, 똑같은 문자를 집어넣게 되면 true를 리턴하게 된다.
이를 이용하여 key : ~에서 ~에 0을 집어넣고
다음과 같이 flag 값이 나온다.
반응형
'웹해킹 > wargame.kr' 카테고리의 다른 글
php? c? (1) | 2019.11.07 |
---|---|
img recovery (0) | 2019.10.24 |
tmitter (0) | 2019.08.12 |
md5 compare (0) | 2019.08.12 |
strcmp (0) | 2019.08.12 |