XML攻击手段手段面面观!
XML DTD概述
什么是XML?
在80年代早期,IBM提出在各文档之间共享一些相似的属性,例如字体大小和版面。IBM设计了一种文档系统,通过在文档中添加标记,来标识文档中的各种元素,IBM把这种标识语言称作通用标记语言(Standard Generalized Markup Language,SGML),即GML。经过若干年的发展,1984年国际标准化阻止(ISO)开始对此提案进行讨论,并于1986年正式发布了为生成标准化文档而定义的标记语言标准(ISO 8879),称为新的语言SGML,即标准通用标记语言。
一个简单的XML文档例子:
<?xml version=”1.0″?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don’t forget me this weekend!</body>
</note>
解析:
文档的第一行是一个应该经常包含的XML申明,它定义了XML文档的版本号,在这个例子中表示文档将使用XML1.0的规范<?xml version=”1.0″?>
下一行定义了文档里面的第一个元素(element),也称第一个元素为根元素: <note>
再下面定义了根元素的四个子元素(分别是to, from, heading,和body): <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don’t forget me this weekend!</body>
最后一行定义了根元素的结束标志</note> ,所有的XML元素都必须要有一个结束标志。
XML与HTML的区别
在语法上,XML与HTML的区别如下:
XML | HTML |
所有的元素都必须要有一个结束标志 | 并非所有元素都需要结束标志。 |
大小写敏感 | 大小写不敏感 |
所有元素嵌套必须正确 | 不需要正确的嵌套 |
所有的XML文档都必须要有一个根标志 | 并非必须有一个根标识 |
… | … |
XML可以被认为是HTML的一种补充。
XML的工作流程
XML的适用场合
DTD的概念
DTD文档类型定义,是一类可定义合法的XML文档构建模块。可以认为DTD定义了一种针对XML的格式描述,任何一个XML文件都可以引用。
XML提供了一个独立的运用程序的方法来共享数据.。使用DTD,不同的组中的人就能够使用共同的DTD来交换数据。你的应用程序可以使用这个标准的DTD来验证你接受到的数据是有效的。
上面引用过的那个XML转换成DTD的样式是这样:
- 内部DTD文档:
<!DOCTYPE 根元素 [定义内容]>
- 外部DTD文档:
<!DOCTYPE 根元素 SYSTEM “DTD文件路径”>
- 内外部DTD文档结合:
<!DOCTYPE 根元素 SYSTEM “DTD文件路径” [定义内容-]>
一旦涉及到外部..问题就来了..
XXE及XML安全
XML和DTD的脆弱之处
XML拒绝服务
这样的DTD一旦进入DOM,将极有造成拒绝服务…
payload中先定义了lol实体,值为“lol”字符串,然后下面又定义了lol2实体,在lol2实体中,引用10个lol实体。也就是说现在lol2的值是10个“lol”字符串,下面的lol3又引用了10个lol2实体的值,现在lol3的值是100个“lol”字符串,依此类推,到了最后在lolz元素中引用的lol9中,就会存在上亿个“lol”字符串,如果程序在解析数据时没有做特别的处理,那么极有可能对程序造成拒绝服务攻击。
XML注入
外部实体注入(XXE)
XXE的典型攻击代码
基于XXE的SSRF/OOB
Blind XXE
参数实体
基于HTTP的Blind XXE
OOB
可以使用的其它协议
学习资料
- http://wooyun.org/bugs/wooyun-2010-076041
- http://www.80sec.com/xml-entity-injection.html
- https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing
- http://www.vsecurity.com/download/publications/XMLDTDEntityAttacks.pdf
- 《Having Fun with XML Hacking》