[Webhacking.kr] old-18 (SQL injection & 정규표현식 활용문제)

728x90
반응형

1. 서론

본 포스팅 시리즈는 webhacking.kr의 문제 풀이를 하면서 정리한 자료이다.
필자가 풀이한 방법들이기 때문에 완벽하지 않을 수도 있다는 점을 참고 바란다. (지적과 조언은 언제나 환영이다)

이번 문제는 old-18, SQL injecion과 정규표현식 활용이 필요한 문제이다.

2. 본론

이번 문제에 처음 접속을 하면 처음부터 SQL injection을 시도하라고 친절하게 입력폼까지 제공해준다.
이번 문제의 해결조건을 파악하기 위해 소스코드를 확인해보겠다.

이게 이번 문제의 소스코드인데, 눈의 띄는 부분이 두 군데가 있다. 첫째론 정규식필터를 이용해 특정 문자열을 필터링하고 있는 것이고, 둘째론 쿼리를 요청하는 부분인데 거기에 주석으로 "admin의 no는 2"라고 써져있는 점이다.

이번 문제의 해결 조건은 select문으로 가져온 id의 값이 "admin"이 되어야 한다는 점이다. 그럼 GET 파라미터 "no"의 값에 쿼리를 삽입하여 값이 "admin"이 되도록 하면 된다는 얘기인데, 우리는 결정적인 조건들로 "필터링 문자열", "admin의 no 값"을 알고있다. 그러므로 필터값만 잘 피해서 쿼리를 작성하면 쉽게 해결이 가능하다는 뜻이다.

우선, 필터링된 문자열은 다음과 같다

" "(스페이스, 공백), /, |, (, ), &, select, from, 0x

필터링된 문자열들을 보니 공백과 괄호를 사용하지 않고 쿼리문을 작성해야할 듯하다.
공백과 괄호가 없어도 탭문자나, 캐리턴문자, 라인피드문자, 주석등을 사용하여 구분할 수도 있다.
하지만 주석의 경우 "/"가 필터링 되기 때문에 사용할 수는 없을 듯하다. 필자같은 경우엔 탭문자를 이용하여 쿼리문을 작성해보겠다.

https://webhacking.kr/challenge/web-32/index.php?no=2%09or%09id='admin'

URL을 통해서 쿼리문을 삽입하기 때문에 탭문자같은 특수문자는 URL encoding을 하여 코드값으로 넣어야한다.
위 쿼리문을 GET 파라미터 "no"에 넣고 요청을 하면 문제가 해결된다.

728x90
반응형