0x01 前言

2018年8月22日,Apache Strust2发布最新安全公告,Apache Struts2存在远程代码执行的高危漏洞(S2-057/CVE-2018-11776),该漏洞由Semmle Security Research team的安全研究员Man YueMo发现。该漏洞是由于在Struts2开发框架中使用namespace功能定义XML配置时,namespace值未被设置且在上层动作配置(Action Configuration)中未设置或用通配符namespace,可能导致远程代码执行。同理,url标签未设置value和action值且上层动作未设置或用通配符namespace时也可能导致远程代码执行,经过笔者自建环境成功复现漏洞且可以执行命令回显,文末有你们想要的 !

0x02 漏洞利用

笔者搭的环境分别是Strust2 2.3.20 版本和 Strust2 2.3.34版本,漏洞利用大致分为三种方式:数值计算、弹出计算器、 命令回显。

2.1、数值计算

数值计算相对最简单,在URL上指定 %{100+200} 就可以发生跳转,得到计算的结果

2.2、弹出计算器

2.3.20 版本的POC如下:

2.3.34 版本参考的POC如下:

2.3、命令回显

两个版本都是利用com.opensymphony.xwork2.dispatcher.HttpServletResponse对象去打印命令执行后的回显数据

2.3.20 版本的POC如下:

攻击后效果如下图

0X03 漏洞分析

在分析漏洞之前,需要配置struts.xml文件,这个文件就是struts2的核心配置文件,大多数的时候增减配置都需要操控这里;

总共两处需要注意,第一处一定要配置struts.mapper.alwaysSelectFullNamespace  = true ,否则不能触发漏洞,这个配置的目的是设定是否一直在最后一个斜线之前的任何位置选定NameSpace;第二处result标签返回的类型选择 “ redirectAction 或 chain“ , 只有这两个配置选项的值是可以将action转发或者重定向;关于type具体可以参考下图

说完了配置,开始动态分析。漏洞位于 struts2-core.jar!/org/apache/struts2/dispatcher/ServletActionRedirectResult.class

This.namespace这个成员的值来自于getNamespace()方法,再通过getUriFromActionMapping()返回URI字符串;

通过getUriFromActionMapping获取的值赋给了tmpLocation变量,接着表达式进入setLocation方法

再通过super.execute方法调用了ServletActionResult , 而在execute方法体内跟进了conditionalParse方法,在这个方法内调用了ONGL执行的关键方法translateVariables。

获得的param值传入到translateVariables()方法内,最终在OnglTextPaser里导致了OGNL表达式执行。

再弹出计算器后获得lastFinalLocation的值为当前执行后的句柄,这个值作为响应跳转的action地址 ,也就是在浏览器中弹出计算器后在地址栏中出现的URI

到这里弹出计算器的分析到此为止,接下来看下基于命令执行回显结果的分析,基本上流程和上述一样,唯一不同之处lastFinalLocation返回的值是NULL,这也就引发出提交后没有做302的跳转,依旧是当前的action,并且返回的值是200

知道了原理后小同事用python实现了自动化利用工具,此工具用途仅供学习研究;

0x04 防御措施

将框架版本升级到官方最新版本;对于Web应用来说,尽量保证代码的安全性;对于IDS规则层面来说,数值计算和弹计算器返回的状态码都是302,并且Location跳转字段含有特征句柄字符串;如果是命令回显返回的200状态码,且有命令结果输出;

0x05 小结

文章中提及的python EXP下载地址: https://github.com/Ivan1ee

0x06 参考链接

https://cwiki.apache.org/confluence/display/WW/S2-057

https://lgtm.com/blog/apache_struts_CVE-2018-11776

https://blog.csdn.net/madison__/article/details/55671426

Struts2-057/CVE-2018-11776两个版本RCE漏洞分析(含EXP)的更多相关文章

  1. Win95+IE3 – Win10+IE11全版本执行漏洞(含POC)

    微软本月安全更新修复了一个潜藏了18年的IE远程代码执行漏洞(CVE-2014-6332),可以说是给windows吃了一颗大补丸.缺陷出现在VBScript的代码中,自Windows 95首次发布( ...

  2. win10系统安装两个版本的python,该怎么安装Django

    最近遇到一个问题,系统上安装了python2,7 和python3.5两个版本,然后使用命令:pip install Django 安装Django后却发现以下情况: Traceback (most ...

  3. Struts2漏洞分析,漏洞波及全系版本

    Struts漏洞分析    Apache Struts团队已经发布了Struts 2.3.15.1安全更新版本.在Struts2.3.15.1版本之前,存在着严重的安全漏洞,如果现在一些比较大的网站是 ...

  4. git日志输出格式及两个版本之间差异列表

    查看commit id git log --pretty=format:"%h" git log --pretty=format:"%H" 获取两个版本间差异的 ...

  5. 【转】jquery两稳定版本比较~~

    博客分类: Web前端 jquery  jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的 ...

  6. 【转载】pygame安装与两种版本的Python兼容问题

    在开始学习游戏编程之前,我们先来安装下pygame和python3.2.5 参考园友: http://www.cnblogs.com/hongten/p/hongten_pygame_install. ...

  7. mysql5.7.10和mysql5.5.39两个版本对于group by函数的处理差异

    原理还是没有搞清楚,在官网上看了一下,看的不是很清楚.一并都记录一下. 问题描述: 存在如下数据结构 sql: 求用户最近更新的那条记录 思路: 按照modify_time排序后按照user_id分组 ...

  8. Linux下切换使用两个版本的JDK

    Linux下切换使用两个版本的JDK 我这里原来已经配置好过一个1.7版本的jdk. 输出命令: java -version [root@hu-hadoop1 sbin]# java -version ...

  9. 使用Tortoise结合Git比较两个版本的差异

    1.右键项目,TortoiseGit -------> Diff with previous version 2.单击出分支选择弹窗,进行选择要比较的两个分支 3.比较同个分支的两个不同的版本 ...

随机推荐

  1. 基于AspectJ的XML方式进行AOP开发

    -------------------siwuxie095                                 基于 AspectJ 的 XML 方式进行 AOP 开发         1 ...

  2. C#中货币类型和数值类型、字符串类型的转化

    1.定义textbox的数据 private void Form1_Load(object sender, EventArgs e) { this.textBox1.Text = String.For ...

  3. 基于Python Shell获取hostname和fqdn释疑

    一直以来被Linux的hostname和fqdn(Fully Qualified Domain Name)困惑了好久,今天专门抽时间把它们的使用细节弄清了. 一.设置hostname/fqdn 在Li ...

  4. php的反射

    我们可以在PHP运行时,通过PHP的反射动态的获取类的方法.属性.参数等详细信息.   用途:插件的设计,文档的自动生成,扩充PHP语言. <?php class Person { const ...

  5. spring框架中工厂方法的创建和销毁

    1.编写接口UserSerivce: public interface UserService { public void sayHello(); } 2.编写实实现接口的方法,在该方法中除了要实现接 ...

  6. 在winform嵌入外部应用程序

    应朋友要求,需要将一个第三方应用程序嵌入到本程序WinForm窗口,以前在VB6时代做过类似的功能,其原理就是利用Windows API中FindWindow函数找到第三方应用程序句柄,再利用SetP ...

  7. HDU_1022

    题目: As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want t ...

  8. dump()

    输出格式化的对象

  9. qt基本类

    多firstpage secondpage thirdpage fouthpage  实现 多页面 xml解析 实现 按钮 和 slot实现 mysql数据库访问实现

  10. 电商类Web原型制作分享-IKEA

    IKEA是一个家居整合大型零售商,属于电商类官网.电商以展示商品.售后服务.购物流程为主.根据网站的图文方式排版,主导航栏使用的标签组,区域导航栏使用的是垂直选项卡,实现下拉弹出面板交互的功能. 本原 ...