一. 漏洞描述
Struts2 是第二代基于Model-View-Controller (MVC)模型的java企业级web应用框架。它是WebWork和Struts社区合并后的产物。
Apache Struts2的s:a和s:url标签都提供了一个includeParams属性。此属性允许使用的值包括none、get、all。当该属性被设置为get或all时,Apache Struts2会将用户提交的参数值作为Ognl表达式执行。攻击者可以提交带有恶意的Ongl表达式,达到执行任意Java代码的目的。只要基于Apache Struts2开发的JSP代码中使用了url/a标签并且设置了includeParams属性为all或get,远程攻击者即可利用此漏执行任意命令。
二. 影响范围
以Apache Struts2框架进行开发的应用,Apache Struts 2.0.0 - Apache Struts 2.3.14.1。
三. 排查方法
3.1 Windows平台
1. 在“开始->运行”键入cmd回车后进行命令提示符,用cd命令进入应用根目录。示例中网站根目录为:C:\Program Files\nSC\web\www。
2. 输入命令:findstr /s /n "<s:url" *
命令说明:findstr匹配字符串
/s 使用递归查找
/n 显示行号
“<s:url” 需要匹配的字符串
* 查找所有文件。
3. 输入命令:findstr /s /n "<s:a" *
命令说明如上。
由于此漏洞存在于<s:a>和<s:url>两个标签中的includeParams属性中,而该属性默认值为GET,可能出现这两个标签但未设置includeParams属性情况,故需要做两次标签匹配。
此命令搜索结果可能包含��似<s:action>标签,此类标签不在漏洞范围内,故需要做进一步判断。
3.2 LINIX/UNIX平台
1. 在终端用cd命令进入网站应用根目录。示例中应用根目录为:/var/www/html。
2. 输入命令:grep -n -r ‘s:url' *
命令说明:grep匹配字符串
-r 使用递归查找
-n 显示行号
‘<s:url’ 需要匹配的字符串
* 查找所有文件。
4. 输入命令:grep -n -r ‘s:a' *
命令说明如上。
由于此漏洞存在于<s:a>和<s:url>两个标签中的includeParams属性中,而该属性默认值为GET,可能出现这两个标签但未设置includeParams属性情况,故需要做两次标签匹配。
此命令搜索结果可能包含类似<s:action>标签,此类标签不在漏洞范围内,故需要做进一步判断。
四. 判断方法
如出现如下情况之一可判定存在该漏洞:
1) 使用<s:a>或<s:url>标签,但未设置includeParams属性值(默认属性为get);
2) 使用<s:a>或<s:url>标签,明确设置includeParams属性值为all或get。
五. 解决方法
修补漏洞可参考如下三种方法:
1. 将includeParams属性设置为none,即
<s:a includeParams="none">或<s:url includeParams="none">
该方法可能导致关联代码无法实现原有的一些功能。
2. 不使用<s:a>或<s:url>标签,用其他类似功能标签,如html的<a>实现原来的功能。
3. 将Struts2升级到2.3.14.2版本,URL:http://struts.apache.org/download.cgi#struts23142