一、漏洞信息
官方链接:https://cwiki.apache.org/confluence/display/WW/S2-005
官方概述:XWork ParameterInterceptors bypass allows remote command execution
影响版本:Struts 2.0.0 – Struts 2.1.8.1
修复摘要:Developers should immediately upgrade to Struts 2.2.1 or read the following solution instructions carefully for a configuration change to mitigate the vulnerability
二、漏洞原理
S2-005和S2-003的原理是类似的,因为官方在修补S2-003不全面,导致用户可以绕过官方的安全配置(禁止静态方法调用和类方法执行),再次造成的漏洞,可以说是升级版的S2-005是升级版的S2-003。
三、环境搭建
下载 Struts2.0.11.2:http://archive.apache.org/dist/struts/binaries/struts-2.1.8.1-all.zip
引用的包:
commons-fileupload-1.2.1.jar
commons-logging-1.0.4.jar
freemarker-2.3.15.jar
ognl-2.7.3.jar
struts2-core-2.1.8.1.jar
xwork-2.0.5.jar
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>S2-005</title> </head> <body> <h2>S2-005 Demo</h2> <p>link: <a href="https://cwiki.apache.org/confluence/display/WW/S2-005">https://cwiki.apache.org/confluence/display/WW/S2-005</a></p> <s:form action="login"> <s:textfield name="username" label="username" /> <s:textfield name="password" label="password" /> <s:submit></s:submit> </s:form> </body> </html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>S2-005</title> </head> <body> <p>Hello <s:property value="username"></s:property></p> </body> </html>
struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="S2-005" extends="struts-default"> <action name="login" class="com.demo.action.LoginAction"> <result name="success">welcome.jsp</result> <result name="error">index.jsp</result> </action> </package> </struts>
com.demo.action.LoginAction.java
package com.demo.action; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private String username = null; private String password = null; public String getUsername() { return this.username;
} public String getPassword() { return this.password;
} public void setUsername(String username) { this.username = username;
} public void setPassword(String password) { this.password = password;
} public String execute() throws Exception { if ((this.username.isEmpty()) || (this.password.isEmpty())) { return "error";
} if ((this.username.equalsIgnoreCase("admin"))
&& (this.password.equals("admin"))) { return "success";
} return "error";
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>S2-005 Example</display-name> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
四、漏洞分析
首先我们来看看官方是如何修补的S2-003呢?它是新出了一个沙盒机制,默认禁止了静态方法的调用(allowStaticMethodAcces
和MethodAccessor.denyMethodExecution
)
所以我们可以利用OGNL先把沙盒关闭掉,就又可以执行命令了。
xwork.MethodAccessor.denyMethodExecution
设置为falseallowStaticMethodAccess
设置为true
这样就可以关闭掉沙盒机制,unicode编码仍然还是可以的,\u0023
会被解析成#
,POC还是原来的POC,只不过加上了上面的两个设置,接下来我们可以看看具体漏洞分析的过程
这里还是在Tomcat6环境下进行分析。
和S2-003大体相同,在xwork-core-2.1.16.jar!com/opensymphony/xwork2/interceptor/ParametersInterceptor
中断点调试
跟进setParameters
,会进入到xwork-core-2.1.16.jar!com/opensymphony/xwork2/ognl/OgnlValueStack
,可以看出在Ognl中,值栈(ValueStack)的实现类是OgnlValueStack
发现在里面封装了一个setValue
类,跟入ognlUtil.setValue,会进入到xwork-core-2.1.16.jar!com/opensymphony/xwork2/ognl/OgnlUtil
中,这里又封装了一遍setValue
类,最终调用了Ognl中的setValue方法
可以看到其中的compile
方法,会将传来的字符串进行解析,而name值就是我们传递过来的参数值,跟进compile
方法
跟进parseExpression
,这里从topLevelExpression
开始对语法书进行解析,进入到ognl-2.7.3.jar!ognl/OgnlParser
中的expression()
进行解析,可以看到,最后将结果保存到值栈中,\u0023
被解析成#
然后将解析的结果return回去
五、漏洞利用
参考链接
https://cwiki.apache.org/confluence/display/WW/S2-005
- 上一篇:AI和网络安全工作的未来
- 下一篇:恶意文档执行命令提取工具:CMD Watcher
猜你还喜欢
- 06-09深入理解JAVA反序列化漏洞
- 08-12cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 11-28CVE-2017-11882漏洞复现和利用
- 11-10利用Thinkphp 5缓存漏洞实现前台Getshell
- 08-04php安全代码审计小结
- 01-02PHPCMS后台”空降”管理员CSRF漏洞分析
- 01-02某CMS注入分析及注入点总结
- 11-30PHP 函数漏洞总结
- 11-30PHP渗透中的奇淫技巧--检查相等时的漏洞
- 11-15某开源框架从注入到Getshell
- 最新文章
- 随机文章
-
- Python渗透测试框架:PytheM
- 渗透技巧——利用虚拟磁盘实现的“无文件”
- 2017带着梦想重新起航!
- MYSQL提权总结
- Kali Linux渗透基础知识整理(一):信息搜集
- emlog后台拿shell方法合集
- Win7文件搜索神器:Everything v1.3.4正式版下载
- PHP
- 撸翻希拉里的胖子黑客成长史
- Python入门学习
- Arpy – Mac OSX ARP嗅探工具
- wooyun知识库文章及整站镜像分享
- 多线程WEB安全日志分析脚本
- 网站后台登陆万能密码
- 解析漏洞
- 实战审计某BC站源码,并拿下权限
- PHP序列化和反序列化语法差异问题
- Linux应急响应(一):SSH暴力破解
- 分享一款基于Pocsuite的漏洞扫描系统
- 盘古团队发布iOS 9.2-9.3.3越狱工具
- 热门文章
-
- 九年专业安全团队承接渗透入侵维护服务
- Stuxnet纪录片-零日 Zero.Days (2016)【中文字幕】
- Emlog黑客站模板“Milw0rm”发布
- SQLMAP的注入命令以及使用方法
- 白帽故事汇:网络安全战士从来不是「男生」的专利
- 编辑器漏洞手册
- web安全之如何全面发现系统后台
- 常见Web源码泄露总结
- 深入理解JAVA反序列化漏洞
- cmseasy前台无需登录直接获取敏感数据的SQL注入(有POC证明)
- 网站后台登陆万能密码
- 黑客怎样简单入侵别人手机,黑客是如何入侵手机的?
- 黑麒麟2016渗透培训系列教程
- 破解emlog收费模板“Begin”
- 那些强悍的PHP一句话后门
- Android平台渗透测试套件zANTI v2.5发布(含详细说明)
- 渗透工具BackTrack与KaliLinux全套视频教程
- Python列为黑客应该学的四种编程语言之一 初学者该怎么学
- CVE-2017-11882漏洞复现和利用
- 恶意程序报告在线查询工具
- 文章标签
-