Smi1e@卫兵实验室
漏洞描述
Struts2 会对某些标签属性(比如 `id`,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 `%{x}` 且 `x` 的值用户可控时,用户再传入一个 `%{payload}` 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。
影响范围
Struts 2.0.0 - Struts 2.5.25
漏洞分析
S2-061和S2-059的OGNL表达执行触发方式一样,详情可见公众号之前的文章:Struts2 S2-059 漏洞分析。S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,而S2-061再次绕过了S2-059的沙盒。
diff一下沙盒,可以看到把很多中间件的包添加到了黑名单中。
已知的OGNL沙盒限制为:
无法new一个对象
无法调用黑名单类和包的方法、属性
无法使用反射
无法调用静态方法
另外,最新的struts2在 ognl.OgnlRuntime#invokeMethod
中ban掉了常用的class,意味着即使绕过了沙盒依然不能直接调用这些类。
public static Object invokeMethod(Object target, Method method, Object[] argsArray) throws InvocationTargetException, IllegalAccessException {
if (_useStricterInvocation) {
Class methodDeclaringClass = method.getDeclaringClass();
if (AO_SETACCESSIBLE_REF != null && AO_SETACCESSIBLE_REF.equals(method) || AO_SETACCESSIBLE_ARR_REF != null && AO_SETACCESSIBLE_ARR_REF.equals(method) || SYS_EXIT_REF != null && SYS_EXIT_REF.equals(method) || SYS_CONSOLE_REF != null && SYS_CONSOLE_REF.equals(method) || AccessibleObjectHandler.class.isAssignableFrom(methodDeclaringClass) || ClassResolver.class.isAssignableFrom(methodDeclaringClass) || MethodAccessor.class.isAssignableFrom(methodDeclaringClass) || MemberAccess.class.isAssignableFrom(methodDeclaringClass) || OgnlContext.class.isAssignableFrom(methodDeclaringClass) || Runtime.class.isAssignableFrom(methodDeclaringClass) || ClassLoader.class.isAssignableFrom(methodDeclaringClass) || ProcessBuilder.class.isAssignableFrom(methodDeclaringClass) || AccessibleObjectHandlerJDK9Plus.unsafeOrDescendant(methodDeclaringClass)) {
throw new IllegalAccessException("Method [" + method + "] cannot be called from within OGNL invokeMethod() " + "under stricter invocation mode.");
}
}
再看一下OGNL沙盒未限制的操作为:
对象属性
setter/getter(public)
赋/取值,可以访问静态属性。已实例类的方法调用(
OgnlContext
中的对象),不允许调用静态方法
可以看到目前我们只能在 OgnlContext
中寻找可利用的对象。
看一下 #application
中的 org.apache.tomcat.InstanceManager
,他的键值为类 org.apache.catalina.core.DefaultInstanceManager
的实例化对象,该类为tomcat中的类,其他中间件还未分析,有兴趣可以自己找找看。
他有一个 newInstance
方法,className
我们可控,最终可以实例化任意无参构造方法的类并返回。
也就是说我们现在绕过了无法new一个对象的限制,不过这个对象必须存在 public
的无参构造方法。
ognl3.1.15中, OgnlContext
又删掉了 CONTEXT_CONTEEXT_KEY
也就是 context
这个key,禁止使用 #context
对 OgnlContext
进行访问。
而S2-057通过 #attr
、#request
等map对象中的 struts.valueStack
间接获取到了 OgnlContext
,但是补丁把包 com.opensymphony.xwork2.ognl.
加入到了黑名单中,不能调用 OgnlValueStack
的 getContext
方法了,因此这种方法也行不通了。
不过我们可以利用前文的实例化任意无参构造方法条件调用一些方法,间接的帮我们获取到 OgnlContext
。
看一下 org.apache.commons.collections.BeanMap
跟进 this.initialise()
,他会把我传入对象对应class当做bean,提取 get
和 set
方法以及 name
赋值进 readMethods
和 writeMethods
。
看一下其 get
方法,根据我们传入的 name
调用 readMethods
中对应的 getXxx
方法
而 com.opensymphony.xwork2.ognl.OgnlValueStack
中存在 getContext
方法,因此我们可以拿到 OgnlValueStack
后,利用 BeanMap
间接获取到 OgnlContext
。
同理我们可以获取到 com.opensymphony.xwork2.ognl.SecurityMemberAccess
对象
并利用 put
方法调用 setExcludedClasses
和 setExcludedPackageNames
覆盖掉黑名单。
前面提到了最新的 struts2 即使绕过了沙盒依然不能直接调用常用的类来进行利用,但是我们清空了黑名单之后可以实例化任意黑名单中的类。
看下黑明单包中的类 freemarker.template.utility.Execute
,存在无参构造方法 Execute()
,exec
方法可以直接执行命令。
漏洞证明
关于我们
人才招聘
二进制安全研究员(Windows内核方向)
工作地点:
1.杭州;
岗位职责:
1、负责研究Window内核相关漏洞利用技术;
2、负责分析Window内核漏洞的原理及缓解措施;
任职要求:
1、2年以上windows逆向工作经验。
2、熟悉windows底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉win32/64开发,并有相关开发经验;
3、熟悉windows驱动开发、熟悉windows平台内核架构;能熟练运用Windows平台下的软件调试方法。
4、熟练使用ida、windbg等调试软件工具调试分析漏洞。
5、有CVE编号、内核研究成果者优先;
6、具备良好的团队沟通、协作能力、良好的职业道德。
二进制安全研究员(Linux内核方向)
工作地点:
1.杭州;
岗位职责:
1、负责研究Linux内核相关漏洞利用技术;
2、负责分析Linux内核漏洞的原理及缓解措施;
任职要求:
1、2年以上Linux逆向工作经验。
2、熟悉Linux底层架构、运行机制,熟悉汇编语言 C/C++语言,熟悉x86/64开发,并有相关开发经验;
3、熟悉Linux驱动开发、熟悉Linux平台内核架构;能熟练运用Linux平台下的软件调试方法。
4、熟练使用ida、gdb、lldb等调试软件工具调试分析漏洞。
5、有CVE编号、内核研究成果者优先;
6、具备良好的团队沟通、协作能力、良好的职业道德。
二进制安全研究员(系统应用方向)
工作地点:
1.杭州;
岗位职责:
1、负责安全技术研究,跟踪国内外最新的安全技术以及安全漏洞的追踪;
2、负责进行二进制漏洞挖掘,包括不限于浏览器、chakara引擎、js引擎、office、pdf等等各种二进制类应用;
任职要求:
1、能主动关注国内外最新安全攻防技术,并在自己擅长和兴趣的领域能够进行深入的学习、研究;
2、熟练掌握windbg、ida、gdb等调试工具;
3、熟悉各类二进制安全漏洞原理(堆溢出、栈溢出、整数溢出、类型混淆等等)以及各种利用技术;
4、能够无障碍阅读英文技术文档;
5、具备良好的团队沟通、协作能力、良好的职业道德。
Web安全研究员
工作地点:
1.杭州;
岗位职责:
1、安全攻防技术研究,最新web应用及中间件(tomcat、jetty、jboss等等)、框架(struts、spring、guice、shiro等等) 组件(freemarker、sitemesh等等)漏洞挖掘研究;
2、跟踪分析国内外的安全动态,对重大安全事件进行快速响应;
任职要求:
1、了解常见的网络协议(TCP/IP,HTTP,FTP等);
2、熟练使用Wireshark等抓包工具,熟悉正则表达式;
3、掌握常见漏洞原理,有一定的漏洞分析能力;
4、具备php、python、java或其他相关语言编码能力;
5、对常见waf绕过有一定的基础经验;
6、具备一定的文档编写能力,具备良好的团队共同能力;
7、对安全有浓厚的兴趣,工作细致耐心。
感兴趣的小伙伴请联系Nike,或将简历投送至下方邮箱。(请注明来源“研究院公众号”,并附带求职岗位名称)
联系人:Nike
邮箱:nike.zheng@dbappsecurity.com.cn