sqlmap --os-shell原理
前言
當數據庫為MySQL,PostgreSQL或Microsoft SQL Server,并且當前用戶有權限使用特定的函數。
在mysql、PostgreSQL,sqlmap上傳一個二進制庫,包含用戶自定義的函數,sys_exec()和sys_eval()。那么他創建的這兩個函數可以執行系統命令。
在Microsoft SQL Server,sqlmap將會使用xp_cmdshell存儲過程,如果被禁(在Microsoft SQL Server 2005及以上版本默認禁制),sqlmap會重新啟用它,如果不存在,會自動創建
接下來我會通過注入、SQLSERVER數據庫、Mysql數據庫進行介紹os shell原理。
注入
必要條件:
- 擁有網站的寫入權限
- Secure_file_priv參數為空或者為指定路徑。
普通注入--os-shell主要是通過上傳一個sqlmap的馬,然后通過馬來進行命令執行。
測試環境:
操作系統:Microsoft Windows Server 2012 Standard
數據庫:Mysql 5.1.60
腳本語言:PHP 5.4.45
Web容器:Apache 2.4.39
利用sqlmap進行注入檢測

然后執行--os-shell

這個時候sqlmap主要做了三件事情:
1、進行目標的一個基礎信息的探測。
2、上傳shell到目標web網站上。
3、退出時刪除shell。
Database
數據庫支持外連,通過Sqlmap執行--os-shell獲取shell。
Sqlserver
必要條件:
- 數據庫支持外連
- 數據庫權限為SA權限
Sqlserver --os-shell主要是利用xp_cmdshell擴展進行命令執行。
測試環境:
操作系統:Microsoft Windows Server 2016 Datacenter
數據庫:Microsoft SQL Server 2008
利用Sqlmap進行數據庫連接。
sqlmap -d "mssql://uset:password@ip:port/dbname"

sqlmap默認不自帶pymssql,需要手動下載。
執行命令python -m pip install pymssql下載,然后連接成功。

執行--os-shell。但是這個地方Sqlmap未能成功開啟xp_cmdshell。

這個時候sqlmap主要做了三件事情:
1、識別當前數據庫類型,然后打印出來。
2、檢測是否為數據庫dba,也就是查看是否為sa權限。
3、檢測是否開啟了xp_cmdshell,如果沒有開啟sqlmap就會嘗試開啟。
繼續執行--sql-shell手動開啟。
手動開啟語句:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;

在執行RECONFIGURE;時sqlmap報語法錯誤。
寫一個python腳本調用下載的pymssql模塊進行排錯。
可以執行select @@version;命令

執行RECONFIGURE;命令的時候的報錯和sqlshell執行時的報錯一樣。

由于sqlmap調用的是pymssql模塊進行數據庫的鏈接,所以這個地方要開啟xp_cmshell,就必須利用其他工具進行開啟。利用navicat進行數據庫連接 然后執行命令開啟xp_cmdshell。,
開啟后,可以在navicat里面執行命令,或者sqlmap使用--os-shell進行命令執行。


若從一開始就使用navicat或其他工具進行數據庫鏈接的話,就需要手動查看是否為dba,是否開啟了xp_cmdshell擴展進程。
select IS_SRVROLEMEMBER('sysadmin')
查看是否為SA
select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell';
查看是否存在xp_cmdshell擴展進程,顯示1為存在。
查詢完畢后,和上面的操作依葫蘆畫瓢就行了。
Mysql
- 數據庫支持外連
- Secure_file_priv參數為空或者為指定路徑。
- 對mysql目錄存在寫入權限。
- 針對版本大于5.1,需要存在/lib/plugin目錄。
Mysql --os-shell主要利用的原理是通過udf執行命令,在Mysql Udf提權這一篇文章中我講得比較詳細了,可以去看看。
測試環境:
操作系統:Microsoft Windows Server 2012 Standard
數據庫:Mysql 5.1.60
執行sqlmap -d --os-shell。

這個時候sqlmap主要做了五件事情:
1、連接Mysql數據庫并且獲取數據庫版本。
2、檢測是否為數據庫dba。
3、檢測sys_exec和sys_eval2個函數是否已經被創建了。
4、上傳dll文件到對應目錄。
5、用戶退出時默認刪除創建的sys_exec和sys_eval2個函數。