촉촉한초코칩
wargame.kr type confusion 본문
코드
<?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 값이 맞아야 flag가 출력된다.
공격
php의 Type Confusion에 대해 알아보았다. → 문자열끼리 동일한지 비교할 때 배열로 보내서 비교를 하게 되면 무조건 true를 반환하게 된다고 한다.
그래서 key 값을 쓸 때 배열로 입력해보았는데 잘 안된다..
key 값은 uniqid("", true) 함수를 통해 생성된다.
- 이 함수는 특정 시간 기반으로 고유한 문자열 ID를 생성한다.
- ""에 문자열을 넣으면 앞에 해당 문자열을 포함해서 생성한다.
- true로 설정하면 밀리초 값을 더 많은 엔트로피 값으로 대체하여 ID를 생성한다.
→ 그렇다면 앞에 어떤 문자열이 나오는지는 알게 된 건가?? 해당 문자열을 sha1로 바꾸면 1E29E079CDDB3EFE60E062A1DB585FD9A5FD1C90가 나온다.
그렇다면 입력하는 key 값을 json_decode하고, 이 값과 sha1한 key 값을 비교한다는 건가?
→ sha1한 key 값을 json_decode로 복호화
아닌 것 같다.
brupe suite 이용해서 풀어보았다.
문자열이 true와 비교하면 true가 되므로 true를 입력해준다..? https://jwcs.tistory.com/66
'Study > Web Hacking' 카테고리의 다른 글
Dreamhack - blind sql injection advanced (0) | 2024.09.29 |
---|---|
wargame.kr md5 password (0) | 2024.09.23 |
wargamme.kr - tmitter (1) | 2024.09.13 |
Dreamhack - login filtering (1) | 2024.09.06 |
Dreamhack - baby-union (0) | 2024.08.25 |