https://owasp.org/www-project-top-ten
XXE基础
xxe外部实体注入
外部实体
xml(用于传输和存储数据)
html(用于显示数据)
注入:
SQL注入:用户输入数据被当做代码执行
1输入点
2.输入数据可以结合到数据库当中
什么是XML?
XML是可扩展标记语言(EXtensible MarkupLanguage),XML是独立于软件和硬件的信息传
输工具。
XML的特点:
1.是一种可扩展标记语言
2.被设计来进行数据传输
3.标签没有被预定义,需要自行定义标签(如)<pwj>标签自定义,但需成对出现</pwj>
4.具有层级结构
5.具有自我描述性
XML作用:
1.简化数据共享
2.简化数据传输
3.简化平台变更
4.使数据更加有用
5.把数据从HTML分离
XML和HTML之间的差异:
XML:用来传输和存储数据,其焦点是数据的内容,旨在传输信息
HTML:用来显示数据,其焦点是数据的外观,旨在显示信息。
XML数据格式组成:
1.元素/节点
a.根元素:有且必须只有一个根元素
b.子元素:可以嵌套,可以重复
c.每个元素必须成对出现
2.属性
a.每个元素/节点可以有多个属性
b.属性以键值对的方式出现:名称=”值”。属性的值添加双引号,多个属性以空格分
开。
3.实体DTD
<bookstore>
<book category="cookING"> 属性要以键值对的形式书写key="value",value值要带有""
然后就是元素要成对出现,包括<author>,<year>,<price>这些都是成对出现的<title lang="en">EverydayItalian</title><author>Giada De Laurentiis</author><year>2025</year><price>30.00</price>
</book>
<book category="CHILDREN"><title lang="en">Harry Potter</title><author>)K.Rowling</author><year>2025</year><price>29.99</price>
</book>
<book category="WEB"><title lang="en">Learning XML</title><author>Erik T.Ray</author><year>2023</year><price>39.95</price>
</book>
语法规范:
1.开闭合元素一致大小写敏感
2.属性值必须加引号,单双都可
3.标签必须正确嵌套
4.XML中空格会被保留,不像html中只保留一个
注意:
XML不会做任何事情,仅仅是纯文本,有能力处理纯文本的软件都可以处理XML。我们
需要编写软件或者程序,才能传送、接收和显示出这个文档。(造成该漏洞的原因只有攻击者恶意使用)
DTD实体
1.定义:
DTD全称是Thedocumenttypedefinition,即是文档类型定义,可定义合法的xML文档构
建模块。它使用一系列合法的元素来定义文档的结构。DTD可被成行地声明于XML文档
中,也可作为一个外部引用。
2.DTD分类
(1)内部DTD
1.内部的DOCTYPE声明
语法格式:<!DOCTYPE内部实体名称(根元素名称)[
元素声明
]>
内部DTD<?xml version="1.0"?> //<?php ?>与PHP语法声明方式一致
<!DOCTYPEnote[ //!DOCTYPE note定义此文档是 note类型的文档<!ELEMENTnote(to,from,heading,body)> //!ELEMENTnote定义note元素有四个元素:"to,from,heading,body"<IELEMENT to (#PCDATA)> //IELEMENT to定义to元素为 “#PCDATA"类型<!ELEMENT from (#PCDATA)> //!ELEMENTfrOm定义frOm元素为“#PCDATA"类型<IELEMENT heading (#PCDATA)> //IELEMENT heading定义heading元素为“#PCDATA"类型<!ELEMENT body (#PCDATA)> //!ELEMENT body定义body元索为"#PCDATA"类型
]>
<note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body>
</note>
(2)外部DTD
DTD位于XML源文件的外部
语法格式:<!DOCTYPE外部实体名称SYSTEM、PUBLIC(根元素名称)“URI/URL>
外部DTD<?xmlversion="1.e"?>
<IDOCTYPEnoteSYSTEM"note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reninder</heading>
<body>Don't forget the meetingl</body>
</note>//这是位于xML源文件的外部的DTD“note.dtd"文件,外部这里的语法格式和内部都是相同的
<!ELEMENTnote(to,from,heading,body)>
<!ELEMENT to(#PCDATA)>
<!ELEMENT from (#PCDATA)>
<IELEMENT heading(#PCDATA)>
<IELEMENT body (#PCDATA)>
外部与内部的区别在于引用时,内部是将所有文件都放在了xml里面,而外部是只进行了文件的引用在" "中写入了文件名称让计算机能找到这个文件后再进行引用。
DTD实体
1.实体定义:实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。
(1)内部实体:
语法:<!ENTITY entity-name"entity-value">
内部实体<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyrightrunoob.com"> 实体名称 copyright 和实体值Copyrightrunoob.com从哪里开始引用XML 实例:
<author>&writer;©right;</author> 通过$符号开始引用,引用名称
(2)外部实体
语法:<lENTITY entity-name SYSTEM “URI/URL'>
外部实体<!ENTITYwriter SYSTEM"http://www.xxx.com/xxx.dtd">
<!ENTITYcopyright SySTEM"http://ww.xxx.com/xxx.dtd">XML example:
<author>&uriter;$copyright;</author> 同样使用$符号进行引用
$引用实体名称并没有区分内外部,要区分会出现在内容不一样时
关键字:
system:表示实体来自本地计算机
public:表示实体来自公共计算机
支持协议类型:
外部引用不同版本支持协议不同,具体如下:
libxml2 | PHP | JAVA | .NET |
file http ftp | file http ftp php compress.zlib compress.bzip2 data glob phar | http https ftp file jar netdoc mailto gopher * | file http https ftp |
.net 就是aspx , 我们常说的webshell就是网站使用的语言根据不同的语言所支持的不同协议来编写的
(3)参数实体
语法:<!ENTITY %实体名称[SYSTEM]"URL'>
参数实体实例:
参数实体<!DOCTYPE author[<!ENTITY % writer "DonaldDuck.">
}>
<author>%writer;</author>
注意:实体引用由三部分构成:一个与号和百分号(&%),一个实体名称,以及一个分号(;)。
PCDATA:解析字符数据。XML的特殊字符(&、<和>)在PCDATA中可以识别,并用于解析元素名称和实体。PCDATA(字符数据)区域被解析器视为数据块,从而允许您在数据流中包含任意字符。
XML与DTD结合
外部实体注入漏洞定义:
XXE(xmlexternalentityinjection)即xml外部实体注入漏洞。XXE是针对应用程序解析XML输
入类型的攻击。也就是说服务端接收和解析了来自用户端的xm数据而又没有做严格的安
全控制。从而导致xm外部实体注入。
攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行导
致问题。
漏洞产生原因:
xxe漏洞核心就是允许了引入外部实体的加载,导致程序在解析xml时,可以加载恶意外
部文件,从而造成文件读取等危害。
漏洞危害:
1.任意文件读取。通过file协议等进行辅助读取源代码/配置文件
2.执行系统命令
3.服务器端请求伪造
a.暴露内部服务。
b.通过端口扫描枚举内部服务。
c.通过元数据实例窃取云凭证。
4. DOS拒绝服务
5.解析器细节可能的影响
a.目录列表(仅适用于JavaSAX解析器)
b.远程代码执行(仅适用于PHP/expects或ASP)
漏洞防范:
1.过滤和验证用户提交的XML数据,过滤关键词<!DOCTYPE、<!ENTITYSYSTEM、PUBLIC等
2.禁用外部实体方法
PHP:
libxml_disable_entity_loader(true);JAVA:
DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);Python:
from lxml import etree
xmlData = etree.parse(xmlsource,etree.xMLParser(resolve_entities=False))
3.禁止XML中包含除自己外声明的DTD
4.有效的措施:配置XMLparser只能使用静态DTD,禁止外来引I入;对于Java来说,直接设置相应的属性值为false即可
5,一个最小的平台,没有任何不必要的功能、组件、文档和样本。删除或不安装未使用的功能和框架。
6.及时审查和更新相关补丁包(漏洞都有针对性,针对某一版本)
7.注意:XXE的造成与libxml库的版本有关,与PHP版本无关。libxml<=2.9.0中,默认启用了外部实体,libxml>2.9.0中默认禁用了外部实体。XXE并不是直接由libxml库造成,libxml库提供了一些XML核心功能,包括禁用外部实体的libxmldisable_entity_loader0函数,SimpleXML库提供了解析XML的函数,SimpleXML库依赖于libxml库。