XML注入

上一篇 / 下一篇  2012-06-01 15:05:02 / 个人分类:Web测试

XML注入(XML Injection)

如同HTML脚本注入一样,在输出中包含攻击者提供的数据的地方,XML是容易受到攻击的。三种最常见的XML注入攻击是:XML数据注入、可扩展样式表语言转换(Extensible Stylesheet Language Transformation,XSLT)注入和XPath/XQuery 注入。

·XML数据注入(XML Data Injection)

XML通常用于存储数据,如果用户提供的数据是以XML的方式进行存储,那么对攻击者来说,注入额外的、攻击者可能不能正常控制的XML是有可能的。考虑下述XML,在这个XML中,攻击者仅仅能够控制Attacker Text文本:

<?xml version="1.0" encoding="UTF-8"?>
<USER role="guest">Attacker Text</USER>

如果用你的输入来替换Attacker Text,那将会是多么有趣的测试用例呢?如果开发人员不够谨慎的话,他们可能错误地允许XML注入。如果以User1</USER><USER role=“admin”>User2 作为输入的话,将会产生如下的XML(用户输入的是黑体文本部分):

<?xml version="1.0" encoding="UTF-8"?>
<USER role="guest">User1</USER>
<USER role="admin">User2</USER>

如果应用程序读取这个文件,并且决定给每个用户分配何种访问权限的时候,User2将获得管理员权限!

提示如果你能够在XML文件的某个部分注入数据的话,那么发送相同的元素
和属性(这些元素和属性是在以前的XML中出现过的,并且是你所不能访问的)
就会很有价值。一些XML解析器会使用最后指定的那些元素/属性的实例,这样,
你或许就能够有选择性地覆盖以前的一些值。

·可扩展样式表语言(XSL)

除了注入数据到XML之外,作为XML注入的结果,使代码运行也是可能的。XSL由XSL转换(XSL Transform,XSLT)、XML路径语言(XML Path Language,XPath)表达式和XSL格式化对象(Formatting Object,XSL-FO)组成,并且允许在XML文件中使用样式表。这种样式表能够把已有的XML数据转换成新的XML数据。这种新的XML文档通常以HTML的方式在Web浏览器中展现。在这种情况下,攻击者能够注入数据,而这些数据将使脚本在浏览器中运行。例如,下述XML是RSS提要(RSS feed)中的一部分,这个XML引用了一个超链接:

<link>Attacker Text</link>

为了表示上述XML,应用XSLT将上述XML转换为如下的HTML,并传送给Web浏览器:

<A HREF="Attacker Text">Attacker Text</A>

如果你控制了Attacker Text文本的话,你能够想到一种方法来运行脚本吗?即使程序员对攻击者提供的文本进行了HTML编码,攻击者仍然能够利用脚本协议,通过类似于javascript:alert()的输入来运行脚本。如果这个HTML在一个站点或者一定的范围内表现得与原始RSS提要(RSS feed)不同的话,那么,这就是一种通过XML数据引发的HTML脚本攻击。

重要提示当测试XML注入的时候,可以试着发送尖括号和引号标志来转义当前
的XML属性/标签。当应用程序被正确保护的时候,它就不会让用户提供数据来转
义XML标签和属性,这样就可以防止XML注入攻击。通常,适用于脚本注入和跨站
脚本的测试用例也适用于XML注入。

·XPath/XQuery注入

XPath和XQuery是能够查询XML文档的语言,类似于结构化查询语言(SQL)。事实上,许多流行的数据库允许利用XPath和XQuery来查询数据库。在许多情况下,攻击者不能够直接访问XML数据,但是,攻击者可以用部分数据来创建XPath和XQuery语句,而这些语句能够用来查询XML。这样,攻击者就能够通过精心构造的输入来注入任意的查询,以此来获得数据,而这些数据在正常情况下是不允许攻击者访问的。

XML文件能够包括信息的不同部分或者区域。有时,只有这些信息中的特定部分才会被暴露给最终用户,例如,下述XML包含了姓名和社会保障号:

<?xml version='1.0'?>
<staff>
<author> 
<name>Tom Gallagher</name>
<SSN>123-45-6789</SSN>
</author>
<author>
<name>Bryan Jeffries</name>
<SSN>234-56-7890</SSN>
</author>
<author>
<name>Lawrence Landauer</name>
<SSN>012-345-6789</SSN>
</author>
</staff>

这个XML存储在一个Web服务器上,并且是不能够被最终用户直接访问的。在这个服务器上用于查询XML的一个网页是能够被最终用户访问的,而且,只有作者姓名能够通过网页进行显示。利用下述XPath表达式就能够获得XML数据:

//*[contains(name,'Attacker-Data')]/name

Attacker-Data是最终用户指定的数据,正如你所看到的那样,攻击者能够控制部分XPath查询。通过指定数据为x')] | //*| //*[contains(name,'y,攻击者能够获得这个XML文件的完整内容。这种输入构造了如下的XPath表达式:

//*[contains(name,'x')] | //*| //*[contains(name,'y')]/name

注意在上述表达式中,管道符号(|)用于表示或操作,左斜线和一个星号(//*)代表所有节点。上述XPath表达式可能有下述三种情况:

1.任何包含x的姓名

2.任何在这个XML文件中的节点

3.任何包含y的姓名

因为在第二种情况下能够返回所有节点,所以攻击者能够获得这个XML文件的所有数据!

更多信息关于XPath注入的更多信息,请参见Amit Klien在
https://www.watchfire.com/ securearea/whitepapers.aspx?id=9
上的文章“Blind XPath Injection”。

提示用于XPath/XQuery注入的概念同样适用于SQL

TAG: Web测试 安全测试 XML注入

 

评分:0

我来说两句

Open Toolbar