Strtus2验证环境搭建与Ognl漏洞原理浅析

Strtus2验证环境搭建与Ognl漏洞原理浅析

0x00.事情背景

Strtus2是由apache开源的一个优雅的,可扩展的框架,用于创建企业准备的Java Web应用程序,该框架基于WebWork进行了扩展优化,旨在简化构建,部署,维护应用程序的整体开发周期。于此同时,其底层架构代码设计存在安全缺陷,导致从2012至今每年都会爆出远程命令执行漏洞。

本文主要从Struts2搭建出发,初步搭建一个可以验证低版本漏洞的验证环境。在文章的后半部分,我们会简要分析历年安全公告原理,以及在Java安全架构设计上的启发。

0x01.基本环境搭建

1.在本操作之前,需要安装好idea + tomcat + maven都进行了有效安装。

2.运行如下语句,其中DarchetypeVersion可以设置为自己想要的版本:

mvn  archetype:generate -B -DgroupId=com.mycompany.mysystem -DartifactId=myWebApp  -DarchetypeGroupId=org.apache.struts  -DarchetypeArtifactId=struts2-archetype-blank -DarchetypeVersion=2.3.15  -DremoteRepositories=http://struts.apache.org

3.使用idea打开,此时pom.xml会自动补齐需要的外部依赖库。配置好tomcat环境并run起来,然后后直接访问如下URL,即可看到ognl正则表达式成功,S2-16漏洞存在,此漏洞是利用了Ognl的原理。http://localhost:8887/example/HelloWorld.action?action:%25{2*2}


Strtus2验证环境搭建与Ognl漏洞原理浅析_第1张图片

0x02. Ognl原理简介

    OGNL是Object-Graph-Navigation Language的缩写,是struts2和webwork的框特性。它主要是能通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

    OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。

    Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:。Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

0x03.关于Ognl漏洞利用Demo

    代码地址:http://www.shucunwang.com/RunCode/java/#id/4a1c8361b2a1d59c985c866244edc38d

Strtus2验证环境搭建与Ognl漏洞原理浅析_第2张图片

    代码执行之后可弹计算器,表示命令已执行。

    从上述代码可以看出,ognl.Ognl这个类库的setValue第一个参数若是用户可以控制的,那么用户可以传入相应的参数使得可以命令执行。同样的参数还有findValue、getValue等,一般是调用OgnlUtil三方框架类中

对于远程命令执行而言,是被攻击者找到了struts2.core库里面有业务逻辑流入了某个地方,执行了上述3个语句中的某个。

0x04.参考资料

1. [Struts2漏洞之S2-016漏洞分析与exp编写] http://blog.csdn.net/u011721501/article/details/41735885/


你可能感兴趣的:(Strtus2验证环境搭建与Ognl漏洞原理浅析)