1. 程式人生 > >Struts2 最新高危漏洞詳解

Struts2 最新高危漏洞詳解

由於計算機起源於美國,因此很多新興技術和框架也都出於美國的一些大公司。雖然國內的BAT也在開源技術上有一些貢獻,但目前來說還是比較缺少使用者來支援。這也就導致了國內大部分網際網路公司大量的依賴國外的技術。如果某些開源框架出了高危漏洞,就將影響一大批中國網際網路公司。

最近 Struts2 又爆出了一個高危漏洞,據說影響了大半個中國網際網路。涵蓋金融、教育、醫療、電商等各個行業。哪麼這個高危漏洞到底是怎樣形成的呢?本文將為你詳細講解!

Struts2 漏洞概要

2017年3月6日,Apache Struts2被曝存在遠端命令執行漏洞,漏洞編號:S2-045,CVE編號:CVE-2017-5638,官方評級為高危,該漏洞是由於在使用基於Jakarta外掛的檔案上傳功能條件下,惡意使用者可以通過修改HTTP請求頭中的Content-Type值來觸發該漏洞,進而執行任意系統命令,導致系統被黑客入侵。

漏洞解決方案

如果這個版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之間則存在漏洞,請升級到struts 2.3.32或2.5.10.1版本(嗶了狗了狗了,公司還在用struts2)。

由於目前使用版本是struts2-core-2.3.28,於是趕緊升了下級別,略過2.3 直接升級到2.5版本。

升級說明

找不到類

java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

查看了一下原始碼,2.5版本已變更了包路徑。

<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter>

配置好了居然找不到Action

什麼情況?是不是有點懷疑人生了,趕緊去http://struts.apache.org/ struts2的官網扒拉扒拉。

由於版本跨度大,2.5版本升級了很多特性,在Struts 2.5中,嚴格DMI被擴充套件,它被稱為嚴格方法呼叫 又名SMI。你可以想象DMI是一個“邊境警察”,SMI是一個“稅務警察”,並注意內部。使用此版本,SMI預設情況下啟用(strict-method-invocation屬性預設設定為 true在 struts-default包中),您可以選擇禁用它每個包 - 沒有全域性開關禁用整個應用程式的SMI。

SMI的工作原理如下:

<allowed-methods> / @AllowedMethods 被定義每個動作 - SMI工作,而不開啟它,但只是那些動作(加上<global-allowed-methods/>) SMI已啟用,但沒有<allowed-methods> / @AllowedMethods 被定義 - SMI工作,但只有<global-allowed-methods/> SMI已禁用 - 允許呼叫任何與預設RegEx匹配的操作方法 - ([A-Za-z0-9_$]*) 您可以使用常量重新定義預設RegEx,如下所示 <constant name="struts.strictMethodInvocation.methodRegex" value="([a-zA-Z]*)"/> 在操作定義中使用萬用字元對映時,SMI有兩種方式: SMI被禁用 - 任何萬用字元將被替換為預設的RegEx,即:<action name="Person*" method="perform*">將被翻譯成allowedMethod = "regex:perform([A-Za-z0-9_$]*)". 啟用SMI - 不會發生萬用字元替換,必須嚴格定義通過註釋或<allowed-method/>標記可以訪問哪些方法。

也就是說你必須加入這個配置才可以,最好全域性設定:

<global-allowed-methods>regex:.*</global-allowed-methods>

package中元素順序的問題

元素型別為 "package" 的內容必須匹配 "(result-types?,interceptors?,default-interceptor-ref?,default-action-ref?

出現此報錯,你就要注意了,一定要檢查package中 global-allowed-methods 的位置,然後按照報錯指定順序放置配置。

其他問題

如果你的專案中使用的是log4j而不是log4j2,那麼問題就來了,你還需要加入log4j-api-2.7.jar 和log4j-core-2.7.jar,並且配置 log4j2.xml(暫且是個空的)。

<?xml version="1.0" encoding="UTF-8"?>    <configuration status="error">    <appenders>    </appenders>    <loggers>    <root level="info">    </root>    </loggers>    </configuration>

否則會一直報以下錯誤,至於為什麼,還沒深入瞭解。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.