( 1 ) SQLMap Tamper 옵션
Tamper 옵션(--tamper)은 사용자와 백엔드 데이터베이스 관리 시스템 사이에 취약한 입력 검증 메커니즘이 있는 상황에서 매우 유용하고 강력할 수 있음.
이 메커니즘은 일반적으로 애플리케이션 소스 코드에서 호출하는 자체 개발한 입력 검증 루틴, IPS, 웹방화벽임.
다수 tamper 스크립트 목록을 사용할 경우 쉼표로 구분하여 사용하며 페이로드가 처리되어 변환된 형태로 반환됨.
( 2 ) SQLMap Tamper 스크립트 리스트
┌──(kali㉿kali)-[~]
└─$ sqlmap --list-tampers
___
__H__
___ ___[)]_____ ___ ___ {1.9.2#stable}
|_ -| . [)] | .'| . |
|___|_ [.]_|_|_|__,| _|
|_|V... |_| https://sqlmap.org
[!] 법적 고지: 사전 상호 동의 없이 sqlmap을 사용하여 공격 대상을 공격하는 것은 불법임.
최종 사용자는 모든 관련 지역, 주 및 연방 법률을 준수할 책임이 있음.
개발자는 이 프로그램의 오용 또는 손상에 대해 어떠한 책임도 지지 않으며, 어떠한 책임도 지지 않음.
[*] starting @ 21:09:11 /2025-09-16/
[21:09:11] [INFO] 사용 가능한 변조 스크립트 나열
* 0eunion.py - <int> UNION 인스턴스를 <int>e0UNION 으로 바꿈.
* apostrophemask.py - 아포스트로피 문자(')를 UTF-8 전체 너비 대응 문자(예: ' -> %EF%BC%87)로 바꿈.
* apostrophenullencode.py - 아포스트로피 문자(')를 불법적인 이중 유니코드 대응 문자(예: ' -> %00%27)로 바꿈.
* appendnullbyte.py - 페이로드 끝에 NULL 바이트 문자(%00)를 추가함.
* base64encode.py - 주어진 페이로드의 모든 문자를 Base64 로 인코딩함.
* between.py - 큼 연산자('>')를 'NOT BETWEEN 0 AND #' 으로 바꾸고 같음 연산자('=')를 'BETWEEN # AND #' 로 바꿈.
* binary.py - 가능한 경우 키워드 바이너리를 삽입함.
* bluecoat.py - SQL 문 뒤에 나오는 공백 문자를 유효한 임의의 공백 문자로 바꿈. 그 후 문자 '='를 LIKE 연산자로 바꿈.
* chardoubleencode.py - 주어진 페이로드의 모든 문자를 이중 URL 로 인코딩함. (이미 인코딩된 문자는 처리하지 않음, 예: SELECT -> %2553%2545%254C%2545%2543%2554)
* charencode.py - 주어진 페이로드의 모든 문자를 URL 로 인코딩함. (이미 인코딩된 문자는 처리하지 않음, 예: SELECT -> %53%45%4C%45%43%54)
* charunicodeencode.py - 주어진 페이로드의 모든 문자를 유니코드 URL 로 인코딩함. (이미 인코딩된 문자는 처리하지 않음, 예: SELECT -> %u0053%u0045%u004C%u0045%u0043%u0054)
* charunicodeescape.py - 주어진 페이로드에서 인코딩되지 않은 문자를 유니코드로 이스케이프함. (이미 인코딩된 문자는 처리하지 않음, 예: SELECT -> \u0053\u0045\u004C\u0045\u0043\u0054)
* commalesslimit.py - 'LIMIT M, N' 과 같은 (MySQL) 인스턴스를 'LIMIT AND OFFSET M' 대응 인스턴스로 바꿈.
* commalessmid.py - 'MID(A, B, C)' 와 같은 (MySQL) 인스턴스를 'MID(A FROM B FOR C)' 대응 인스턴스로 바꿈.
* commentbeforeparentheses.py - 괄호 앞에 (인라인) 주석을 추가함. (예: ( -> /**/()
* concat2concatws.py - 'CONCAT(A, B)' 와 같은 (MySQL) 인스턴스를 'CONCAT_WS(MID(CHAR(0), 0, 0), A, B)' 대응 인스턴스로 바꿈.
* decentities.py - HTML 은 모든 문자를 10진수(코드 포인트 사용)로 인코딩함. (예: ' -> ')
* dunion.py - <int> UNION 인스턴스를 <int>DUNION 으로 바꿈.
* equaltolike.py - 모든 연산자 등호('=')를 'LIKE' 대응 항목으로 바꿈.
* equaltorlike.py - 모든 연산자 등호('=')를 'RLIKE' 대응 항목으로 바꿈.
* escapequotes.py - 싱글 쿼터(')와 더블 쿼터 문자열(") 앞에 역슬래시 문자열(\)를 추가함. (예: ' -> \')
* greatest.py - 보다 큼 연산자('>')를 'GREATEST' 대응 연산자로 바꿈.
* halfversionedmorekeywords.py - 각 키워드 앞에 (MySQL) 버전이 지정된 주석을 추가함.
* hex2char.py - 각 (MySQL) 0x<hex> 인코딩된 문자열을 동등한 CONCAT(CHAR(),...) 대응 문자열로 바꿈.
* hexentities.py - HTML 은 모든 문자를 16진법(코드 포인트 사용)으로 인코딩함. (예: ' -> 1)
* htmlencode.py - HTML 은 영숫자가 아닌 모든 문자를 코드 포인트로 인코딩함. (예: ' -> ')
* if2case.py - 'IF(A, B, C)' 와 같은 인스턴스를 'CASE WHEN (A) THEN (B) ELSE (C) END' 대응 인스턴스로 바꿈.
* ifnull2casewhenisnull.py - 'IFNULL(A, B)' 와 같은 인스턴스를 'CASE WHEN ISNULL(A) THEN (B) ELSE (A) END' 대응 인스턴스로 바꿈.
* ifnull2ifisnull.py - 'IFNULL(A, B)'와 같은 인스턴스를 'IF(ISNULL(A), B, A)' 대응 인스턴스로 바꿈.
* informationschemacomment.py - (MySQL) "information_schema" 식별자의 모든 발생 끝에 인라인 주석(/**/)을 추가함.
* least.py - 보다 큼 연산자('>')를 '최소' 대응 연산자로 바꿈.
* lowercase.py - 각 키워드 문자를 소문자로 바꿈. (예: SELECT -> select)
* luanginx.py - LUA-Nginx WAF 우회 (예: Cloudflare)
* misunion.py - UNION 인스턴스를 -.1UNION으로 바꿈.
* modsecurityversioned.py - (MySQL) 버전별 주석을 포함한 전체 쿼리를 수용함.
* modsecurityzeroversioned.py - (MySQL) 버전이 없는 주석을 포함한 완전한 쿼리를 수용함.
* multiplespaces.py - SQL 키워드 주위에 여러 개의 공백(' ')을 추가함.
* ord2ascii.py - ORD() 발생을 동등한 ASCII() 호출로 바꿈.
* overlongutf8.py - 주어진 페이로드의 모든 문자(영숫자 제외)를 너무 긴 UTF8 로 변환함. (이미 인코딩된 문자는 처리하지 않음, 예: ' -> %C0%A7)
* overlongutf8more.py - 주어진 페이로드의 모든 문자를 너무 긴 UTF8 로 변환함. (이미 인코딩된 문자는 처리하지 않음, 예: SELECT -> %C1%93%C1%85%C1%8C%C1%85%C1%83%C1%94)
* percentage.py - 각 문자 앞에 백분율 기호('%')를 추가함. (예: SELECT -> %S%E%L%E%C%T)
* plus2concat.py - 플러스 연산자('+')를 (MsSQL) 함수 CONCAT() 대응 함수로 바꿈.
* plus2fnconcat.py - 플러스 연산자('+')를 (MsSQL) ODBC 함수 {fn CONCAT()} 대응 함수로 바꿈.
* randomcase.py - 각 키워드 문자를 임의의 대소문자 값으로 바꿈. (예: SELECT -> SEleCt)
* randomcomments.py - SQL 키워드 내에 임의의 인라인 주석을 추가함. (예: SELECT -> S/**/E/**/LECT)
* schemasplit.py - 공백이 포함된 스키마 식별자에서 분할함. (예: 'testdb 9.e.users' -> 'testdb.users')
* scientific.py - MySQL의 과학적 표기법을 남용함.
* sleep2getlock.py - 'SLEEP(5)' 와 같은 인스턴스를 예를 들어 "GET_LOCK('ETgP',5)" 로 바꿈.
* sp_password.py - DBMS 로그에서 자동으로 난독화하기 위해 페이로드의 끝에 (MsSQL) 함수 'sp_password' 를 추가함.
* space2comment.py - 공백 문자(' ')를 주석 '/**/'로 바꿈.
* space2dash.py - 공백 문자(' ')를 대시 주석('--')으로 바꾸고, 그 뒤에 임의의 문자열과 줄 바꿈('\n')을 추가함.
* space2hash.py - (MySQL) 공백 문자(' ')를 파운드 문자('#')로 바꾸고, 그 뒤에 임의의 문자열과 줄 바꿈 문자('\n')를 추가함.
* space2morecomment.py - (MySQL) 공백 문자(' ') 인스턴스를 주석 '/**_**/'로 바꿈.
* space2morehash.py - (MySQL) 공백 문자(' ')를 파운드 문자('#')로 바꾸고, 그 뒤에 임의의 문자열과 줄 바꿈 문자('\n')를 추가함.
* space2mssqlblank.py - (MsSQL) 공백 문자(' ') 인스턴스를 유효한 대체 문자 집합에서 임의의 공백 문자로 바꿈.
* space2mssqlhash.py - 공백 문자(' ')를 파운드 문자('#')로 바꾸고 그 뒤에 줄 바꿈 문자('\n')를 붙임.
* space2mysqlblank.py - (MySQL) 공백 문자(' ') 인스턴스를 유효한 대체 문자 집합에서 임의의 공백 문자로 바꿈.
* space2mysqldash.py - 공백 문자(' ')를 대시 주석('--')으로 바꾸고 그 뒤에 줄 바꿈('\n')을 붙임.
* space2plus.py - 공백 문자(' ')를 더하기 문자('+')로 바꿈.
* space2randomblank.py - 공백 문자(' ')를 유효한 대체 문자 집합에서 임의의 공백 문자로 바꿈.
* substring2leftright.py - PostgreSQL SUBSTRING을 LEFT 및 RIGHT로 바꿈.
* symboliclogical.py - AND 및 OR 논리 연산자를 해당 기호 대응 연산자(&& 및 ||)로 바꿈.
* unionalltounion.py - UNION ALL SELECT 인스턴스를 UNION SELECT 대응 인스턴스로 바꿈.
* unmagicquotes.py - 따옴표 문자(')를 다중 바이트 조합 %BF%27 로 바꾸고, 마지막에 일반 주석을 추가함. (작동하게 하기 위함)
* uppercase.py - 각 키워드 문자를 대문자 값으로 바꿈. (예: select -> SELECT)
* varnish.py - Varnish 방화벽을 우회하기 위해 HTTP 헤더 'X-originating-IP' 를 추가함.
* versionedkeywords.py - 각 비기능 키워드를 (MySQL) 버전별 주석으로 묶음.
* versionedmorekeywords.py - 각 키워드를 (MySQL) 버전별 주석으로 묶음.
* xforwardedfor.py - 가짜 HTTP 헤더 'X-Forwarded-For' (및 유사한 헤더)를 추가함.
[21:09:11] [WARNING] your sqlmap version is outdated
[*] ending @ 21:09:11 /2025-09-16/
( 3 ) 몇 가지 일반적인 스크립트 예제
space2comment.py
설명 : 공백을 주석(/**/)으로 변환함.
우회하고자 하는 보안장비 : FortiWAF, Barracuda
적용 전 : SELECT * FROM users WHERE username = 'admin'
적용 후 : SELECT/*comment*/FROM/*comment*/users/*comment*/WHERE/*comment*/username/*comment*/='admin'
randomcase.py
설명 : SQL 키워드의 대소문자를 무작위로 구분함.
우회하고자 하는 보안장비 : Akamai, Cloudflare
적용 전 : SELECT username, password FROM users
적용 후 : sEleCT username, pAssWord FrOm UsErS
between.py
설명 : 부울 연산자를 BETWEEN 으로 바꿈.
우회하고자 하는 보안장비 : Imperva, F5
적용 전 : SELECT * FROM users WHERE id=1 OR id=2
적용 후 : SELECT * FROM users WHERE id=1 BETWEEN 1 AND 2
charencode.py
설명 : URL 인코딩(%xx)을 사용하여 문자를 인코딩함.
우회하고자 하는 보안장비 : FortiWAF, Imperva
적용 전 : SELECT * FROM users WHERE id=1
적용 후 : SELECT%20*%20FROM%20users%20WHERE%20id%3D1
equaltolike.py
설명 : . = 를 LIKE 로 바꿈.
우회하고자 하는 보안장비 : Akamai, Cloudflare
적용 전 : SELECT * FROM users WHERE username = 'admin'
적용 후 : SELECT * FROM users WHERE username LIKE 'admin'
appendnullbyte.py
설명 : 페이로드 끝에 널 바이트(%00)를 추가함.
이는 널 바이트를 제대로 처리하지 못하는 특정 필터링 메커니즘을 우회하는 데 유용함.
우회하고자 하는 보안장비 : Barracuda, Cloudflare
SELECT * FROM users WHERE id=1
SELECT * FROM users WHERE id=1%00
base64encode.py
설명 : 전체 페이로드를 Base64 로 인코딩함.
일부 WAF 는 Base64 문자열을 디코딩하지 않아 페이로드가 통과할 수 있음.
우회하고자 하는 보안장비 : FortiWAF, Imperva
적용 전 : SELECT * FROM users
적용 후 : U0VMRUNUICogRlJPTSB1c2Vycw== (Base64로 인코딩된 페이로드)
chardoubleencode.py
설명 : 페이로드를 이중 URL로 인코딩함. (예: %25는 %를 의미)
이렇게 하면 한 번만 디코딩하는 WAF 를 속일 수 있음.
우회하고자 하는 보안장비 : Akamai, F5
적용 전 : SELECT * FROM users
적용 후 : %25%53%25%45%25%4C%25%45%25%43%25%54%20%25%2A%20%25%46%25%52%25%4F%25%4D%20%25%75%25%73%25%65%25%72%25%73
commalesslimit.py
설명 : LIMIT 절의 쉼표를 OFFSET 으로 바꿈.
일부 WAF 는 쉼표 기호를 특별히 필터링함.
우회하고자 하는 보안장비 : Imperva, Akamai
적용 전 : SELECT * FROM users LIMIT 1, 2
적용 후 : SELECT * FROM users LIMIT 1 OFFSET 2
halfversionedmorekeywords.py
설명 : 쿼리를 난독화하고 패턴 일치를 우회하기 위해 주석에 SQL 키워드를 추가함.
우회하고자 하는 보안장비 : F5, Cloudflare
적용 전 : SELECT * FROM users
적용 후 : SELECT /*!50000*/ * /*!50000FROM*/ users
modsecurityversioned.py
설명 : ModSecurity WAF를 우회하는 데 일반적으로 사용되는 /*!version*/ 주석을 추가하여 페이로드를 난독화함.
우회하고자 하는 보안장비 : Cloudflare, Barracuda
적용 전 : SELECT * FROM users
적용 후 : /*!50000SELECT*/ * /*!50000FROM*/ users
space2hash.py
설명 : 공백을 해시(#)로 바꾸는 이 기술은 # 문자를 올바르게 처리하지 못하는 특정 WAF에 대해 때때로 효과적인 기술임.
우회하고자 하는 보안장비 : Akamai, Barracuda
적용 전 : SELECT * FROM users WHERE username='admin'
적용 후 : SELECT#*#FROM#users#WHERE#username='admin'
overlongutf8.py
설명 : 문자를 너무 긴 UTF-8 인코딩으로 변환함.
일부 WAF는 너무 긴 UTF-8 시퀀스를 디코딩하지 못해 페이로드가 탐지되지 않고 통과할 수 있음.
우회하고자 하는 보안장비 : FortiWAF, Cloudflare
적용 전 : SELECT * FROM users
적용 후 : %C0%80%C0%81%C0%82%C0%83%C0%84%C0%85%C0%86%C0%87%C0%88%C0%89%C0%8A%C0%8B%C0%8C%C0%8D%C0%8E%C0%8F%C0%90%C0%91
randomcomments.py
설명 : WAF 필터링 메커니즘을 깨기 위해 SQL 키워드 내에 무작위 주석을 삽입함.
우회하고자 하는 보안장비 : Barracuda, Akamai
적용 전 : SELECT * FROM users
적용 후 : SE/*random*/LECT/*random*/ * /*random*/FROM /*random*/users
unionalltounion.py
설명 : UNION ALL SELECT를 UNION SELECT로 바꿔서 UNION 주입에 대한 기본 필터링 규칙을 우회함.
우회하고자 하는 보안장비 : F5, Imperva
적용 전 : UNION ALL SELECT username, password FROM users
적용 후 : UNION SELECT username, password FROM users
versionedkeywords.py
설명 : SQL 키워드에 버전이 지정된 주석을 추가하여 페이로드를 난독화함.
우회하고자 하는 보안장비 : Cloudflare, Imperva
적용 전 : SELECT * FROM users
적용 후 : SELECT /*!32302*/ * /*!32302FROM*/ users
space2dash.py
설명 : 공백( )을 대시(-)로 바꿈.
WAF가 공백 대신 대시 문자를 사용할 것으로 예상하지 않을 때 효과적임.
우회하고자 하는 보안장비 : FortiWAF, Cloudflare
적용 전 : SELECT * FROM users
적용 후 : SELECT-*--FROM-users
multiplespaces.py
설명 : 간단한 정규식 기반 WAF 필터링을 우회하기 위해 SQL 키워드 사이에 여러 개의 공백을 삽입함.
우회하고자 하는 보안장비 : F5, Barracuda
적용 전 : SELECT * FROM users
적용 후 : SELECT * FROM users
nonrecursivereplacement.py
설명 : UNION SELECT 를 UNION ALL SELECT 로 대체하여 UNION SELECT 는 차단하지만 UNION ALL SELECT 는 차단하지 않는 WAF 를 속임.
우회하고자 하는 보안장비 : Imperva, F5
적용 전 : UNION SELECT username, password FROM users
적용 후 : UNION ALL SELECT username, password FROM users
space2comment.py
설명 : 공백을 주석(/**/)으로 대체하여 인라인 주석을 올바르게 처리하지 못하는 WAF를 우회함.
우회하고자 하는 보안장비 : Cloudflare, Akamai
적용 전 : SELECT * FROM users WHERE id=1
적용 후 : SELECT/**//*/**/FROM/**/users/**/WHERE/**/id=1
equaltolike.py
설명 : SQL 쿼리에서 = 기호를 LIKE 기호로 바꿈.
WAF 가 등호를 특별히 필터링할 때 유용함.
우회하고자 하는 보안장비 : Akamai, FortiWAF
적용 전 : SELECT * FROM users WHERE id=1
적용 후 : SELECT * FROM users WHERE id LIKE 1
space2tab.py
설명 : 공백을 탭 문자(\t)로 바꿈.
이를 통해 공백 대신 탭 문자를 사용하지 않는 WAF 를 우회할 수 있음.
우회하고자 하는 보안장비 : Cloudflare, Imperva
적용 전 : SELECT * FROM users
적용 후 : SELECT\t*\tFROM\tusers
between.py
설명 : WAF가 의심스러운 것으로 감지하지 못할 수 있는 "="와 같은 SQL 조건을 "BETWEEN" 절로 바꿈.
우회하고자 하는 보안장비 : Barracuda, FortiWAF
적용 전 : SELECT * FROM users WHERE id=1
적용 후 : SELECT * FROM users WHERE id BETWEEN 0 AND 2
charencode.py
설명 : 페이로드의 문자를 URL로 인코딩된 문자로 바꿈.
WAF 는 URL 로 인코딩된 문자를 간과하는 경우가 많음.
우회하고자 하는 보안장비 : Akamai, Barracuda
적용 전 : SELECT * FROM users
적용 후 : %53%45%4C%45%43%54%20%2A%20%46%52%4F%4D%20%75%73%65%72%73
space2dash.py
설명 : 공백을 이중 대시(--)로 바꾸면 SQL 주석으로 작용하여 특정 WAF 규칙을 우회할 수 있음.
우회하고자 하는 보안장비 : Cloudflare, Barracuda
적용 전 : SELECT * FROM users
적용 후 : SELECT--*--FROM--users
lowercase.py
설명 : 대소문자 구분 필터에 의존하는 WA F를 속여 전체 페이로드를 소문자로 변환함.
우회하고자 하는 보안장비 : F5, Imperva
적용 전 : SELECT * FROM users
적용 후 : select * from users
참고 사이트 :
https://github.com/sqlmapproject/sqlmap/wiki/Usage
https://blog.redteamguides.com/p/awesome-sqlmap-tampers
댓글 없음:
댓글 쓰기