一、先认识XML XML有两个先驱——SGML(标准通用标记语言)和html(超文本标记语言),这两个语言都是非常成功的标记语言。SGML多用于科技文献和政府办公文件中,SGML非常复杂,其复杂程度对于网络上的日常使用简直不可思议。HTML
XML有两个先驱——SGML(标准通用标记语言)和html(超文本标记语言),这两个语言都是非常成功的标记语言。SGML多用于科技文献和政府办公文件中,SGML非常复杂,其复杂程度对于网络上的日常使用简直不可思议。HTML免费、简单,已经获得了广泛的支持,方便大众的使用。而XML(可扩展标记语言)它既具有SGML的强大功能和可扩展性,同时又具有HTML的简单性。
XML注入攻击也称为XXE(XML External Entity attack)漏洞,XML文件的解析依赖于libxml库,libxml 2.9及以前的版本默认支持并开启了外部实体的引用,服务端解析用户提交的XML文件时未对XML文件引用的外部实体(含外部普通实体和外部参数实体)进行合适的处理,并且实体的URL支持file://和PHP://等协议,攻击者可以在XML文件中声明URI指向服务器本地的实体造成攻击。
XXE漏洞一旦被攻击者利用,可以读取服务器任意文件、执行任意代码、发起DDos攻击。
在XML中引入外部实体一定要注意其安全性,需要进行严格的检查,或者禁止引入。
(1)对用户的输入进行过滤,如<、>、"、"、&等。
(2)常见的XML解析方法有DOMDocument、SimpleXML、XMLReader,这三者都基于libxml库解析XML,所以均受影响。xml_parse()函数则基于expact解析器,默认不载入外部DTD,不受影响。可以在php解析XML文件之前使用libxml_disable_entity_loader(true)来禁止加载外部实体(对上述三种XML解析组件都有效),并使用libxml_use_internal_errors()禁止报错。
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息 ,而 XML 旨在传输信息。
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。 DTD如果存在那么一定会被包裹在 DOCTYPE 声明中 ,DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。不过,XML对于标记的语法规定比HTML要严格地多
举子:<衣服 品牌=“耐克” 类型=“T恤” >
XML声明:
内部DTD声明:
在DTD中定义属性:
外部实体声明:
xml包括xml声明、文档类型定义(可选)、文档元素,如下图所示:
XML注入攻击和sql注入攻击的原理一样,利用了XML解析机制的漏洞,如果系统对用户输入"<",">"没有做转义的处理,攻击者可以修改XML的数据格式,或者添加新的XML节点,就会导致解析XML异常,对流程产生影响。
XML外部实体注入(XML External Entity)简称XXE漏洞。
XXE:XML External Entity 即外部实体,从安全角度理解成XML External Entity attack 外部实体注入攻击,由于程序在解析输入的XML数据时,解析了攻击者伪造的外部实体而产生的。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
1、 利用外部实体的引用功能实现对任意文件的读取
这个是解析的xml文件,我们定义了一个通用实体,并且在文件中去引用这个实体。
passWord.txt文件中记录了敏感的一些信息。
具体解析代码
2. 使用参数实体和避免XML解析语法错误,构造恶意的实体解析
使用参数实体和
XML文件:构造参数实体 % start;% Goodies;% end;% dtd 定义一个恶意的combine.dtd
恶意DTD combine.dtd中定义实体&all;
甚至可以这样构造恶意的DTD combine.dtd,将结果发送到目标地址,最后会获得file:///etc/fstab文件。
拒绝服务攻击
下面恶意的XML内部实体解析,占用服务器内存资源,导致拒绝服务攻击。
内部实体扩展攻击最好的防护措施是禁止DTDs的解析。另外也可以对内部实体数量进行限制,以消减内部实体 展攻击发生的可能性。所以在不需要使用内部实体时,应该禁止DTDs解析,需要使用内部实体时,严格限制内部实体的数量及xml内容的大小。
]>
]>
在pikachu靶场中,以xxe漏洞举例:
XXE -"xml external entity injection"
既"xml外部实体注入漏洞"。
概括一下就是"攻击者通过向服务器注入指定的xml实体内容,从而让服务器按照指定的配置进行执行,导致问题"
也就是说服务端接收和解析了来自用户端的xml数据,而又没有做严格的安全控制,从而导致xml外部实体注入。
现在很多语言里面对应的解析xml的函数默认是禁止解析外部实体内容的,从而也就直接避免了这个漏洞。
以PHP为例,在PHP里面解析xml用的是libxml,其在≥2.9.0的版本中,默认是禁止解析xml外部实体内容的。
在任意在文本框中输入一个数据:a
提示: XML声明、DTD文档类型定义、文档元素这些都搞懂了吗?
也可以使用抓包工具对其抓包,如下,发现提交的数据使用了xml格式,初步判断存在漏洞
在文本框中输入xml语句:
]>
构造payload,通过外部实体获取后台数据库的本地信息
]>
来源地址:https://blog.csdn.net/weixin_45095113/article/details/127571102
--结束END--
本文标题: xml注入漏洞
本文链接: https://lsjlt.com/news/391022.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0