前言:
今天來總結一下sqlmap注入神器的詳細使用方法。
一、SQLMap介紹
1、Sqlmap簡介:
Sqlmap是一個開源的滲透測試工具,可以用來自動化的檢測,利用SQL注入漏洞,獲取數據庫服務器的權限。它具有功能強大的檢測引擎,針對各種不同類型數據庫的滲透測試的功能選項,包括獲取數據庫中存儲的數據,訪問操作系統文件甚至可以通過外帶數據連接的方式執行操作系統命令。
目前支持的數據庫有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多數據庫。
2、Sqlmap支持的注入方式:
Sqlmap全面支持六種SQL注入技術:
-
基於布爾類型的盲注:即可以根據返回頁面判斷條件真假的注入。
-
基於時間的盲注:即不能根據頁面返回的內容判斷任何信息,要用條件語句查看時間延遲語句是否已執行(即頁面返回時間是否增加)來判斷。
-
基於報錯注入:即頁面會返回錯誤信息,或者把注入的語句的結果直接返回到頁面中。
-
聯合查詢注入:在可以使用Union的情況下的注入。
-
堆查詢注入:可以同時執行多條語句時的注入。
-
帶外注入:構造SQL語句,這些語句在呈現給數據庫時會觸發數據庫系統創建與攻擊者控制的外部服務器的連接。以這種方式,攻擊者可以收集數據或可能控制數據庫的行為。
3、Sqlmap輸出級別:
使用 Sqlmap 對一個注入點進行測試時,可以使用 -v x
參數指定回顯信息的復雜度,x范圍為[0~6],共有 7 個等級,默認為 1。
- 0:只顯示python錯誤以及嚴重的信息。
- 1:同時顯示基本信息和警告信息。(默認)
- 2:同時顯示debug信息。
- 3:同時顯示注入的payload。
- 4:同時顯示HTTP請求。
- 5:同時顯示HTTP響應頭。
- 6:同時顯示HTTP響應頁面。
如果想看到 Sqlmap 發送的測試 payload 最好的等級就是3,例:
sqlmap.py -v 3 -u "http://www.xxx.com/a.php?id=x"
二、SQLMap安裝
Sqlmap官網:http://sqlmap.org/,Sqlmap的安裝需要Python環境,最新版可以運行在 Python 2.6, 2.7 和 3.x 版本的任何平台上。
下載完成后可以添加進環境變量,方便使用(不添加也可以用)
當出現這個畫面時工具即可正常運行了。
三、SQLMap使用:
1、判斷是否存在注入:
假設目標注入點是 http://127.0.0.1/sqli-labs/Less-1/?id=1
,判斷其是否存在注入的命令如下:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1
結果顯示存在注入:
當注入點后面的參數大於等於兩個時,需要加雙引號,如下所示。
sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"
運行完判斷是否存在注入的語句后,爆出一大段代碼,這里有三處需要選擇的地方:第一處的意思為檢測到數據庫可能是MySQL,是否需要跳過檢測其他數據庫;第二處的意思是在“level1、risk1”的情況下,是否使用MySQL對應的所有Payload進行檢測;第三處的意思是參數id
存在漏洞,是否要繼續檢測其他參數,一般默認按回車鍵即可。
可以在語句后面加參數:--beach
會選定默認的選項執行(如上)。
2、判斷文本中的請求是否存在注入:
從txt文件中加載HTTP請求,Sqlmap可以從一個文本文件中獲取HTTP請求,這樣就可以不設置其他參數(如cookie、POST數據等),txt文件中的內容為Web數據包,如下:
判斷是否存在注入的命令如下,運行后的結果如圖所示,
-r
一般在存在cookie注入時使用。
sqlmap.py -r 1.txt
3、查詢當前用戶下的所有數據庫:
該命令是確定網站存在注入后,用於查詢當前用戶下的所有數據庫,如下所示。如果當前用戶有權限讀取包含所有數據庫列表信息的表,使用該命令就可以列出所有數據庫,如圖所示:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --dbs
從圖中可以看到,查詢出了10個數據庫及所有數據庫的庫名。當繼續注入時,--dbs
縮寫成-D xxx
,其意思是在xxx數據庫中繼續查詢其他數據。
4、獲取數據庫中的表名:
該命令的作用是查詢完數據庫后,查詢指定數據庫中所有的表名,如下所示。如果在該命令中不加入 -D
參數來指定某一個具體的數據庫,那么Sqlmap會列出數據庫中所有庫的表。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security --tables
從圖中可以看到 security 數據庫中擁有的4個數據表。當繼續注入時,--tables
縮寫成-T
,意思是在某表中繼續查詢。
5、獲取表中的字段名:
該命令的作用是查詢完表名后,查詢該表中所有的字段名,如下所示。運行該命令的結果如圖所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security -T users --columns
從圖中可以看到在 security 數據庫中的users表中一共有3個字段。在后續的注入中,--columns
縮寫成-C
。
6、獲取字段內容:
該命令是查詢完字段名之后,獲取該字段中具體的數據信息,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 -D security -T users -C username,password --dump
這里需要下載的數據是 security 數據庫里 users 表中 username和password 的值,如圖所示:
7、獲取數據庫的所有用戶:
該命令的作用是列出數據庫的所有用戶,如下所示。在當前用戶有權限讀取包含所有用戶的表的權限時,使用該命令就可以列出所有管理用戶。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --users
可以看到,當前用戶的賬號是root,如圖所示:
8、獲取數據庫用戶的密碼:
該命令的作用是列出數據庫用戶的密碼,如下所示。如果當前用戶有讀取包含用戶密碼的權限,sqlmap會先列舉出用戶,然后列出Hash,並嘗試破解。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --passwords
從圖中可以看到,密碼使用MySQL5加密,可在網站中自行解密(自帶的解密很慢)。
9、獲取當前網站數據庫的名稱:
使用該命令可以列出當前網站使用的數據庫,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-db
從圖中可以看到數據庫是security。
10、獲取當前網站數據庫的用戶名稱:
使用該命令可以列出當前網站使用的數據庫用戶,如下所示。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --current-user
從圖中可以看到,用戶是root。
四、SQLMap進階:參數講解
1、--level 5
:探測等級
參數--level 5
指需要執行的測試等級,一共有5個等級(1~5),不加 level 默認是1。5級包含的 Payload 最多,會自動破解出 cookie、XFF等頭部注入。當然,level 5的運行速度也比較慢。
這個參數會影響測試的注入點,GET和POST的數據都會進行測試,HTTP cookie 在 level 為2時就會測試,HTTP User-Agent/Referer 頭在 level 為3時就會測試。總之,在不確定哪個 payload 或參數為注入點時,為了保證全面性,建議使用高的 level 值。
2、--is-dba
:當前用戶是否為管理權限
該命令用於查看當前賬戶是否為數據庫管理員賬戶,如下所示:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --is-dba
3、--roles
:列出數據庫管理員角色
該命令用於查看數據庫用戶的角色。如果當前用戶有權限讀取包含所有用戶的表,輸入該命令會列舉出每個用戶的角色,也可以用-U
參數指定想看哪個用戶的角色,如圖所示:
4、--referer
:HTTP referer頭
Sqlmap 可以在請求中偽造 HTTP 中的 referer,當--level
參數設定為3或3以上時,會嘗試對referer注入。可以使用referer命令來欺騙,例:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --referer http://www.baidu.com
5、--sql-shell
:運行自定義SQL語句
該命令用於執行指定的SQL語句,如下所示,假設執行select * from users limit 0,1
語句,如下所示:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --sql-shell
6、--os-cmd
,--os-shell
:運行任意操作系統命令
在當前用戶有權限使用特定的函數的前提下,如果數據庫為MySQL、PostgreSQL,Sqlmap會上傳一個二進制庫,包含用戶自定義的函數sys_exec ()
和sys_eval ()
,那么創建的這兩個函數就可以執行系統命令。
如果數據庫是微軟 SQL Server時,Sqlmap通過存儲過程 xp_cmdshell 來執行任意命令,如果 xp_cmdshell 被禁用(SQL Server 2005及以上版本默認被禁用),則Sqlmap會重新啟用它;如果不存在,會自動創建。
用--os-shell
參數可以模擬一個真實的Shell,輸入想執行的命令。當不能執行多語句時(如PHP或ASP+Mysql),仍然可以使用 INTO OUTFILE寫進可寫目錄,創建一個Web后門。
Sqlmap支持ASP、ASP.NET、JSP和PHP四種語言(要想執行該參數,需要有數據庫管理員權限,也就是--is-dba
的值要為True)。
1.執行系統命令:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-cmd=ipconfig
執行后根據提示選擇網站語言,然后回車,指定目標站點根目錄,然后繼續回車即可完整執行命令。
2.執行shell:
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --os-shell
執行后根據提示選擇網站語言,然后回車,指定目標站點根目錄后回車,輸入命令即可執行。
執行命令后會在網站根目錄上傳兩個文件:tmpbxbxz.php、tmpuoiuz.php(此文件為上傳頁面)
7、--file-read
:從數據庫服務器中讀取文件
該命令用於讀取執行文件,當數據庫為MySQL、PostgreSQL或MicrosoftSQL Server,並且當前用戶有權限使用特定的函數時,讀取的文件可以是文本,也可以是二進制文件。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-read "C:/11.txt"
執行完會把文件保存到本地目錄下
8、--file-write --file-dest
:上傳文件到數據庫服務器中
該命令用於寫入本地文件到服務器中,當數據庫為MySQL、PostgreSQL或Microsoft SQL Server,並且當前用戶有權限使用特定的函數時,上傳的文件可以是文本,也可以是二進制文件。
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1 --file-write "C:/1.txt" --file-dest "C:/windows/Temp/1.php"
執行結束即可把本地的1.txt 文件上傳到目標服務器下