문제에 접속하니 sql injection 문제라고 언급과 동시에 폼, 소스가 주어져있다.
1을 입력하니 "hi guest" 라는 문구가 뜬다. url 부분을 보니 no 파라미터를 이용해 값을 전달하고 있다.
다른 숫자들도 넣어보았지만 다른 숫자는 아무 결과도 뜨지 않는다.
이제 소스를 보고 분석해보자.
1. no 파라미터를 이용해 값을 받고있으며 공백, / , ( , ) , | , & , select , from , 0x 를 사용시 정규표현식에 의해 hack으로 간주한다. (4번 줄)
2. 4번줄에서 필터링을 통과하면 5번줄에 있는 sql 쿼리를 실행한다. (5번 줄)
3. 결과 값의 id가 "admin"이면 문제가 해결된다. (8~11번줄)
결론적으로 sql 쿼리를 실행하여 id가 "admin"인 값을 뽑아내면 되는데 5번 줄에 주석을 보면 admin의 no가 2번이라고 언급해서 힌트를 주고 있다.
근데 문제는 쿼리를 보면 id='guest' 가 껴버리면서 no=2를 입력해도 id가 admin인 레코드를 뽑아낼 수가 없다.
(id='guest' 이면서 no=2 인 레코드는 id가 'admin'인 레코드가 아니기 때문이다.)
따라서 우리가 강제로 조건을 충족시켜줘야한다.
id='guest'가 존재하는 이상 id='admin' 인 레코드를 추출하는 것은 불가능하기 때문에 이것을 무시할 쿼리를 짜봐야겠다.
위 쿼리가 의미하는 바는 id='guest' 이면서 no=0 인 레코드를 뽑거나 그냥 no=2인 레코드를 뽑아내라는 쿼리이다.
어짜피 id='guest' 이면서 no=0 인 레코드는 존재하지 않기 때문에 where 문에서 or 기준 앞부분의 쿼리 조건은 무시될 것이고 결국 no=2인 레코드만 결과로 나올 것이다.
그러나 여기서 문제는 처음에 정규표현식에서 공백이 필터링에 걸리는 것을 확인 할 수 있었다.
따라서 공백을 우회하기 위해 필자는 TAB(%09) 를 사용하였다.
이제 위 쿼리에서 노란색 부분을 no 파라미터를 이용하여 전송해보자.
클리어!