문제분석 & 풀이
힌트를 요약해보면 로그인 필터링을 우회해서 계정을 로그인하라는 내용인 것 같다.
문제에 접속하니 간단한 로그인 창이 구현되어있고 소스가 주어져있다.
개발자도구를 이용해 소스를 확인해보니 주석으로 두 개의 계정이 주어져있으며 막힌 계정이라고 한다.
실제로 로그인을 해보니 막힌 계정이라고 뜨는 것을 확인할 수 있다.
이제 소스를 확인해보자.
소스를 요약하면 다음과 같다.
1. POST 데이터를 id 와 pw를 각각 id, ps 으로 값을 전송받는다.
2. $key 변수에 flag값을 저장한다. (23번줄)
3. 쿼리를 실행하고 실행결과 레코드가 존재하면서 id가 "guest" , "blueh4g"가 아니면 $key를 화면에 노출하고 클리어. (28~36번줄)
결론적으로 DB에 저장된 계정으로 로그인하면서 동시에 id가 "guest" , "blueh4g" 가 아니면 문제가 해결된다.
그러나 위에서 주어진 계정의 id가 "guest" , "blueh4g" 이였기 때문에 난감한 상황이 됐다.
로그인을 하기 위해서는 id가 "guest" 또는 "blueh4g" 인 계정을 사용해야 하지만 이것을 사용하면 막힌 계정이라는 코멘트가 나오고 문제는 해결되지 않는다.
그렇다면 어떻게 우회해야 문제를 막힌 계정을 뚫고 flag값을 얻을 수 있을까??
우회하기 위해 mysql에 대해 찾아보던중 한가지 사실을 알아냈다.
mysql은 기본적으로 대소문자를 구별하지 않는다는 점이다!
즉, 간단하게 설명하면 id 값으로 "GUEST"가 들어가도 sql 쿼리에서는 "guest" 랑 똑같은 취급이 된다는 의미이다.
소스에서 31번줄을 보면 php 코드로 if문에서 "guest" , "blueh4g" 인지 확인하고 필터링을 하고 있다.
결론적으로 id값으로 "GUEST"를 보내도 sql 쿼리에서는 "GUEST"=="guest" 로 취급해 우리가 원하는 "guest"의 계정으로 로그인이 된다.
이때, 우리가 보낸 id값
즉, $id값은 "GUEST"이기 때문에 php if문에서는 "GUEST"!="guest" 로 취급되어 필터링에 걸리지 않고 우회되서 flag값을 얻고 문제를 클리어 할 수 있다.
이제 우회 할 수 있는 방법을 알아냈으니 그대로 한번 로그인해보겠다.
flag값이 나왔다!
클리어!!
참고 : https://zetawiki.com/wiki/MySQL_%EB%8C%80%EC%86%8C%EB%AC%B8%EC%9E%90_%EA%B5%AC%EB%B3%84
MySQL 대소문자 구별 - 제타위키
zetawiki.com