声明:文章涉及网络安全技术仅作为学习,从事非法活动与作者无关!
本篇为代码审计系列XXE漏洞理论篇第六篇,看完本篇你将掌握关于XXE漏洞的代码视角原理剖析、基础挖掘漏洞核心能力,看完如有技术错误欢迎评论区指正。
-
基本概念
-
XML概念
-
DTD概念
-
DOCTYPE概念
-
业务视角XML代码
-
漏洞校验XML代码
-
实战审计案例-JavaMelody组件
XXE漏洞
一
基本概念
XML格式使用DTD用来约束其中元素的名称、属性,XML中有DOCTYPE标识。用来标记为外部加载DTD还是内部加载DTD,其中外部加载DTD可能会触发XXE漏洞,使用漏洞进行敏感信息探测。
1.1XML概念
XML (Extensible Markup Language)通俗来讲是一种特殊的数据交互的规范格式,与JSON相似。客户端可以使用使用XML格式数据提交给服务器识别、解析、做进一步业务处理,服务器也可以响应XML格式数据客户端进行响应。以下为XML示例:
1.2DTD概念
DTD(Document Type Definition)是文档类型定义的缩写。它是一种用来定义XML文档结构的文本文件,用于描述XML文档中元素的名称、属性和约束关系。DTD可以帮助浏览器或其他应用程序更好地解析和处理XML文档。以下为DTD文件。
1.3DOCTYPE概念
DOCTYPE是 XML 文件中用于声明 DTD 的语法。它告诉解析器使用哪个 DTD 来验证 XML 文档的合法性。DOCTYPE可以引用内部 DTD 或外部 DTD,其中只有外部DTD才会引发XXE外部实体注入漏洞。
二
业务视角DEMO代码
DOM和SAX为原生自带的,JDOM、DOM4J和Digester需要引入第三方依赖库,常见的XML解析有以下几种方式
-
DOM解析
-
SAX解析
-
JDOM解析
-
DOM4J解析
-
Digester解析
2.1DOM解析XML流程及Demo代码
-
创建一个DocumentBuilderFactory对象
-
创建一个DocumentBuilder对象
-
通过DocumentBuilder的parse()方法加载XML
-
遍历name和value节点
2.2SAX解析XML流程及Demo代码
-
获取SAXParserFactory的实例
-
获取SAXParser实例
-
创建一个handler()对象
-
通过parser的parse()方法来解析XML
三
漏洞校验XML代码
Java中的XXE支持sun.net.www.protocol里面的所有协议:http,https,file,ftp,mailto,jar,netdoc。核心使用关键词定位xml解析代码XMLReaderDocumentHelperXMLStreamReaderSAXParserSAXSourceTransformerFactorySAXTransformerFactorySchemaFactoryUnmarshallerXPathExpressionjavax.xml.parsers.DocumentBuilderjavax.xml.parsers.DocumentBuilderFactory XXE漏洞限制:为了修复XXE漏洞并提高代码的安全性,可以采取以下措施:
-
代码层面禁用外部实体解析
-
使用安全的 XML 解析库
-
SpringBoot使用安全配置
-
使用白名单限制外部实体加载内容
3.1代码层面禁用外部实体解析
3.2使用安全的 XML 解析库
OWASP ESAPI或JAXB。使用这些库可以降低 XXE 风险
四
JavaMelody实战审计案例
此篇XXE为白盒审计,以JavaMelody1.74.0版本组件部署后从源代码视角到漏洞定位及抓包调试进行讲解。以下XXE审计思路:- 使用XML解析依赖- 未禁用外部实体解析
4.1项目部署
GitHub项目地址:https://github.com/javamelody/javamelody/wiki
查看项目部署说明:POM.xml引入依赖,访问http://localhost:port/monitoring进入监控页面
安装项目
Idea直接按照步骤操作进行部署即可
成功启动项目
4.2JavaMelody组件源码分析
组件中涉及两个jar包,其中以Javamelody-spring-boot-starter为配置入口其中Pom.xml引入Javamelody-core作为业务代码,优先分析Javamelody-core。
使用关键字搜索定位Xml使用方法,定位到PayloadNameRequestWrapper.java
234行PayloadNameRequestWrapper类中parseSoapMethodName方法使用XMLInputFactory进行解析Xml文件,直接解析。
需要找到调用接口以及查看是否之前存在XXE防护代码,查看层次结构层层查看
104行PayloadNameRequestWrapper类的initialize方法主要是做了判断,需要HTTP请求头contentType = "application/soap+xml"或者"text/xml"并且"SOAPAction"不为空
跟进getBufferedInputStream()方法,看样子是POST方式请求体Xml的内容
继续查看调用关系MonitoringFilter.java中createRequestWrapper也是在做初始化操作
继续查看调用关系还是在MonitoringFilter.java的doFilter方法,发现重写了doFilter
Javamelody-spring-boot-starter:定义了一个名为monitoringFilter的Spring Bean,用于注册JavaMelody的监控过滤器(MonitoringFilter),看到任意路由都会经过该Filter处理使用1.74.0版本JavaMelody组件的Web应用都可以利用XXE漏洞
4.3漏洞测试
4.3.1开启Web python服务
4.3.2直接构造XXE参数进行成功HTTP加载
4.4漏洞修复
查看javamelody修复记录
END
原文始发于微信公众号(闪石星曜CyberSecurity):代码审计之 XXE漏洞场景,及实战讲解!
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论