문제분석 & 풀이
이번 문제는 sql injection 문제인 것 같다.
소스를 보고 분석해보자.
1. lv 파라미터 값을 받고 정규표현식으로 검증하여 select , or , and , ( , ) , limit , 콤마 , order , cash , 공백 , 탭 , ' , " 이 들어갈 경우 프로그램을 강제종료한다. (2~4번줄)
2. 정규표현식 검증을 무사히 넘어간 경우 sql 쿼리를 실행하여 id 값을 받아온다. (5번줄)
3. id값이 "admin"이면 문제가 해결된다.
이번 문제는 이전에 풀었던 46번 문제와 유사한 문제인 것 같다.
1. lv=0 or id="admin"
1번 페이로드를 보내면 sql 쿼리의 where 문에서 lv=0이 무시되고 id가 "admin"인 레코드를 찾아서 "admin"을 결과로 가져와 우리가 원하는 대로 문제가 해결될 것이다. (DB에 저장되어 있지 않은 lv값이 0인 것을 확인했다.)
그러나 1번 페이로드는 필터리에 여러가지로 걸리기 때문에 같은 의미의 필터링이 걸리지 않는 페이로드로 바꿔봤다.
2. lv=0%0a||%0aid%0alike%0a0x61646D696E
2번 페이로드는 1번과 같은 의미이지만 정규표현식의 검증을 우회하기 위한 버전으로 개선한 페이로드이다.
우선 or 를 같은 의미인 || 로 대체하였으며 " 를 사용할 수 없기 때문에 like와 함께 16진수 버전의 "admin"을 이용했다.
그리고 마지막으로 공백과 탭(%09)를 사용할 수 없기 때문에 줄바꿈 문자(%0a)를 이용했다.
이제 2번 페이로드를 lv 파라미터를 이용해 전송해보자!
클리어!!