ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Webhacking.kr] 27번 풀이
    Wargame/webhacking.kr (old) 2019. 5. 7. 01:39


    SQL Injection 문제이다.

    소스를 보자.



    주석처리되어 있는 index.phps로 접근하였다.



    소스를 보니 eregi 함수로 #, union, from, challenge, select, (, tab, /, limit, =, 0x가 필터링되어 있으며,

    18번 문제와 마찬가지로 no에 입력값이 바로 삽입되어 취약점이 발생한다.

    쿼리문의 결과로 나온 id 값이 admin이면 문제가 풀린다.


    우선, guest의 no를 찾아보았다.



    guest의 no의 값은 1이다.


    쿼리문을 참으로 만들어 admin으로 만들 수 있는 경우는 18번과 마찬가지로 2가지로 생각해보았다.


    1. ?no=0 or id='admin'

    2. ?no=0 or no='admin의 no 값'


    ?no=0 or id like 'admin'을 입력해보았다.

    (=이 필터링 되어 있기 때문에 like를 사용하였다.)



    query error가 출력된다.

    왜 그런지 소스를 확인해보니 입력 값이 들어가는 no 자리에 괄호로 싸여있다.

    임의로 괄호를 닫아주고 값을 전송해보았다. (닫는 괄호는 필터링되어 있지 않다.)


    select id from challenge27_table where id='guest' and no=(0) or id like 'admin')


    완성된 쿼리문을 보면 닫는 괄호가 하나 남아서 뒤에는 주석처리 해야한다.

    #은 필터링되어 있어 --를 사용하였다.


    ?no=(0) or id like 'admin'--%20) //주석 뒤에는 공백 문자를 꼭 넣어주어야 한다.



    query error 가 발생했다...

    왜 그런지 몰라 직접 테이블을 만들어 테스트해보았다.


    mysql에 num_27이라는 테이블을 만들고, guest와 admin 값을 넣었다.

    (admin의 no는 임의로 2로 지정하였다.)



    위에서 에러난 쿼리 구문을 입력해보았다.



    읭..?!

    mysql 상에서는 값이 잘 나온다. 쿼리 구문이 틀린것은 아니다.

    아마 18번 처럼 '가 magic_quotes_gpc에 의해 문자열로 취급되면서 쿼리 에러가 나는것 같다.

    따라서, '를 사용하지 않고 admin을 넣을 수 있는 방법인 이진법을 사용하였다.


    ?no=0) or id like 0b0110000101100100011011010110100101101110--%20



    추측이 맞는 것 같다.


    두 번째 방법도 맞는지 확인하기 위해 admin의 no 값을 찾아보았다.


    ?no=0) or no like 숫자--%20



    admin의 no는 2이다.


    'Wargame > webhacking.kr (old)' 카테고리의 다른 글

    [Webhacking.kr] 31번 풀이  (0) 2019.05.07
    [Webhacking.kr] 29번 풀이  (0) 2019.05.07
    [Webhacking.kr] 26번 풀이  (0) 2019.05.07
    [Webhacking.kr] 25번 풀이  (0) 2019.05.07
    [Webhacking.kr] 24번 풀이  (0) 2019.05.06

    댓글

@Jo Grini's Blog