草庐IT

禁用XXE处理漫谈

蚁景科技 2023-03-28 原文

前言

近期准备面试题时,XXE漏洞防范措施(或者说修复方式)在一些文章中比较简略,故本文根据研究进行总结,作为技术漫谈罢了。

简述

XXE漏洞

XXE(XML外部实体注入),程序解析XML数据时候,同时解析了攻击者伪造的外部实体。XML用途是为了跨平台语言传输数据,常常用于WEB开发等。

XXE漏洞攻防情况

通常来说,XML文档生成时会常用到XXE和内部实体。因此开发团队根据项目需求去进行防范XXE漏洞。

然而实际情况是,即使采取了防范措施(错误的方法),XXE漏洞仍然可以大行其道。

有一个案例,某开发团队针对CVE-2018-20318漏洞进行了及时的修复,依照的是官方的修复方案:

禁止实体扩展引用,dbFactory.setExpandEntityReferences(false)

然而后续XXE漏洞仍然可以奏效,有师傅又提交了CVE漏洞。

最后有师傅总结正确的修复方法,如下:

禁用XXE处理分析

根据上述所说,XXE漏洞的正确处理是尤为重要的。我们这里以Java为例,并且应用偏向于JAXP API进行分析如何禁用XXE处理。

禁用文档类型

首先可以禁用文档类型。实体通过XML 文档的 DOCTYPE 进行声明。

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

我们在进行安全开发规划时,如确定不需要 DOCTYPE 声明时,可以完全禁用禁用文档类型。

factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

当我们设置为true时,disallow-doctype-decl 使XML处理器发现DOCTYPE 声明时抛出异常。

禁用外部实体声明

其次是可以允许声明DOCTYPE,但禁用外部实体声明。

故若想要正常处理其他DTD声明,只针对外部实体进行抛出异常。可以用下面两种方法设置为flase来处理:

factory.setFeature("http://xml.org/sax/features/external-general-entities", false);factory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);

补充说明:在PHP中,libxml库默认下是安全的,总是禁用外部实体。除非通过设置LIBXML_NOENT参数进行允许。如下:

$doc = simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOENT); // !XXE enabled!$doc = simplexml_load_string($xml, "SimpleXMLElement"); // XXE disabled

启用安全处理

在Java中可以使用Feature for Secure Processing (FSP)进行安全处理。如下:

factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

FSP属于一种核心Java机制,用于以应用限制去配置XML处理器,从而可以防范XML拒绝服务攻击和XXE漏洞。

默认设置下,FSP处于部分启用的状态,XML拒绝服务攻击可以防范。而XXE漏洞我们需要通过调用setFeature方法,将FSP由部分启用转为完全启用。

不过也有特例,例如Apache Xerces中FSP不限制外部连接,无法防范XXE漏洞。

总之,开发人员应当测试涉及XXE漏洞的FSP配置,并结合其他方式来禁用或者限制XXE。

禁用实体引用扩展

XML文档中寻找实体引用主要有两种方式:

(1)DOM XML解析器作值替换引用

(2)DOM树创建空实体进行引用

将实体作值替换的机制在解析恶意XML文件时,可能会泄露敏感信息。

在Java中,对象DocumentBuilder中的etExpandEntityReferences方法用于配置实体引用:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setExpandEntityReferences(false);

当配置为false时,不会进行实体引用。因而可以防范XXE漏洞。

扩展外部实体引用是发生在已提取外部内容之后。

因此禁用后且攻击者无法造成泄露敏感数据,仍然执行请求外部资源。

不过经过禁用实体引用扩展,攻击者仅能进行blind SSRF攻击,难以实际造成威胁。

所以禁用实体引用扩展也是我们防范XXE漏洞的可选方案。

结束语

本文为XXE漏洞相关的防范措施漫谈,主要针对禁用XXE处理。

可以采取禁用文档类型、禁用外部实体声明、启用安全处理、禁用实体引用扩展这四种方式去进行防范。

更多靶场实验练习、网安学习资料,请点击这里>>

 

有关禁用XXE处理漫谈的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

  3. ruby-on-rails - 禁用设备的 :confirmable on-the-fly to batch-generate users - 2

    Devise是一个Ruby库,它为我提供了这个User类:classUser当写入:confirmable时,注册时会发送一封确认邮件。上周我不得不批量创建300个用户,所以我在恢复之前注释掉了:confirmable几分钟。现在我正在为用户批量创建创建一个UI,因此我需要即时添加/删除:confirmable。(我也可以直接修改Devise的源码,但我宁愿不去调和它)问题:如何即时添加/删除:confirmable? 最佳答案 WayneConrad的解决方案:user=User.newuser.skip_confirmation

  4. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  5. ruby - Faye WebSocket,关闭处理程序被触发后重新连接到套接字 - 2

    我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d

  6. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

    我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

  7. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  8. ruby-on-rails - 如何在 Rails 3 中禁用 XML 解析 - 2

    我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::

  9. ruby-on-rails - Rails 处理 .Erb 与 Nils - 2

    当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/

  10. ruby-on-rails - 如何在多个环境中处理 OmniAuth 回调? - 2

    我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l

随机推荐