본문 바로가기

WarGame/webhacking.kr

[webhacking.kr] Challenge 18 :: SQL Injection (limit)


▼ Challenge 18은 다음과 같습니다.




▼ index.phps로 들어가 봅시다.



친절하게도 내부 PHP 코드를 올려 놓았습니다.


        • ereg() : 해당 문자열 검색 (대,소문자 구별)

        • eregi() : 대,소문자 구별 없음


no라는 변수를 받아서 eregi()에 들어있는 문자와 일치하면 "no hack"이라는 문자를 띄운다고 합니다.


sql의 결과는 배열로 변환하여 $q 변수에 대입합니다.



필터링을 피해서 or과 limit를 이용하여 바로 문제를 풀어보도록 하겠습니다.


직접 DB를 만들어서 실습해 보았습니다. 방법은 2가지로 생각해 보았습니다.



sql에는 연산자 우선순위라는 것이 있는데 and가 or보다 우선순위가 높기 때문에

 and 부터 연산을 하게 됩니다. 


첫번째 sql문에서는 and 연산은 False가 되어 or 에 있는 no=2만 Ture가 되어 admin이 나오게 됩니다.


두번째 sql문에서는 limit을 제외하면 guest와 admin이 둘다 출력되지만 limit 1,1을 통해 2번째에 있는 admin만 출력되게 됩니다.


      • limit 2 : 출력문 중에 2개만 출력

      • limit 1, 4 : 출력문 중에 2번째부터 4개까지만 출력 (sql은 0이 처음)


sql에서의 실습을 끝내고 직접 password를 찾아보도록 하겠습니다.


eregi()에서 공백문자열을 검사하기 때문에 공백 대신 Tab이나 Line Feed(/n), Carriage Return(/r) 등을 사용해야 할 것 같습니다. (Mysql에서 엔터치고 명령어를 계속 입력해도 되는 것을 이용하는 것이죠.)


sql문을 입력문에 직접 입력하면 URL Decode과정에서 다른 문자로 변경이 되므로 

직접 URL에 입력해야 합니다.



방법1)  ?no=2%0dor%0dno=2


방법2)  ?no=1%0dor%0dno=2%0dlimit%0d1,1