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.