[Wargame.kr] login filtering
Start를 누르면 wargame.kr:8080/login_filtering/ 사이트로 넘어가진다.
일단 get source를 눌러보자.
소스코드를 주다니 정말 친절한 사이트이다.
여기서 주는 힌트는 id : guest / pw : guest이다. guest라는 것을 이용해 문제를 풀어봐야겠다.
일단 코드를 간단한게 해석 보면 id, pw가 틀리면 Wrong 문구가 뜨고, 잘 입력하면 your account is blocked가 뜬다.
우리가 필요한 것은 login ok 구문과 key 값을 받는 것이다. 문제의 제목처럼 필터링을 해야 하는 듯하다.
if(isset($row['id'])){
if($id=='guest' || $id=='blueh4g'){
echo "your account is blocked";
}
else{
echo "login ok"."<br />";
echo "Password : ".$key;
}
}
코드 여기 부분만 보면 될 것 같다.(여기가 핵심이다.)
일단 id와 md5(pw)는 row에 담기는 것을 알 수 있다.
isset 함수가 php에서 쓰는 함수 인데 row['id']가 변수가 선언되어 있으면 if문으로 가고 아니면 else 문(wrong문구)으로 간다.
예를 들어 guest라는 id가 들어가면 db의 row에 id가 들어있으니 else 문으로 가지 않는 것이다.
그럼 여기서 문제는 guest라는 id가 들어가서 if 문을 실행 시켜서 좋은데 문제가 생긴다.
그 다음 id가 guest가 나올 시에는 your account is blocked 구문이 출력된다.
우리는 else로 넘어가야 플래그 값을 얻을 수 있는데...
그럼 이제 문제를 풀어보면, 코드에는 my_sql, php를 섞어 놓았는다는 것을 알 수 있었다.
mysql은 문자의 대소문자를 구분하지 않고,
php는 문자의 대소문자를 구분한다는 것이다.
이제 만약 id에 GUEST를 입력하게 된다면 row['id']를 먼저 보게 된다.
sql에서 대소문자를 구분 하지 않는 것 을봐서 row['id'] 값은 sql에서 가져올 것이다.
그럼 php의 isset 함수는 변수가 있는 것으로 판단해 else로 넘어가지 않고 다음 문장으로 갈 것이다.
GUEST가 if 문으로 잘 넘어왔으니 if 문을 보면 id가 guest가 되어야 한다.
하지만 id에 GUEST를 입력해서 else 문으로 넘어가서 플래그를 얻을 수 있다.
플래그 값 : 9c888c4ce90318ac2fc49fbf4c4bc841738a8f2b