Struts2 S2-048远程代码执行漏洞分析报告
一、漏洞介绍
1.1 漏洞背景
2017年7月7日,ApacheStruts 发布最新的安全公告,Apache Struts2的strus1插件存在远程代码执行的高危漏洞,漏洞编号为 CVE-2017-9791(S2-048)。攻击者可以构造恶意的字段值通过Struts2的struts2-struts1-plugin插件,远程执行代码。
1.2 漏洞影响
Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本。
二、漏洞复现
本文使用Apache Struts22.3.24 版本作为复现演示实例。
首先下载struts-2.3.24-apps.zip,下载地址为http://archive.apache.org/dist/struts/2.3.24/。解压其中的 strucs2-showcase.war至 tomcat 的工作目录 webapps 下。
根据官网说明,可知漏洞产生的原因是将用户可控的值添加到 ActionMessage 并在客户前端展示,导致其进入 getText 函数,最后 message 被当作 ognl 表达式执行,搜索发现 org.apache.struts2.showcase.integration.SaveGangsterAction 存在漏洞。
查看 struts-integration.xml 配置文件可知对应 action 为 saveGangster,类为 org.apache.struts2.s1.Struts1Action。
所以访问 /integration/saveGangster.action
抓包修改参数值,发现成功执行了 OGNL 表达式。
三、漏洞原理分析
3.1 漏洞产生条件
Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录。
3.2 漏洞动态分析
漏洞的本质原因是在struts2-struts1-plugin包中的Struts1Action.java中的execute函数调用了getText函数,这个函数会执行ognl表达式,且是getText的输入内容是攻击者可控的。
首先执行的 truts1Action 的 execute 方法,该方法首先获取 Action
然后调用 saveGangsterAction 的 execute 方法,将表单请求封装到了 actionForm 中,
并设置一个标识,用于获取 ActionMessage
接着获取 request 中的 ActionMessage,检查 ActionMessage 是否为 null,不为 null 则处理 ActionMessage 并显示在客户端,此处调用了会执行 OGNL 表达式的 getText() 方法,将拼接后的参数传入其中, getText 方法会根据不同的Locale 去对应的资源文件里面获取相关文字信息并展现。
getText(StringaTextName) 方法位于 com.opensymphony.xwork2.ActionSupport 中,代码如下
然后进入 TextProviderSupport.getText(String key, String defaultValue, List args) 方法,代码如下
args) 方法的代码” src=”/Article/UploadPic/2017-7/2017718115916948.png?www.myhack58.com” width=”690″ height=”101.60958904109589″>
args) 方法的代码” src=”/Article/UploadPic/2017-7/2017718115917874.png?www.myhack58.com” width=”690″ height=”136″>
此处进入LocalizedTextUtil.findText(Class aClass, String aTextName, Locale locale, String defaultMessage,Object[] args),其根据用户的配置做一些本地化的操作
接着进入 LocalizedTextUtil.findText(ClassaClass, String aTextName, Locale locale, String defaultMessage, Object[] args,ValueStack valueStack),代码如下
一、漏洞介绍
1.1 漏洞背景
2017年7月7日,ApacheStruts 发布最新的安全公告,Apache Struts2的strus1插件存在远程代码执行的高危漏洞,漏洞编号为 CVE-2017-9791(S2-048)。攻击者可以构造恶意的字段值通过Struts2的struts2-struts1-plugin插件,远程执行代码。
1.2 漏洞影响
Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本。
二、漏洞复现
本文使用Apache Struts22.3.24 版本作为复现演示实例。
首先下载struts-2.3.24-apps.zip,下载地址为http://archive.apache.org/dist/struts/2.3.24/。解压其中的 strucs2-showcase.war至 tomcat 的工作目录 webapps 下。
根据官网说明,可知漏洞产生的原因是将用户可控的值添加到 ActionMessage 并在客户前端展示,导致其进入 getText 函数,最后 message 被当作 ognl 表达式执行,搜索发现 org.apache.struts2.showcase.integration.SaveGangsterAction 存在漏洞。
内容来自无奈安全网
查看 struts-integration.xml 配置文件可知对应 action 为 saveGangster,类为 org.apache.struts2.s1.Struts1Action。
所以访问 /integration/saveGangster.action
抓包修改参数值,发现成功执行了 OGNL 表达式。
三、漏洞原理分析
3.1 漏洞产生条件
Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录。
copyright 无奈人生
3.2 漏洞动态分析
漏洞的本质原因是在struts2-struts1-plugin包中的Struts1Action.java中的execute函数调用了getText函数,这个函数会执行ognl表达式,且是getText的输入内容是攻击者可控的。
首先执行的 truts1Action 的 execute 方法,该方法首先获取 Action
然后调用 saveGangsterAction 的 execute 方法,将表单请求封装到了 actionForm 中,
并设置一个标识,用于获取 ActionMessage
接着获取 request 中的 ActionMessage,检查 ActionMessage 是否为 null,不为 null 则处理 ActionMessage 并显示在客户端,此处调用了会执行 OGNL 表达式的 getText() 方法,将拼接后的参数传入其中, getText 方法会根据不同的Locale 去对应的资源文件里面获取相关文字信息并展现。 无奈人生安全网
getText(StringaTextName) 方法位于 com.opensymphony.xwork2.ActionSupport 中,代码如下
然后进入 TextProviderSupport.getText(String key, String defaultValue, List args) 方法,代码如下
args) 方法的代码” src=”/Article/UploadPic/2017-7/2017718115916948.png?www.myhack58.com” width=”690″ height=”101.60958904109589″>
args) 方法的代码” src=”/Article/UploadPic/2017-7/2017718115917874.png?www.myhack58.com” width=”690″ height=”136″> 本文来自无奈人生安全网
此处进入LocalizedTextUtil.findText(Class aClass, String aTextName, Locale locale, String defaultMessage,Object[] args),其根据用户的配置做一些本地化的操作
接着进入 LocalizedTextUtil.findText(ClassaClass, String aTextName, Locale locale, String defaultMessage, Object[] args,ValueStack valueStack),代码如下
copyright 无奈人生