跟进方法
.().(, , m, )
这个表达式返回true则代表安全检查通过,返回false则代表安全检查没有通过。
这个地方的表达式逻辑写错了,取反则意味着当安全检查没有通过的时候返回值为true。
为true则意味着 被赋值为 false,继续跟进则发现返回值为false。
当返回false的时候,我们表达式为truestruts2拦截器,绕过了沙箱。
当这个沙箱之后,我们只需要使ess为true 允许执行静态方法。为空集合,允许调用相关的包。为空集合,允许调用任意类。即可完成任意代码执行
S2-032
S2-032漏洞是一个历史遗留问题,官方给出的是当启用动态方法调用时候,利用:参数进行远程执行代码。
要求
受影响的版本 2.3.20 - 2.3.28(2.3.20.3和2.3.24.3除外)。
这是因为S2-016的时候,保留了两个参数,分别是:和 :又没有做好过滤导致的。
我们在S2-032漏洞可以看到POC发生了变化,在绕沙箱的语句由一大串变成
#=@ognl.@S,这一句在之前的版本也适用,直接通过S覆盖掉s类,因为s类有一堆的安全限制属性,想要绕过的话,需要利用的上下文,那么一定会有疑问,为什么#=@ognl.@S可以绕过安全沙箱呢?
答案非常简单,我们可以看到在类 S其实是的一个实例,随后我们可以注意到一个比较关键的点。
上下文是取值于S实例,而又是s的父类,所以我们在的方法上下断点
可以看到返回的值是true,在分支判断语句的地方可以看出有一个取反的操作,所以不会执行分支下面的判断逻辑,也就不会取安全属性的值从而绕过了安全沙箱,类的作用是用于设置和获取非字段的访问程序,以允许访问, , 的类成员。
官方修复禁用动态调用方法属性,以及将:参数做了过滤
S2-033
S2-033漏洞的问题是REST插件启用了动态方法调用导致的远程代码执行漏洞。并且在的时候没有做过滤。
“的值在找不到,如果有小伙伴找到了可以告诉我,感谢”
同时也与一个关键的属性有关,这个属性为true则允许执行表达式,为false则不允许执行ognl表达式,那么官方针对这个漏洞进行的修复方式则是将属性设置为false,禁止执行ognl表达式,我们可以根据
这个方法来判断是否能够执行ognl表达式,在 2.3.28版本中表达式为true。
可以看到这个分支判断做了一个取反的操作,没有抛出这个错误,所以ognl表达式顺利执行。Btw,在进一步跟进的时候,发现程序在判断语句是否是的时候,一直返回null,而在修复后的版本,则准确的判断出了,这个条件语句是进行了两个表达式判断,需要两个表达式均为true才会报错。
最终在方法处通过执行表达式。
官方的修复方法则是简单粗暴,将表达式设置为false,来看看修复后的版本的处理方式。那么在之后的版本修复则是用方法将进行了一个过滤。
这个点也是没搞懂的,反正就抛出错误了。
S2-037
S2-037这个漏洞也是REST插件造成的问题,不过不需要开启动态方法执行,而且绕过了S2-033的安全机制,绕过的方法是使用三元运算符构造。出问题的类依然是。
关于这个漏洞会有一个问题,为什么不需要开启动态方法执行也可以执行远程代码。
可以看到这里执行完方法后在下面有一个
.,同时没有判断if (lls)
官方的修复方式是使用方法过滤了
S2-045
S2-045漏洞产生的原因是 解析器执行文件上传时造成的远程代码执行,是的默认解析器。
在包装请求方法中可以看到只有-type不为null且值为/form-data的时候才会是一个上传请求。
漏洞产生的类还是est类,当-type报错的时候会执行ognl表达式,看看为什么会这样。
然后会看到,在数据处理出错的时候,会走处理错误流程,catch流程,我们可以看到在catch流程调用了方法。看看方法的实现。
方法执行ognl表达式,跟入
然后我们进入方法看看它的内部实现。
报错信息被转换成对象然后调用方法的方法去执行ognl表达式
官方修复的方式是
去掉了e.方法。
S2-048
S2-048漏洞问题出现在---2.3.32.jar 插件,这个插件的作用是可以让能够兼容的代码
方法主要是实现的国际化的一个方法,比如说邮件,可能发给多个客户,每个客户的语种不一样,不可能针对每一个语种做一个模版,所以就有了方法。
入口点在的方法,的方法是调用类的方法实现的。
这里直接取了原始值,导致了漏洞的产生
执行完后,到达第一个sink点,取值用户可控
代码最终进入的方法执行ognl表达式
官方的修复是建议使用资源建传值。
S2-052
S2-052漏洞是 REST插件的组件存在反序列化漏洞,使用组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
查看-rest--2.3.33.jar的-.xml发现拦截器or。
很多不同类型的数据都交给不同的进行处理,我们注意到这里xml的数据是交给处理的。
的作用是处理与特定内容类型的对象之间的内容传输。
根据这个漏洞,我们主要查看一下类,这类主要是是将xml转换成对象,对象转换成xml的,也就是比较专业的词汇叫““和”“”。
我们分别在or拦截器和处下断点。
它会先获取-type,这也是我们的poc中要修改-type为/xml才可以执行代码的原因,因为只有设置为/xml,你的数据流才会到处执行。
这里其实是有一个分发的操作,根据你的-type类型分发给不同的进行处理,你设置/xml就是分给处理。
这里是调用 进行一个对象转换。
关于““和”“” 参考
官方的修复引入了一些接口,接口为每个操作类定义类限制。
以及升级,我们会看到增加了一些限制类
针对xml序列化做了限制
S2-057
S2-057这个漏洞的产生原因是space为true导致的,
没什么有意思的地方,唯一有意思的是POC的构造,在利用045的POC测试的时候,会发现这个问题。
你是取不到值栈的,这是为什么呢?
首先是045的取值栈方法,在045包括之前的时候我们在类有几个字段
这就是为什么之前的漏洞poc都会有这样的表示标识存在,这个是一个安全沙箱,关于poc的讲解我会在文章里详细写明,包括置空三个属性的值struts2拦截器,这样就可以执行任意代码了,调用任意包了等等
它可以利用的硬编码直接访问上下文,但是在2.3.34版本删除了这三个属性
那么在使用045的poc的时候,会发现值栈返回为空,这是因为无法使用#,#去获取访问对象了
使用域来取值栈,可以看到是可以取到值栈的。
域下有.对象,可以通过这个获取值栈,达到命令执行的目的。
官方的修复是升级到 版本2.3.35或2.5.17。
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh