`
yanyanquan
  • 浏览: 452546 次
  • 性别: Icon_minigender_1
  • 来自: 江门
社区版块
存档分类
最新评论

避免XPath 注入的危险

阅读更多
随着简单 XML API、Web 服务和 Rich Internet Applications (RIAs) 的发展,更多组织几乎在所有方面(从配置文件到远程过程调用)都采用 XML 作为数据格式。一些人已经使用 XML 文档代替更传统的纯文本文件或关系数据库,但是与任何其他允许外部用户提交数据的应用程序或技术相似,XML 应用程序可能容易受到代码注入的攻击,尤其是 XPath 注入攻击。

简介

随着新技术的出现并得到很好的沿用,针对这些技术的威胁也随之产生并逐渐增多。SQL 盲注攻击是一种为人熟知的代码注入攻击形式,但是也有很多其他形式,有些尚未得到很好的记载和了解。最近开始出现的一种代码注入攻击是 XPath 注入攻击,它利用了 XPath 解析器的松散输入和容错特性,让心怀不满的人能够在 URL、表单或其他方法上附带恶意的 XPath 查询以获得权限信息的访问权并更改这些信息。

本文考察了通常情况下如何执行 XPath 攻击并提供了一个 Java? 和 XML 环境中的例子。讨论了如何检测这类威胁,考察了如何减轻该威胁,最后讨论了如何应对可疑的入侵。

入门

本文主要介绍代码注入攻击的一种特殊类型:XPath 盲注。如果您不熟悉 XPath 1.0 或需要了解基础知识,请查看 W3 Schools XPath 教程(请参阅 参考资料 中的链接)。您还可以在 developerWorks 上找到大量的关于在各种语言环境中使用 XPath 的文章(请参阅 参考资料 中的链接)。本文使用的示例主要针对 XPath 1.0,但是也可用于 XPath 2.0。XPath 2.0 实际上增加了您可能遇到的问题。

本文还提供了用于处理 Java JDK 5.0 的 Java 代码示例。同时本文的概念和主题是跨平台的,如果您的应用程序使用 XPath 获取特殊的代码示例,那么您必须使用 JDK 5.0。

代码注入

一种更常见的对 Web 应用程序的攻击和威胁是某种形式的代码注入,Wikipedia 将其定义为:

……利用系统没有对其输入进行强制执行或检查的假设向计算机系统中引入(或 “注入”)代码的技术。注入代码的目的通常是绕过或修改程序的最初目标功能。如果被绕过的功能涉及系统安全,那么结果可能是灾难性的。

快速浏览任何相关 Web 站点(比如 Web Application Security Consortium 或 Security Focus,请参阅 参考资料 中的链接)都会显示很多使用某种形式的代码注入进行的攻击,从 JavaScript 到 SQL 注入再到其他形式的代码注入攻击。最近开始出现的一种威胁(最初由 Amit Klein 于 2004 年在一篇论文中概述)是 XPath 盲注攻击(请参阅 参考资料)。这种攻击的运作跟 SQL 盲注攻击几乎完全相似,与 SQL 注入攻击不同的是,几乎没什么人了解 XPath 盲注攻击或对其进行预防。与 SQL 注入攻击类似,如果使用最佳实践开发安全的应用程序,通常可以轻松地处理该威胁。

XPath 攻击

一般说来,大多数 Web 应用程序使用关系数据库存储和检索信息。例如,如果您的 Web 站点需要身份验证,那么您可能拥有一个 users 表,其中包含惟一 ID、登录名、密码,也许还有一些其他信息,比如角色。从 users 表中检索用户的 SQL 查询可能类似于清单 1。

清单 1. 从 users 表中检索用户的 SQL 查询Select * from users where loginID='foo' and password='bar' 在这个查询中,用户必须提供 loginID 和 password 作为输入。如果攻击者在 loginID 字段中输入:' or 1=1 并在 password 中输入:' or 1=1,则形成的查询将类似清单 2。

清单 2. 从攻击者输入形成的查询Select * from users where loginID = '' or 1=1 and password=' ' or 1=1这个条件会一直匹配,因此攻击者可以进入系统。XPath 注入的原理大体类似。但是,假设您拥有的不是一个 users 表,而是一个 XML 文件,其中包含了如清单 3 所示的用户信息。

清单 3. user.xml<?xml version="1.0" encoding="UTF-8"?>
<users>
<user>
<firstname>Ben</firstname>
<lastname>Elmore</lastname>
<loginID>abc</loginID>
<password>test123</password>
</user>
<user>
<firstname>Shlomy</firstname>
<lastname>Gantz</lastname>
<loginID>xyz</loginID>
<password>123test</password>
</user>
<user>
<firstname>Jeghis</firstname>
<lastname>Katz</lastname>
<loginID>mrj</loginID>
<password>jk2468</password>
</user>
<user>
<firstname>Darien</firstname>
<lastname>Heap</lastname>
<loginID>drano</loginID>
<password>2mne8s</password>
</user>
</users> 在 XPath 中,类似于 SQL 查询的语句如清单 4 所示。

清单 4. 匹配 SQL 查询的 XPath 语句//users/user[loginID/text()='abc' and password/text()='test123']要执行类似的攻击以绕过身份验证,您可能会使用类似清单 5 的方法。

清单 5. 绕过身份验证//users/user[LoginID/text()='' or 1=1 and password/text()='' or 1=1]您可能在 Java 应用程序中有一个诸如 doLogin 之类的方法,使用 清单 3 中的 XML 文档再次执行身份验证。可能类似于清单 6。

清单 6. XPathInjection.javaimport java.io.IOException;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import javax.xml.parsers.*;
import javax.xml.xpath.*;

public class XpathInjectionExample {

public boolean doLogin(String loginID, String password)
throws ParserConfigurationException, SAXException,IOException,
XPathExpressionException {

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("users.xml");

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("//users/user[loginID/text()='"+loginID+"'
and password/text()='"+password+"' ]/firstname/text()");
Object result = expr.evaluate(doc, XPathConstants.NODESET);
NodeList nodes = (NodeList) result;
//print first names to the console
for (int i = 0; i < nodes.getLength(); i++) {
System.out.println(nodes.item(i).getNodeValue());}

if (nodes.getLength() >= 1) {
return true;}
else
{return false;}
}
}对于 清单 6,如果您传入一个 login 和 password,比如 loginID = 'abc' 和 password = 'test123',则该类将返回 true(而且就本例而言,还会打印一列 first name 到控制台)。例如,如果您传入类似 ' or 1=1 or ''=' 的值,那么您也会得到 true 返回值,因为 XPath 会最终发现字符串变成了类似清单 7 的样子。

清单 7. 字符串//users/user[loginID/text()='' or 1=1 or ''='' and password/text()='' or 1=1 or ''='']这个字符串会在逻辑上使查询一直返回 true 并将一直允许攻击者访问系统。

另一种可能性更大而且可能更加麻烦的 XPath 攻击方式是,攻击者可以利用 XPath 在应用程序中动态地操作 XML 文档。

提取 XML 文档结构

用于绕过身份验证的查询还可以用于提取 XML 文档的信息。假设攻击者猜测 XML 文档中第一个子节点的名称是 loginID 并且想要确认一下。攻击者可以提供清单 8 所示的输入。

清单 8. 攻击者提供的输入abc' or name(//users/LoginID[1]) = 'LoginID' or 'a'='b 与 清单 7 中的 1=1 不同,清单 8 中给出的表达式检查第一个子节点的名称是否为 loginID。形成的查询如清单 9 所示。

清单 9. 查询String(//users[LoginID/text()='abc' or name(//users/LoginID[1]) =
'LoginID' or 'a=b' and password/text()='']) 用试凑法,攻击者可以检查 XML 文档的各个子节点并通过查看这个 XPath 表达式是否能促成成功的身份验证以收集信息。攻击者然后可能编写出一个简单的脚本,发送各种 XPath 注入并从系统中提取 XML 文档,如 Klein 的论文中提及的那样。

XPath 注入预防

因为 XPath 注入攻击与 SQL 注入攻击非常类似,所以很多预防方法也类似。这些预防方法中,多数也可以类似地应用于预防其他类型的代码注入攻击。

身份验证

不论面对何种应用程序、环境或语言,都应遵守以下的最佳实践:

假定所有输入都可疑。
不仅要验证数据的类型,还要验证其格式、长度、范围和内容(例如,一个简单的正则表达式 if (/^"*^';&<>()/) 就可以找出大多数可疑的特殊字符)。
在客户机和服务器上都要验证数据,因为客户机验证非常容易绕过。
根据安全软件开发的最佳实践,遵守一致的编写和 [missing word] 策略实现应用程序安全性(请参阅 参考资料 中 Apache 的优秀 Web 服务列表)。
在发布应用程序之前测试已知的威胁。参考资料 中的 “Fuzz Testing” 介绍了测试方法。
参数化

与多数数据库应用程序不同,XPath 不支持参数化查询的概念,但是您可以使用其他 API(比如 XQuery)模拟该概念。您不需要构建字符串表达式,然后传给 XPath 解析器以便在运行时动态执行(如清单 10 所示),而是通过创建保存查询的外部文件使查询参数化(如 清单 11 所示)。

清单 10. 传给 XPath 解析器的字符串"//users/user[LoginID/text()=' " + loginID+ " ' and password/text()='
"+ password +" ']" 在清单 11 中,通过创建保存查询的外部文件使查询参数化。

清单 11. dologin.xqdeclare variable $loginID as xs:string external;
declare variable $password as xs:string external;//users/user[@loginID=
$loginID and @password=$password]对 清单 11 稍加修改,也可以完成同样的功能,如清单 12 所示。

清单 12. XQuery 片段Document doc = new Builder().build("users.xml");
XQuery xquery = new XQueryFactory().createXQuery(new File("
dologin.xq"));
Map vars = new HashMap();
vars.put("loginid", "abc");
vars.put("password", "test123");
Nodes results = xquery.execute(doc, null, vars).toNodes();
for (int i=0; i < results.size(); i++) {
System.out.println(results.get(i).toXML());
}这样可以防止重要的显式变量 $loginID 和 $password 在运行时被作为可执行表达式处理。这样就分开了执行逻辑与数据;遗憾的是,查询参数化并不是 XPath 功能的一部分,但是可以从 SAXON 之类的开源解析器中免费获取(请参阅 参考资料 中的链接)。某些其他解析器支持这种功能,而且它可以作为防止 XPath 注入的一种可靠方式。

Web 服务器上的数据检查

要防止 XPath 注入和其他形式的代码注入,应该检查所有从 Web 服务器传到后端服务的数据。例如,对于 Apache 您可以使用 Mod_Security 筛选器(比如 SecFilterSelective THE_REQUEST "(\'|\")")查找字符串中的单引号和双引号并禁止它们。您也可以使用同样的方法筛选和禁止其他形式的特殊字符,比如 ("*^';&><</),这些字符都可以用于各种注入攻击。这种方法对于使用基于 REST 或 SOAP 的 XML 服务的应用程序可能很好,但是在其他情况下可能不适用。通常的最佳实践是,从最初的设计到应用程序实现都采用智能安全设计。

如果系统被破坏了怎么办?

大多数组织都考虑到了威胁检测和威胁拒绝,但很少为此作出规划,对于一名合格的安全专家,如果系统遭到破坏怎么办。您应该总是假定最坏的场景并作出规划。

这在很大程度上取决于组织和遭遇入侵的系统类型,但通常的最佳方法是,让系统脱机并等待专业的论证工程师检查系统。有时人们直接让系统脱机并重映像驱动器,但是这种做法消除了入侵的证据和入侵者可能给系统造成的其他损害的信息。如果可能的话,一直保留系统状态以待安全专家检查。

分享到:
评论

相关推荐

    XPath注入漏洞利用工具XPath-XCat.zip

    XCat是一个命令行程序,用于辅助XPath注入漏洞的利用。XCat使用Python编写并开放源代码。XCat正常使用需要python的SimpleXMLWriter模块。 标签:XPath

    Xpath注入攻击及其防御技术研究

    ### Xpath注入攻击及其防御技术研究 #### 一、Xpath注入攻击概述 XPath是一种用于在XML文档中查找信息的语言,它提供了强大的功能来定位、提取数据。然而,这种强大的功能也使得XPath成为攻击者利用的目标之一。...

    测试XPath注入.docx

    测试XPath注入 XPath 注入是指攻击者通过提交恶意的 XPath 查询来破坏应用程序的逻辑或获取未授权访问的数据的安全漏洞。XPath 是一种用于导航 XML 文档并从中获取数据的解释型语言。许多时候,一个 XPath 表达式...

    XPath-Injection:XPath注入脚本

    XPath注入是一种针对XML数据的攻击方式,通过构造恶意的XPath表达式来欺骗应用程序,获取未经授权的数据或者执行非预期的操作。这种攻击通常发生在应用接受用户输入的XPath查询,并直接用于解析XML文档时。在这个名...

    xxxpwn:高级 XPath 注入工具

    xxxpwn : XPath 过滤扩展工具 : 专为盲优化 XPath 1 注入攻击而设计 xxxpwn 使用各种 XPath 优化来查询来自存在 XPath 注入的位置提供的后端 XML 文档的自定义信息。 默认情况下,它会尝试检索整个远程数据库,尽管...

    X-path注入.pdf

    XPath注入攻击是一种针对使用XML(可扩展标记语言)作为数据交换格式的web服务和互联网应用的攻击方式。由于XML在数据管理、数据传输方面的广泛使用,它成为了黑客攻击的一个目标。黑客可以利用XPath注入技术操纵...

    xcat:XPath注入工具

    XCat是一个命令行工具,可以利用和调查XPath盲注漏洞。 有关完整的参考,请阅读此处的文档: : 它支持大量功能: 自动选择注射(运行xcat injections以获得列表) 检测xpath解析器的版本和功能,并选择最快的...

    Xpath生成器,自动生成XPATH,C#版

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,它是W3C组织制定的一种标准查询语言,用于选取XML文档中的节点,包括元素、属性、文本等。在本项目“Xpath生成器,自动生成XPATH,C#版”中,开发者...

    XPath Helper版本2.0.2

    XPath Helper是一款非常实用的工具,尤其对于Web开发者和数据抓取者来说,它极大地简化了在网页中查找和提取信息的过程。版本2.0.2是这个插件的一个更新,旨在提供更稳定、高效的功能。XPath(XML Path Language)是...

    Xpath指南XPATH实例

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,包括元素、属性、文本等。XPath基于W3C标准,为XML处理提供了一种强大而灵活的方式。以下是对“XPath指南”中...

    IE下获取XPATH小工具源码_xpath_

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,如元素、属性、文本等。在IE浏览器下,为了方便开发者获取XML或HTML文档中的XPath路径,存在一种小工具,本文将...

    谷歌浏览器XPath2.0插件

    XPath(XML Path Language)是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,比如元素、属性和文本等。XPath 2.0是XPath的第二个主要版本,增加了更多的功能和优化。 在没有XPath Helper的...

    Xpath生成器,自动生成可用的Xpath。

    Xpath生成器,可以通过输入的文件,进行匹配,生成全部可用的Xpath,犹豫HTML中部分标签允许无结束,如:("LINK" ,"META","SCRIPT","IMG" ,"INPUT", "FORM")故已经被忽略,如有朋友发现其中有问题,请告诉我哦...

    xpath-helper.zip

    本压缩包文件"xpath-helper.crx"很可能是一个Chrome浏览器的扩展程序,旨在提供实时的XPath查询支持。 XPath(XML Path Language)是一种在XML文档中查找信息的语言,它允许我们通过路径表达式来选取节点,如元素、...

    XPath教程

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,包括元素、属性、文本等。XPath基于W3C标准,其1.0版本是XPath语言的基础,提供了强大的查询和导航功能。本教程...

    XPath 测试工具 快速XPath测试

    4. **命名空间处理**:在处理包含命名空间的XML时,需正确处理命名空间前缀和声明,以避免选取错误的节点。 5. **函数和运算符**:熟练运用XPath提供的各种函数和运算符,如字符串处理、数值计算和逻辑判断。 使用...

    火狐老版本+xpath插件(适合python+xpath爬虫使用)

    此外,XPath插件还能够帮助开发者检查和验证所编写的XPath表达式的正确性,避免因路径错误导致的爬取失败。在实际项目中,面对结构复杂的网页,这种即时反馈的能力尤为宝贵。 总的来说,这个压缩包提供的火狐老版本...

    XPathHelper_2.0.2_xpath_

    XPathHelper 2.0.2 版本专注于XPath的查询与应用,特别适合于Web自动化测试和网页数据抓取。 XPath在Web开发中的主要用途有以下几点: 1. **元素定位**:XPath允许开发者通过路径表达式来选取XML或HTML文档中的...

    xpath定位,xpath定位,xpath定位

    Selenium xpath,

    xpath 依赖包及开发手册

    Jaxen 1.1.2稳定版意味着它已经过充分测试,适合在生产环境中使用,避免了可能的不稳定性和bug。 DOM4J是另一个与Jaxen密切相关的库,它是一个灵活的处理XML、DOM和SAX的Java库。DOM4J提供了丰富的API,使开发人员...

Global site tag (gtag.js) - Google Analytics