type-confusion
별다른게 없으니 소스를 보러 가겠다.
function gen_key(){
$key = uniqid("welcome to wargame.kr!_", true);
$key = sha1($key);
return $key;
}
gen_key 함수를 선언하였다.
key 변수에 php 내장함수인 uniqid 함수를 통해 (welcome to wargame.kr!_)+16진수의 23자리 id값을 저장하였다.
uniqid함수는 기본형은 16진수 13자리, true를 붙히면 23자리의 랜덤한 고유 아이디값을 생성한다.
ref-https://zetawiki.com/wiki/PHP_uniqid()
그리고 그 id값을 sha hash 한다.
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));
}
문제 첫 화면의 텍스트 입력폼의 입력값을 json 형식으로 받는다. 이 수의 key값과, gen_key 함수를 하여 (welcome to wargame.kr!_)+16진수의 23자리 id값을 저장한 key변수 값이 같으면 flag 값을 얻을 수 있다. 때려맞추기가 거의 불가능해 보이지만 php에서 느슨한 비교인 == 연산을 사용하였다.
이미지에서 보듯이 php ==비교에서는 문자열과 true, 0값 등을 비교하면 무조건 참을 반환하는 취약점이 있다.
버프쉿을 사용하여 아무값이나 넣어 전송하면, 인코딩 된 값으로 나온다.
이 값을 디코딩한 후,
true로 바꿔 전송하였다.
플래그 값을 얻을 수 있다.
'wargame > wargame.kr' 카테고리의 다른 글
14번 php? c? (0) | 2019.11.12 |
---|---|
13번 img recovery (0) | 2019.11.05 |
11번 tmitter (0) | 2019.11.01 |
10번 md5_compare (0) | 2019.10.31 |
9번 strcmp (0) | 2019.10.30 |