<?php
require("./lib.php"); // for FLAG
$password = sha1(md5(rand().rand().rand()).rand());
if (isset($_GET['view-source'])) {
show_source(__FILE__);
exit();
}else if(isset($_POST['password'])){
sleep(1); // do not brute force!
if (strcmp($_POST['password'], $password) == 0) {
echo "Congratulations! Flag is <b>" . $FLAG ."</b>";
exit();
} else {
echo "Wrong password..";
}
}
?>
<br />
<br />
<form method="POST">
password : <input type="text" name="password" /> <input type="submit" value="chk">
</form>
<br />
<a href="?view-source">view-source</a>
위 코드를 보면 $password = sha1(md5(rand().rand().rand()).rand()); ’password’는 rand함수를 사용하여 난수를 세 번 생성하고, md5함수를 사용하여 세 개의 난수를 합쳐서 문자열로 만들고 md5해시로 변환합니다.
다시 한 번 rand함수로 난수를 만들어서 앞서 만들어진 md5 해시 문자열에 추가합니다.
마지막으로 위의 문자열을 sha함수를 사용하여 sha-1 해시로 변환해서 저장하는 코드입니다.
strcmp($_POST['password'], $password) == 0 그리고 이 코드를 통해 strcmp함수를 써서 $password와 입력받은 password와 비교해서 같으면 0을 출력하므로 0이 나온다면 Flag를 출력합니다.
그러나 strcmp함수는 치명적인 취약점이 존재하는데,
strcmp는 인자값으로 문자열이 들어오지 않을 경우 0을 반환하게 된다.
그렇다는 것은 password 값을 문자열이 아닌 배열로 바꾸고 포워드 해주면 0을 반환해서 Flag 값을 반환할 것 같다.
맨 아래 password 값이 보이는데 이 값을 수정해주면 된다.
password=~~~ → password[0] , password를 문자열이 아닌 배열로 수정해주고 포워드 해주면?
Flag를 뱉어낸다.
'DreamHack > Web hacking' 카테고리의 다른 글
[LEVEL-1] simple_sqli_chatgpt (1) | 2023.11.27 |
---|---|
[LEVEL-1] session-basic (0) | 2023.11.20 |
[LEVEL-1] Type c-j (0) | 2023.11.15 |
[LEVEL-Beginner] session (2) | 2023.11.09 |
[LEVEL-1] baby-union (0) | 2023.11.09 |