xml external entity injection
xml外部实体注入
xml是可扩展的标记语言,涉及被用来传输、存储数据
html被用来显示数据
其中xml的标签没有预定义的,允许作者自己定义标签和文档结构。
以上实例包含 XML 版本(
UTF-8 也是 HTML5, CSS, JavaScript, PHP, 和 SQL 的默认编码。
文档类型定义DTD(document type definition),是下面文档元素的规定可以叫约束,定义了格式
<!DOCTYPE note SYSTEM "Note.dtd">DOCTYPE 声明是对外部 DTD 文件的引用
其中我们能利用的是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