XML上的安全不容忽视

KCon Web安全大会是一个交流前沿、边缘、主流的Web安全技术、技巧、案例的开放安全会议。大会上天融信阿尔法实验室张晨做了《Having Fun with XML Hacking》议题演讲,内容非常精彩。本文把演讲的内容稍加整理,与大家分享。

东至网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、响应式网站设计等网站项目制作,到程序开发,运营维护。创新互联公司于2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

XML的全称是eXtensible Markup Language,意思是可扩展的标记语言,它是标准通用标记语言(Standard Generalized Markup Language,SGML)的一个子集。

在80年代早期,IBM提出在各文档之间共享一些相似的属性,例如字体大小和版面。IBM设计了一种文档系统,通过在文档中添加标记,来标识文档中的各种元素,IBM把这种标识语言称作通用标记语言(Standard Generalized Markup Language,SGML),即GML。经过若干年的发展,1984年国际标准化阻止(ISO)开始对此提案进行讨论,并于1986年正式发布了为生成标准化文档而定义的标记语言标准(ISO 8879),称为新的语言SGML,即标准通用标记语言。

一个简单的XML文件示例,一个XML文件由XML声明、文档类型定义和文档元素组成。

那么什么是文档类型定义呢?文档类型定义,也叫DTD(Document Type Definition),可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

DTD文档的声明及引用

内部DTD文档

外部DTD文档

内外部DTD文档结合

定义内容

-]>

XML被设计用来存储和传输数据,任何平台上的程序都可以通过使用XML解析器来处理XML数据,XML的使用范围非常广泛,不仅仅是web应用,还包括数据库软件、浏览器等等。既然XML的覆盖面这么广,那么如果出现安全问题也是相当可怕的。而且很多软件都是使用的同一款XML解析库,如果这套解析库存在漏洞,那么无疑又将影响的范围扩大了。

下面这张图很清晰的描述了程序在处理XML时容易出现问题的点,我们逐步来看:应用先将原始数据交给XML生成器,生成XML数据,然后将生成后的XML数据提交到web服务器,web服务器接收到XML数据后,将XML数据交给XML解析器,由XML解析器完成对XML数据的解析后把数据再返回给应用。在整个数据处理流程中,XML生成器和XML解析器这两个点是最容易出现问题的。

在XML解析的过程中,最常见的有三种漏洞:

◆拒绝服务漏洞

◆XML注入

◆XML外部实体注入

XML拒绝服务漏洞

我们逐个分析,先来看拒绝服务攻击。

下图是一个典型拒绝服务攻击的payload:

可以看到,payload中先定义了lol实体,值为“lol”字符串,然后下面又定义了lol2实体,在lol2实体中,引用10个lol实体,也就是说现在lol2的值是10个“lol”字符串,下面的lol3又引用了10个lol2实体的值,现在lol3的值是100个“lol”字符串,依此类推,到了最后在lolz元素中引用的lol9中,就会存在上亿个“lol”字符串,如果程序在解析数据时没有做特别的处理,那么极有可能对程序造成拒绝服务攻击。

XML注入漏洞

再来看XML注入的例子:

例图这是一个标准的xml文件,即将被提交到web服务器中,我们假设这是一个存有订单信息的xml文件,其中price的值不可控,quantity和address项的值可控,可以由用户自由输入,那么这时,攻击者可以实施xml注入攻击,在quantity的值中构造"