-
webhacking.kr 18번 문제 풀이업(業) 2021. 4. 12. 16:22
0. 첫인사 && 전략 수립
익숙하고 기본적인 sql injection 문제이다.
source code를 보면 적당히 input을 필터링(php의 preg_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를 수식(설명)
" . " : 줄바꿈 문자를 제외한 임의의 한 개의 문자
" ? " : X가 0번 또는 1번 반복됨
" * " : X가 0번 이상 반복됨
" + ": 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을 피해야 한다..
'업(業)' 카테고리의 다른 글
OCaml Tutorial 뿌셔버리기 (4) 2023.09.14 [영어강의] 관계대명사의 활용: 관계부사 When & Where (0) 2023.09.07 블로그지기의 직업 (0) 2023.09.07 kakao flutter sdk 주의사항 (0) 2023.08.19 문자표(character set), 인코딩(encoding) 총 정리 (0) 2021.04.12