【干货分享】你所不知道的XML安全——XML DTD与XXE攻击

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》

 

发表评论