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