문제 설명
strcmp 함수를 우회할 수 있다면, 플래그가 표시됩니다.
서버 생성 후 접속.
<?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>
페이지의 view-source 누르면 이렇게 소스코드를 보여 준다.
문제 설명에서 strcmp 함수를 우회하라고 했으니까 strcmp가 있는 라인을 주의 깊게 봤다.
if (strcmp($_POST['password'], $password) == 0) {
echo "Congratulations! Flag is <b>" . $FLAG ."</b>";
여기 코드에서도, strcmp를 사용해 입력받은 password와,
코드 시작부에서 지정하고 있는 패스워드 값 ($password = sha1(md5(rand().rand().rand()).rand()); 을 통해 랜덤 숫자로 해시화된 비밀번호)를 비교하여 두 문자열이 일치할 시 플래그를 나타낸다는 것을 알 수 있다.
코드 자체는 엄청 간단하다.
다만 패스워드가 임의 생성되는 거라 내가 단순히 서버에 password 입력해서 풀 수 있는 건 아님...
랜덤 난수를 버퍼 스위트 같은 걸로 입력해도 한나절 걸릴 듯
정말 코드 속 취약점을 이용해서 풀이해야 한다.
일단 strcmp 함수는 매개변수로 들어온 두 개의 문자열을 비교하여 문자열이 완전히 일치하면 0을 반환하는 함수이다.
그리고 문자열 두 개가 아니라, 문자열과 배열을 비교하면 두 값이 같지 않더라도 0을 출력하게 된다.
소스코드에서 내가 입력하는 password를 배열 형식의 password[]로 변경해 주면 문제가 해결될 것 같다!
이렇게 수정하여 name을 배열로 만들어 버렸다.
password 입력 칸에 임의로 '123'을 입력해 본다.
문제 해결 완료~
'SWUFORCE > 워게임 풀이' 카테고리의 다른 글
[wargame.kr] type confusion (web) (2) | 2024.10.01 |
---|---|
[wargame.kr] tmitter (web) (0) | 2024.09.24 |
[Dreamhack] Broken Password (misc) (0) | 2024.08.27 |
[Dreamhack] rev-basic-0 (reversing) (0) | 2024.08.27 |
[Dreamhack] file-special-bit (misc) (0) | 2024.08.20 |