http://192.168.136.131/sqlmap/mysql/get_int.php?id=1
當給sqlmap這麼一個url的時候,它會:php
1、判斷可注入的參數2、判斷能夠用那種SQL注入技術來注入3、識別出哪一種數據庫4、根據用戶選擇,讀取哪些數據
sqlmap支持五種不一樣的注入模式:python
1、基於布爾的盲注,便可以根據返回頁面判斷條件真假的注入。2、基於時間的盲注,即不能根據頁面返回內容判斷任何信息,用條件語句查看時間延遲語句是否執行(即頁面返回時間是否增長)來判斷。3、基於報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回在頁面中。4、聯合查詢注入,可使用union的狀況下的注入。5、堆查詢注入,能夠同時執行多條語句的執行時的注入。
sqlmap支持的數據庫有:mysql
MySQL,Oracle,PostgreSQL,Microsoft SQL Server,MicrosoftAccess, IBM DB2,SQLite,Firebird,Sybase和SAP MaxDB
能夠提供一個簡單的URL,Burp或WebScarab請求日誌文件,文本文檔中的完整http請求或者Google的搜索,匹配出結果頁面,也能夠本身定義一個正則來判斷那個地址去測試。git
測試GET參數,POST參數,HTTP Cookie參數,HTTP User-Agent頭和HTTP Referer頭來確認是否有SQL注入,它也能夠指定用逗號分隔的列表的具體參數來測試。github
能夠設定HTTP(S)請求的併發數,來提升盲注時的效率。web
Youtube上有人作的使用sqlmap的視頻:sql
http://www.youtube.com/user/inquisb/videosshell
http://www.youtube.com/user/stamparm/videos數據庫
使用sqlmap的實例文章:windows
http://unconciousmind.blogspot.com/search/label/sqlmap
能夠點擊https://github.com/sqlmapproject/sqlmap/tarball/master下載最新版本sqlmap。
也可使用git來獲取sqlmap
git clone https://github.com/sqlmapproject/sqlmap.git sqlmap-dev
以後能夠直接使用命令來更新
python sqlmap.py --update
或者
git pull
更新sqlmap
若是你想觀察sqlmap對一個點是進行了怎樣的嘗試判斷以及讀取數據的,可使用-v參數。
共有七個等級,默認爲1:
0、只顯示python錯誤以及嚴重的信息。1、同時顯示基本信息和警告信息。(默認)2、同時顯示debug信息。3、同時顯示注入的payload。4、同時顯示HTTP請求。5、同時顯示HTTP響應頭。6、同時顯示HTTP響應頁面。
若是你想看到sqlmap發送的測試payload最好的等級就是3。
獲取目標方式
目標URL
參數:-u或者--url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
從Burp或者WebScarab代理中獲取日誌
參數:-l
能夠直接吧Burp proxy或者WebScarab proxy中的日誌直接倒出來交給sqlmap來一個一個檢測是否有注入。
從文本中獲取多個目標掃描
參數:-m
文件中保存url格式以下,sqlmap會一個一個檢測
www.target1.com/vuln1.php?q=foobar www.target2.com/vuln2.asp?id=1 www.target3.com/vuln3/id/1*
從文件中加載HTTP請求
參數:-r
sqlmap能夠從一個文本文件中獲取HTTP請求,這樣就能夠跳過設置一些其餘參數(好比cookie,POST數據,等等)。
好比文本文件內以下:
POST /vuln.php HTTP/1.1Host: www.target.com User-Agent:Mozilla/4.0 id=1
當請求是HTTPS的時候你須要配合這個--force-ssl參數來使用,或者你能夠在Host頭後門加上:443
處理Google的搜索結果
參數:-g
sqlmap能夠測試注入Google的搜索結果中的GET參數(只獲取前100個結果)。
例子:
python sqlmap.py -g "inurl:\".php?id=1\""
(很牛B的功能,測試了一下,第十幾個就找到新浪的一個注入點)
此外可使用-c參數加載sqlmap.conf文件裏面的相關配置。
請求
http數據
參數:--data
此參數是把數據以POST方式提交,sqlmap會像檢測GET參數同樣檢測POST的參數。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php"--data="id=1"-f --banner --dbs --users
參數拆分字符
參數:--param-del
當GET或POST的數據須要用其餘字符分割測試參數的時候須要用到此參數。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php"--data="query=foobar;id=1"--param-del=";"-f --banner --dbs --users
HTTP cookie頭
參數:--cookie,--load-cookies,--drop-set-cookie
這個參數在如下兩個方面頗有用:
一、web應用須要登錄的時候。
二、你想要在這些頭參數中測試SQL注入時。
能夠經過抓包把cookie獲取到,複製出來,而後加到--cookie參數裏。
在HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取而且在之後的請求中加入,而且會嘗試SQL注入。
若是你不想接受Set-Cookie可使用--drop-set-cookie參數來拒接。
當你使用--cookie參數時,當返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪一個cookie來繼續接下來的請求。當--level的參數設定爲2或者2以上的時候,sqlmap會嘗試注入Cookie參數。
HTTP User-Agent頭
參數:--user-agent,--random-agent
默認狀況下sqlmap的HTTP請求頭中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可使用--user-anget參數來修改,同時也可使用--random-agnet參數來隨機的從./txt/user-agents.txt中獲取。
當--level參數設定爲3或者3以上的時候,會嘗試對User-Angent進行注入。
HTTP Referer頭
參數:--referer
sqlmap能夠在請求中僞造HTTP中的referer,當--level參數設定爲3或者3以上的時候會嘗試對referer注入。
額外的HTTP頭
參數:--headers
能夠經過--headers參數來增長額外的http頭
HTTP認證保護
參數:--auth-type,--auth-cred
這些參數能夠用來登錄HTTP的認證保護支持三種方式:
一、Basic
二、Digest
三、NTLM
例子:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1"--auth-type Basic--auth-cred "testuser:testpass"
HTTP協議的證書認證
參數:--auth-cert
當Web服務器須要客戶端證書進行身份驗證時,須要提供兩個文件:key_file,cert_file。
key_file是格式爲PEM文件,包含着你的私鑰,cert_file是格式爲PEM的鏈接文件。
HTTP(S)代理
參數:--proxy,--proxy-cred和--ignore-proxy
使用--proxy代理是格式爲:http://url:port。
當HTTP(S)代理須要認證是可使用--proxy-cred參數:username:password。
--ignore-proxy拒絕使用本地局域網的HTTP(S)代理。
HTTP請求延遲
參數:--delay
能夠設定兩個HTTP(S)請求間的延遲,設定爲0.5的時候是半秒,默認是沒有延遲的。
設定超時時間
參數:--timeout
能夠設定一個HTTP(S)請求超過多久斷定爲超時,10.5表示10.5秒,默認是30秒。
設定重試超時
參數:--retries
當HTTP(S)超時時,能夠設定從新嘗試鏈接次數,默認是3次。
設定隨機改變的參數值
參數:--randomize
能夠設定某一個參數值在每一次請求中隨機的變化,長度和類型會與提供的初始值同樣。
利用正則過濾目標網址
參數:--scope
例如:
python sqlmap.py -l burp.log --scope="(www)?\.target\.(com|net|org)"
避免過多的錯誤請求被屏蔽
參數:--safe-url,--safe-freq
有的web應用程序會在你屢次訪問錯誤的請求時屏蔽掉你之後的全部請求,這樣在sqlmap進行探測或者注入的時候可能形成錯誤請求而觸發這個策略,致使之後沒法進行。
繞過這個策略有兩種方式:
1、--safe-url:提供一個安全不錯誤的鏈接,每隔一段時間都會去訪問一下。2、--safe-freq:提供一個安全不錯誤的鏈接,每次測試請求以後都會再訪問一邊安全鏈接。
關掉URL參數值編碼
參數:--skip-urlencode
根據參數位置,他的值默認將會被URL編碼,可是有些時候後端的web服務器不遵照RFC標準,只接受不通過URL編碼的值,這時候就須要用--skip-urlencode參數。
每次請求時候執行自定義的python代碼
參數:--eval
在有些時候,須要根據某個參數的變化,而修改另個一參數,才能造成正常的請求,這時能夠用--eval參數在每次請求時根據所寫python代碼作完修改後請求。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b"--eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
上面的請求就是每次請求時根據id參數值,作一次md5後做爲hash參數的值。
注入
測試參數
參數:-p,--skip
sqlmap默認測試全部的GET和POST參數,當--level的值大於等於2的時候也會測試HTTP Cookie頭的值,當大於等於3的時候也會測試User-Agent和HTTP Referer頭的值。可是你能夠手動用-p參數設置想要測試的參數。例如: -p "id,user-anget"
當你使用--level的值很大可是有個別參數不想測試的時候可使用--skip參數。
例如:--skip="user-angent.referer"
在有些時候web服務器使用了URL重寫,致使沒法直接使用sqlmap測試參數,能夠在想測試的參數後面加*
例如:
python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap將會測試value1的位置是否可注入。
指定數據庫
參數:--dbms
默認狀況系sqlmap會自動的探測web應用後端的數據庫是什麼,sqlmap支持的數據庫有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、MicrosoftAccess、SQLite、Firebird、Sybase、SAP MaxDB、DB2
指定數據庫服務器系統
參數:--os
默認狀況下sqlmap會自動的探測數據庫服務器系統,支持的系統有:Linux、Windows。
指定無效的大數字
參數:--invalid-bignum
當你想指定一個報錯的數值時,可使用這個參數,例如默認狀況系id=13,sqlmap會變成id=-13來報錯,你能夠指定好比id=9999999來報錯。
只定無效的邏輯
參數:--invalid-logical
緣由同上,能夠指定id=13把原來的id=-13的報錯改爲id=13 AND 18=19。
注入payload
參數:--prefix,--suffix
在有些環境中,須要在注入的payload的前面或者後面加一些字符,來保證payload的正常執行。
例如,代碼中是這樣調用數據庫的:
$query ="SELECT * FROM users WHERE id=(’". $_GET[’id’]."’) LIMIT 0, 1";
這時你就須要--prefix和--suffix參數了:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1"-p id --prefix "’)"--suffix "AND (’abc’=’abc"
這樣執行的SQL語句變成:
$query ="SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
修改注入的數據
參數:--tamper
sqlmap除了使用CHAR()函數來防止出現單引號以外沒有對注入的數據修改,你可使用--tamper參數對數據作修改來繞過WAF等設備。
下面是一個tamper腳本的格式:
# Needed importsfrom lib.core.enums import PRIORITY # Define which is the order of application of tamper scripts against# the payload __priority__ = PRIORITY.NORMAL def tamper(payload):''' Description of your tamper script ''' retVal = payload # your code to tamper the original payload# return the tampered payloadreturn retVal
能夠查看 tamper/ 目錄下的有哪些可用的腳本
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1"--tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3[hh:mm:03][DEBUG] cleaning up configuration parameters [hh:mm:03][INFO] loading tamper script 'between'[hh:mm:03][INFO] loading tamper script 'randomcase'[hh:mm:03][INFO] loading tamper script 'space2comment'[...][hh:mm:04][INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'[hh:mm:04][PAYLOAD]1)/**/And/**/1369=7706/**/And/**/(4092=4092[hh:mm:04][PAYLOAD]1)/**/AND/**/9267=9267/**/AND/**/(4057=4057[hh:mm:04][PAYLOAD]1/**/AnD/**/950=7041[...][hh:mm:04][INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'[hh:mm:04][PAYLOAD]1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))