【问题标题】:How to avoid XML injection如何避免 XML 注入
【发布时间】:2008-12-12 16:06:48
【问题描述】:

我有用于形成 XPath 查询的输入字段值。 我应该检查输入字符串中的哪些符号以最大程度地减少 XML 注入的可能性?

【问题讨论】:

    标签: .net xml


    【解决方案1】:

    这个document 详细描述了“盲 XPath 注入”的概念。

    它提供了 XPath 注入的具体示例并讨论了防止这种情况的方法。

    在“防御 XPath 注入”一节中说:

    "防御 XPath 注入本质上类似于防御 SQL 注射。应用程序必须清理用户输入。具体来说,单双 引号字符应该是不允许的。这可以在应用程序中完成 本身,或在第三方产品中(例如应用程序防火墙)。 测试应用程序对 XPath 注入的敏感性可以通过以下方式轻松执行 注入单引号或双引号,并检查响应。如果有错误 发生了,那么很可能 XPath 注入是可能的。”

    正如其他人所说,还应注意使用轴和 // 缩写。如果正在使用XPath 2.0,则不应允许使用doc() 函数,因为它可以访问任何具有已知URI(或文件名)的文档。

    建议使用预编译 XPath 表达式的 API,但保留它与动态定义的参数或变量一起工作的可能性。那么用户输入将只定义这些参数的内容,永远不会被视为对已编译表达式的修改。

    【讨论】:

    • 在我看来——就像 SQL 注入一样——使用 XPath 变量几乎可以防止注入。
    • 您能否提供一个示例,说明如何在 XPath 表达式中提供“动态定义的变量”?具体来说,如何在 .NET 中做到这一点?我只看到它通过字符串连接完成。
    • 谢谢 - 我相信这个例子适用于 XSLT 转换。可以对简单的 XPATH 表达式做同样的事情,比如 SelectSingleNode()?
    • @frankadelic:IXSLTContext 用于设置评估 XPath 表达式的上下文,名称具有误导性。
    【解决方案2】:

    颠覆你的策略。

    不要试图过滤掉不可接受的字符 - “假设它没问题,除非我知道它不好”

    相反,过滤可接受的字符 - “这东西没问题,我会假设其他一切都不好”的策略

    在安全方面,采用“默认拒绝”而不是“默认接受”的策略

    例如...

    ...如果您要向某人询问搜索词,请说出一个人的名字,请将输入限制为您希望在姓名中找到的字符。

    一种方法是限制为 A-Z,然后确保您的搜索技术能够识别重音(例如 i = ì = í = î = ï 等等),尽管这取决于非欧洲命名。

    ...如果您要一个数字,请限制为数字并拒绝其他所有内容。

    【讨论】:

      【解决方案3】:

      我会先考虑什么是您的特定用例的有效输入,然后,看看限制其他所有内容的方法。如果您有固定范围的条目值,我会将条目限制为这些值。否则,如果您的用例要求您考虑未来,那么您可能需要检查轴修饰符和路径分隔符,例如 :\

      【讨论】:

        【解决方案4】:

        这取决于您所说的“XML 注入”是什么意思。文档中是否有敏感部分不允许用户查看?或者您是否将其作为可写状态打开并允许用户更新文档的某些部分,而他们应该只被允许更新某些部分?

        在基本层面上,要回答您的问题,您至少需要查找 xpath 轴操作(例如 ///::)和通配符(@**)。但我的感觉是,直接使用用户输入来构建xpath可能不是最优的解决方案。如果您向我们提供更多关于您想要实现的目标的背景信息,我们可能会建议替代方法?

        【讨论】:

          【解决方案5】:

          关闭此漏洞只是一个修补程序。所以现在应用“默认拒绝”策略太危险了。 我决定检查以下符号的输入 [,",',*,=,{,\,.,space。我认为这可以防止最常见的攻击 谢谢大家的解答!

          【讨论】:

          • 啊,你(或你的继任者)以后会后悔的那种修补程序......en.wikipedia.org/wiki/Technical_debt
          • 将它们转义或编码为 html 实体的重要符号是 以及系统用来转义的符号 / \ 、联合 | ,或终止; , .并封装“'[{}]`xml有很多安全问题,即使框架不使用它,它也可以用来破解存储子系统。它是极少数需要的语言之一没有在web服务器上使用。谷歌和Facebook有XML漏洞。外部实体攻击和xpath攻击。这里是一个由php-xml模块引起的漏洞:youtube.com/watch?v=G1JUQrqK4IE
          • XML-RPC 是针对您的 Wordpress 网站的攻击的常见区域:youtube.com/watch?v=xz2wo9Wwkog
          • 其他内容,例如在末尾添加查询或像 //website.com/page.php?id=1 这样的 url 到 //website.com/page.php?id=1 UNION 1 , 2, 3, 4, 5 可能会导致解析器将数据库作为树来查询,从而导致诸如登录帐户之类的私人信息被暴露。并且有一些 CMS 插件会无意中导致这种效果发生。
          【解决方案6】:

          输入字符串的验证会很有帮助,也许,基于不允许特殊字符使用正则表达式(类似这样的 ^\w+)。

          【讨论】:

            猜你喜欢
            • 2011-01-13
            • 1970-01-01
            • 2011-06-28
            • 2011-08-16
            • 1970-01-01
            • 2017-12-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多