金山網(wǎng)盾遠程代碼執(zhí)行漏洞及其它bug
由于金山網(wǎng)盾對惡意地址的處理不嚴(yán),攻擊者通過構(gòu)造一個普通的掛馬頁面和一個特殊的URL,可以使操作系統(tǒng)執(zhí)行任何命令。
受影響的系統(tǒng):
截至本文發(fā)布起的當(dāng)前最新版本及其之前版本。
細節(jié):
金山網(wǎng)盾的惡意提示部分UI是用網(wǎng)頁代碼編寫的,在kwstray.exe得到惡意網(wǎng)址的時候,由于其處理方式的錯誤導(dǎo)致了XSS漏洞,同時利用軟件中實現(xiàn)的某些功能,可以執(zhí)行任何系統(tǒng)命令。具體分析如下:
在接收到惡意網(wǎng)址后,kwstray.exe采用了如下流程對字符進行了過濾處理
惡意網(wǎng)址 ——> HtmlEncode ——> unescape ——> 顯示惡意信息
這個時候,假如攻擊者估計在網(wǎng)址中包含html標(biāo)簽,那么很可能會導(dǎo)致XSS攻擊。不過由于惡意網(wǎng)址首先進行了HtmlEncode處理,直接傳入<script>之類的html標(biāo)簽會被過濾成[script],這樣便使我們的攻擊失敗。繞過的方法為:首先將html標(biāo)簽進行escape,這樣在進行HtmlEncode的時候網(wǎng)址不會有任何的改變,再經(jīng)過unescape后html標(biāo)簽得到了還原,得以成功的插入js代碼。具體的利用如下:
首先構(gòu)造一個惡意的頁面,該頁面可以是一個普通的掛馬頁面,只要能被金山網(wǎng)盾識別為惡意就行。
然后構(gòu)造一個惡意的url,里面包含我們要插入的html代碼
http://localhost/index.php?html=<p style="background:url(javascript:parent.CallCFunc('exec','c:\\windows\\system32\\calc.exe' ))">test</p>
接著將url的html部分進行escape加密
http://localhost/index.php?html=%
讓瀏覽器去訪問該惡意地址,這個時候網(wǎng)盾檢測到網(wǎng)頁中包含有惡意代碼,于是將惡意地址報告給WebShield服務(wù),WebShield服務(wù)接受到信息后啟動一個kwstray.exe實例,并且將惡意地址附帶上;kwstray.exe將得到的地址進行HtmlEncode處理,然后再進行unescape,最后將內(nèi)容打印給用戶,這個時候html標(biāo)簽成功插入網(wǎng)頁中,并且開始執(zhí)行惡意代碼,彈出我們的計算器程序。
在惡意地址中有如下js代碼。
javascript:parent.CallCFunc('exec','c:\\windows\\system32\\calc.exe' )
CallCFunc是網(wǎng)盾自己實現(xiàn)的用于執(zhí)行程序的函數(shù),比如綠色氣泡彈出的時候,如果點擊確定,網(wǎng)頁中的js會調(diào)用CallCFunc函數(shù)執(zhí)行kwsmain.exe進程,用于啟動配置界面。所以我們可以直接利用此函數(shù)運行我們的程序和命令。
其它:
金山網(wǎng)盾在對惡意地址進行解碼的時候,處理不當(dāng),通過傳入特殊的url,可以使瀏覽器崩潰。最簡單的崩潰方式:
http://localhost/index.php?test=a%
當(dāng)網(wǎng)盾在url中發(fā)現(xiàn)%號的時候,它會嘗試著去進行解碼,在解碼過程中會導(dǎo)致崩潰。