문제 설명
단순 비교 문제
문제 이름이 힌트가 된다는...
서버 생성해서 들어가 보면 진짜 간단한... 형태의 페이지
특정 문자열 넣어서 check를 해야 되는 것 같음
아무 글자나 넣고 check 했더니 이런 메시지 뜸.
우선 소스 코드부터 열어 보자
<?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>
사용자로부터 입력받은 key값이 json의 형태로 서버에 전달되고, 서버에 있는 고유한 키와 비교해 일치할 시 플래그를 반환하는 코드.
json은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷
서버에서 생성되는 키가 SHA1 해시로 보호된다.
혹시 내가 서버에서 생성되는 키를 맞혀서 입력하는 식으로 푸는 문제인가 싶어서 코드를 살펴 보니까,
function gen_key(){
$key = uniqid("welcome to wargame.kr!_", true);
$key = sha1($key);
return $key;
}
여기가 무슨... 마이크로초 단위의 타임스탬프라고 한다.
내가 키값을 찾아내는 건 아닌 듯. 코드를 수정해서 풀이하는 것 같다.
gen_key 함수의 리턴 타입이 문자열이라는 건?... 약간 반 확신?... 상태로... 일단 풀어본다.
if ($json->key == $key) {
$ret = ["code" => true, "flag" => auth_code("type confusion")];
} else {
$ret = ["code" => false];
}
코드의 이 부분을 보면,
$json->key == key가 true가 되어야 FLAG를 얻을 수 있다.
이때 여기서의 ==는 느슨한 비교(Loose comparisons)이다.
이 그림은 느슨한 비교표이다. 어떤 것이 어떤 것과 만났을 때 true를 반환하는지 알려주는 표.
리턴 타입이 문자열일 거라고 생각했으니까, 표 안에서 "php"라는 부분을 주의깊게 보자. 왜냐면 저게 문자열이니까
"php"는 표 상에서 true, 0, 같은 문자열과 비교할 시 true를 반환한다.
위에서 우리는 같은 문자열과 비교하는 것은 사실상 불가능임을 이미 알았으니까
true나 0이라는 값을 넣어주면 true가 되고 플래그를 획득 가능할 것이다~~
그리고 서버에서 F12로 소스 코드까지 열어 봤다.
check 버튼을 누를 때, submit_check(this)라는 함수가 동작된다.
소스코드 뒤져보니까 submit_check(this)는 util.js에 정의되어 있음.
코드 훑어 보니 submit 함수에 파라미터를 넣는 값이 JSON 형식으로 데이터를 넘김.
이 데이터를 넘길 때 기존 함수에서는 {key: key}로 넘기는데,
위에서 true나 0 값과 비교하면 바로 true 반환한다고 했으니 저 값을 true로 수정해서 취약점을 이용해 보겠다.
이렇게 수정 완료.
이제 아무 문자열이나 입력하고 check를 진행해 본다.
우와 성공이다 ~.~
+여담...
소스코드 수정하고 꼭 ctrl+s 눌러서 저장해야 내가 수정한대로 작동된다.
그리고 새로고침하면 소스코드 수정한 거 초기화되니까 다시 해야 된다.
궁금해서 true 말고 0으로도 설정해서 다시 해 봄
이건 왜 안 되지
모르겐네
'SWUFORCE > 워게임 풀이' 카테고리의 다른 글
[H4CKING GAME] Season1 : Paint (forensics) (2) | 2024.11.04 |
---|---|
[wargame.kr] md5 password (web) (0) | 2024.10.01 |
[wargame.kr] tmitter (web) (0) | 2024.09.24 |
[wargame.kr] strcmp (web) (0) | 2024.09.24 |
[Dreamhack] Broken Password (misc) (0) | 2024.08.27 |