xxe

mac2022-06-30  72

XXE

xml external entity injection

xml外部实体注入

概述

xml是可扩展的标记语言,涉及被用来传输、存储数据

html被用来显示数据

其中xml的标签没有预定义的,允许作者自己定义标签和文档结构。

组成

声名

<?xml version="1.0" encoding="UTF-8"?>

以上实例包含 XML 版本(

UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。

XML DTD

文档类型定义DTD(document type definition),是下面文档元素的规定可以叫约束,定义了格式

<!DOCTYPE note SYSTEM "Note.dtd">

DOCTYPE 声明是对外部 DTD 文件的引用

文档元素

<note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>

利用

其中我们能利用的是DTD部分引入外部文档

xml文档定义语义约束

有三种方法

DTD内部声名:<!DOCTYPE 根元素 [元素声名]>DTD外部声名:<!DOCTYPE 根元素名称 SYSTEM "外部DTD的URI">其中外部引用支持http、file和ftp等引用公共DTD:<!DOCTYPE 根元素名称 PUBLIC "公用DTD的URI"> <!DOCTYPE note [ <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]>

如果一个接口支持接受xml数据,且没有对xml数据做任何安全上的措施,就可能导致xxe漏洞。

libxml在2.9.0(包含)之后默认禁止解析xml默认实体内容的。

用例

<?xml cersion="1.0"> <!DOCTYPE hack [ <!ENTITY xxe SYSTEM "file:///etc/password"> ]> <hack>&xxe;</hack>

"%name"(参数实体)实在DTD中被引用,而"&name;"是在xml文档中被引用的。

能怎么利用看支持什么协议,具体的参考

https://security.tencent.com/index.php/blog/msg/69

防御

方案一、使用开发语言提供的禁用外部实体的方法 PHP: libxml_disable_entity_loader(true); 其他语言:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

方案二、过滤用户提交的XML数据 关键词:,SYSTEM和PUBLIC。

参考:

https://security.tencent.com/index.php/blog/msg/69

https://zh.wikipedia.org/wiki/XML

https://www.runoob.com/xml/xml-usage.html

转载于:https://www.cnblogs.com/wan-xiang/p/11573542.html

最新回复(0)