Wargame/Web
[Wargame.kr] strcmp
1ullaby
2024. 5. 11. 02:44
strcmp 함수를 우회해야 하는 문제인 것 같다.
문제 서버에 접속하니 패스워드를 입력하는 창이 하나 있었다.
먼저 소스코드를 확인해보았다.
Source
<?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..";
}
}
- password는 완전 랜덤값
- password와 입력값 비교 → 반환값이 0이면(값이 같으면) 플래그 도출
- 브루트포스 불가
< strcmp() >
- strcmp(A, B) : A, B값이 같으면 0 반환
[취약점]
- 특정 PHP 버전에서는 '문자열'과 '배열'을 비교하면 같지 않아도 NULL을 반환
- 'NULL == 0' → '=='는 느슨한 비교이기 때문에 True
** NULL과 0 구분하려면 '===' 사용
개발자도구를 이용해 name="password"를 배열로 바꿔준다.
name="password[]"
이후 password 창에 아무 값이나 넣어 보내면 Flag 획득이 가능하다.