ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • webhacking.kr 18번 문제 풀이
    업(業) 2021. 4. 12. 16:22

    0. 첫인사 && 전략 수립

     

     

     

    익숙하고 기본적인 sql injection 문제이다.

     

    source code를 보면 적당히 input을 필터링(phppreg_match() 함수를 이용하여)하고 있지만

     

    이를 우회하여,

     

     

     

    select id from chall18 where id='guest' and no=1 or id='admin' and no=2;

     

    이와 같은 쿼리를 실행하면 되겠다.

     

     

     

    우회하기 위해, 그동안 공부하기를 미뤄왔던 preg_match()preg_match() 함수에 대해 알아봐야겠다..

     

     

     

    1. preg_match() 함수 공부

     

    preg_match() 함수(이하 pm함수)는 정규표현식으로 문자열을 검색하여, 세 번째 인수에 패턴에 매치된 값을 배열로 저장한다. 그리고 매칭에 성공하면 1을 실패하면 0을 반환한다.

     

     

     

    pm이 정규표현식을 기반으로? 작동하기에 정규표현식에 대한 이해도 필요하겠다.

     

     

     

    2. 정규표현식

     

    1) removed

     

    2) 문자열의 시작 : ^, 문자열의 끝 : $

     

    3) 문자 정의 : X는 어떤 알파벳, 문자 정의 연산자(아래 소개되는)X의 뒤에서 X를 수식(설명)

     

    " . " : 줄바꿈 문자를 제외한 임의의 한 개의 문자

     

    " ? " : X0번 또는 1번 반복됨

     

    " * " : X0번 이상 반복됨

     

    " + ": X가 양수(positive --> +라고 생각하자)번 반복됨

     

    "{...}": 반복되는 횟수를 지정

    ex) /a{2,4}b/ ==> aab, aaab, aaaab

    ex) /a{2,}b/ ==> aab, aaab, ...

     

    " \ " : 이스케이프 문자

    “ | ” : OR

    ex) /abc|def|ghi/ : abc, def, ghi 중 하나의 문자열

     

    이 정도만 공부하고 source code를 해석하자

    preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])

    이 함수는 어떤 문자열? 패턴?을 찾고 있는가?

    정답!

    /|\(|\)|\|

     

    0x, from, select, &, (blank), |, (, ) 이다!

     

    4. 공부 끝 문제 해결

    그렇다면 이러한 문자열을 안 쓰고 위에서 삽입하고자 하는 쿼리를 각색해보자.

    select id from chall18 where id='guest' and no=1 or id='admin' and no=2;

    ==>

    select id from chall18 where id='guest' and no=0%09OR%09no=2;

     

    이런 식으로 쿼리가 동작해야 하므로

    0%09OR%09no=2 가 전달되야 한다.

    근데 이를 폼 안에 넣으면 url encoding이 된다.

     

    url encoding(==percent encoding)이란 url에 문자(비 예약된 문자 제외)를 포함하기 위한 방식이다.

    비예약된 문자는 알파벳과 숫자 그리고 -, _, . \, ~ 이다.

    따라서 그 외의 문자를 form에 입력하여 브라우저에서 get을 날리면 자동으로 ‘%(16진수)’ 형식으로 인코딩 된다..

     

    따라서 이를 막기 위해 form이 아닌 url에 직접 입력하여 url encoding을 피해야 한다..

     

    댓글

Designed by Tistory.