[连载]java代码审计中常见漏洞的特征函数-xxe

常见解析xml的类有如下:

  • javax.xml.parsers.DocumentBuilder
  • javax.xml.stream.XMLStreamReader
  • org.jdom.input.SAXBuilder
  • org.jdom2.input.SAXBuilder
  • javax.xml.parsers.SAXParser
  • org.dom4j.io.SAXReader
  • org.xml.sax.XMLReader
  • javax.xml.transform.sax.SAXSource
  • javax.xml.transform.TransformerFactory
  • javax.xml.transform.sax.SAXTransformerFactory
  • javax.xml.validation.SchemaFactory
  • javax.xml.bind.Unmarshaller
  • javax.xml.xpath.XPathExpression

备注:

  • 本文中的代码段为国内知名软件的部分代码段,如涉及侵权,请通知博主删除
  • 本文章不会提及软件中的0Day漏洞,只是借用真实软件的代码段来分析这些类的使用真实场景

 

DocumentBuilder


先看一段DocumentBuilder的使用代码段:

   private TempleteProfile fromXML(ServletContext servletContext) {
      TempleteProfile templeteProfile = new TempleteProfile();
      InputStream is = this.getXMLFromFile("/WEB-INF/jsp/hr/conf/templete_config.xml", servletContext);
      DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();

      try {
         DocumentBuilder ex = domfac.newDocumentBuilder();
         Document doc = ex.parse(is);
         Element root = doc.getDocumentElement();
         NodeList templetes = root.getElementsByTagName("TempleteConfig");
         if(templetes != null) {
            ArrayList templeteConfigs = new ArrayList();

            for(int i = 0; i < templetes.getLength(); ++i) {
               Element node = (Element)templetes.item(i);
               TempleteConfig templeteConfig = new TempleteConfig();
               templeteConfig.setKey(node.getElementsByTagName("key").item(0).getFirstChild().getNodeValue());
               templeteConfig.setName(node.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
               templeteConfig.setFName(node.getElementsByTagName("fName").item(0).getFirstChild().getNodeValue());
               templeteConfigs.add(templeteConfig);
            }

            templeteProfile.setTempleteConfigs(templeteConfigs);
         }
      } catch (Exception var13) {
         LOG.error("", var13);
      }

      return templeteProfile;
   }

这个函数使用了DocumentBuilder类来解析xml文件,如何这个文件是由外部动态输入的话,就有可能造成xxe漏洞。

以上代码段是载入模板配置的xml文件的函数,当然单独这个函数是不存在漏洞的,我们这里可以提出假设:

  1. xml配置文件可以由外部输入
  2. 外部输入不一定是通过http请求直接输入得到
  3. 可以构造组合漏洞,
  4. 比如:假设可以找到第二个漏洞修改到某个配置目录,但是没有其他目录的权限,并且配置目录不可以执行动态代码文件
  5. 比如:可以去查询一下这个配置文件是否有其他修改的地方
  6. 比如:看看有没有越权方面的漏洞
  7. 继续看,如果不可以找到修改的地方,那么是否可以通过其他服务来构造特殊请求,调用这个函数
  8. 接着,孤立的看这个函数是不可以利用,但是TempleteConfig作为节点载入到内存之后,传递到真实使用的地方,有没有利用的可能性

本期要点

以上的说法都是在说明一个事情,请看如下分析:

  1. 当一个比较完善的经过其他审计专家进行过代码审计的软件,希望直接能够找到单一的可以直接利用的漏洞,确实有点接近天方夜谭。
  2. 各种代码审计专家,他们不会进行动态调试,基本上都静态的根据各种审计软件或者设计手册进行审计。
  3. 这里就必然会出现一种可能性,静态审计无法对动态结果进行猜测
  4. 多个小的不起眼的问题,单个是无法利用的,并且改动对于软件的整体结构有很大影响,那么开发团队就会倾向于不修改。
  5. 所以我们一定不要孤立的去看任何一个小的漏洞或者不正确的写法
  6. 甚至于,我经常在几个小漏洞组合利用中间衔接的部分,会使用到正常的应用方法或者接口
  7. 对于大型的经过反复审计的软件,一定要有信心,另外要对代码结构有一定了解。

 

参考资料:

  • XXE漏洞利用技巧:从XML到远程代码执行
  • https://blog.csdn.net/weixin_39997829/article/details/79654861
  • Apache Solr XXE漏洞分析 -【CVE-2018-8026 】

你可能感兴趣的:(Java代码审计,漏洞组合利用专栏)