12月22號,綠盟科技博客發佈一篇文章,裏面有說起到weblogic因爲存在0day漏洞,致使被植入惡意軟件用來挖掘比特幣。後來通過確認,此次***者所用的漏洞CVE編號爲CVE-2017-10271,那麼這個漏洞到底是怎樣形成的?java
咱們先來看一下,網上公佈的poc進行利用後的weblogic返回的響應,公佈的利用poc以下:web
<?xml version="1.0"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java version="1.8.0_131" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>gedit</string> </void> </array> <void method="start" /> </void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body /> </soapenv:Envelope>
以下圖所示,能夠看到返回的是xml數據,並且能夠清晰的看到調用棧,調用棧在<ns2:frame />標籤中bash
仔細分析weblogic返回的響應,咱們能夠大概定位到問題點,咱們重點關注<ns2:frame />標籤中class以weblogic開頭的部分,這部分就是weblogic處理咱們請求的調用棧邏輯,weblogic處理完後就到了XMLDecoder
Step 1. 瞭解處理流程(爲了方便查看,調用棧順序爲從上倒下)ide
Step 2.下斷點調試
咱們將斷點設置在weblogic.wsee.jaxws.workcontext.WorkContextServerTube的proce***equest方法中readHeaderOld,以下圖所示函數
Step 3.調試運行,跟蹤工具
var3的值有是var2調用get方法後得來的,咱們查看一下WorkAreaConstants.WORK_AREA_HEADER的內容,以下圖所示ui
對比Poc內容與WorkAreaContants裏面的XML_TAG、WORK_AREA_HEADER,咱們不難聯想到var2.get方法是用來獲取work:WorkContext標籤之間的內容。編碼
2.readHeaderOld中,咱們直接設置斷點到weblogic調用棧最後一個函數WorkContextXmlInputAdapter,查看調用函數的參數值是什麼?
能夠看到,var4其實對應的是java標籤內的代碼.net
3.WorkContextXmlInputAdapter中,沒有任何過濾就直接調用XMLDecoder方法,而XMLDecoder自己是用於將XML文件反序列成java的對象,於是形成的漏洞的發生。3d
歸根結底,仍是weblogic犯了編碼上的錯誤,徹底信任用戶的輸入,而後調用XMLDecoder進行反序列,致使了這個漏洞的發生。