XXE篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
2017-01-09 16:42
330 查看
0x01 Brief Description
XXE(XML External Entity) XML外部实体攻击也是常见的web漏洞之一,在学习这个漏洞之前有必要了解一下xml,可以参考w3c的基本介绍,http://www.w3school.com.cn/x.asp
xml(Extensible Markup Language)可扩展性标记语言,被设计用来传输和保存数据。xml也是一种树形的结构,且不同于html,它的所有元素都必须要关闭标签,且xml的标签对大小写敏感,元素的属性值必须加引号括起来,拥有正确语法的 XML 被称为“形式良好”的 XML。通过 DTD 验证的 XML 是“合法”的 XML。
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD可以理解为提供了xml格式的一个描述和限定。这个DTD呢可以来自本身的xml文件中,也可以来自外部。
xml实体呢 则相当于内容占位符,用于内容转义,代表一些重复的或无法通过键盘输入或与xml 规范保留字符相冲突的字符数据。xml的实体类型大概有以下四种:
1.字符实体
2.命令实体
3.外部实体
4.参数实体
xml实体注入攻击主要是利用了外部实体进行攻击。
xml的原意是让这样使用,也是一般程序员是这么使用
然后呢,攻击者一般是通过xml的外部实体结合各种协议来读取服务器上的文件。
像下面这样:
这样就可以利用file协议进行任意文件读取。
当然还有其它的协议例如gopher 、php的filter协议、 java的jar协议等进行攻击。
0x02 Reproduce the vulnerability
构造一个上传页面并将xml文本提交给后台服务器处理,代码如下
参考了rickgray的代码但有不同,自己在测试的时候发现低版本的php默认允许加载外部实体,而高版本的php是不加载外部实体的,要使用LIBXML_NOENT参数才可以解决这个问题,参考了stackoverflow的问题。
更新:XML外部实体的解析,和php版本并无关系,而是和编译时的libxml库版本有关。
我们可以看到,通过实例化一个DOMDocument对象,然后使用loadXML去加载xml,如果我们的提交的xml是这样,那么就会通过file协议去读取passwd文件,如下图
0x03 Vulnerability impact
xxe能做什么
1.文件读取
2.命令执行
3.内网探测和端口扫描
4.文件上传(java应用中的jar包上传)
5.命令执行(php安装了Expect的扩展)
6.dos攻击
0x04 漏洞发掘及利用技巧
白盒测试:查找处理xml的函数,查看处理的xml是否来自用户的输入,即是否可控
黑盒测试:查找可能存在xml处理的入口,例如某些邮件转发服务器支持用户自定义RSS推送功能可以,可以加载外部的xml进行攻击。SVG格式的图片在光栅化的过程导致的xxe。一些系统支持xml的导入,一些支持在线预览的应用例如docx中插入恶意xml进行xxe攻击等。。。
0x05 Avoid And Defense
禁用外部实体或者对外部实体的内容进行过滤
0x06 Reference
1.http://rickgray.me/2015/06/08/xml-entity-attack-review.html
2.https://security.tencent.com/index.php/blog/msg/69
XXE(XML External Entity) XML外部实体攻击也是常见的web漏洞之一,在学习这个漏洞之前有必要了解一下xml,可以参考w3c的基本介绍,http://www.w3school.com.cn/x.asp
xml(Extensible Markup Language)可扩展性标记语言,被设计用来传输和保存数据。xml也是一种树形的结构,且不同于html,它的所有元素都必须要关闭标签,且xml的标签对大小写敏感,元素的属性值必须加引号括起来,拥有正确语法的 XML 被称为“形式良好”的 XML。通过 DTD 验证的 XML 是“合法”的 XML。
文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD可以理解为提供了xml格式的一个描述和限定。这个DTD呢可以来自本身的xml文件中,也可以来自外部。
xml实体呢 则相当于内容占位符,用于内容转义,代表一些重复的或无法通过键盘输入或与xml 规范保留字符相冲突的字符数据。xml的实体类型大概有以下四种:
1.字符实体
2.命令实体
3.外部实体
4.参数实体
xml实体注入攻击主要是利用了外部实体进行攻击。
xml的原意是让这样使用,也是一般程序员是这么使用
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPe root [ <!ENTITY outfile SYSTEM "outfile.xml"> ]> <root><outfile>&outfile;</outfile></root>
然后呢,攻击者一般是通过xml的外部实体结合各种协议来读取服务器上的文件。
像下面这样:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE root [ <!ENTITY content SYSTEM "file:///etc/passwd"> ]> <root><foo>&content;</foo></root>
这样就可以利用file协议进行任意文件读取。
当然还有其它的协议例如gopher 、php的filter协议、 java的jar协议等进行攻击。
0x02 Reproduce the vulnerability
构造一个上传页面并将xml文本提交给后台服务器处理,代码如下
<form method="POST" action=""> <textarea name="keyword" value="" style="width: 500px; height: 300px"></textarea> <input type="submit" value="submit"> </form> <?php $keyword = @$_POST['keyword']; $dom = new DOMDocument(); $dom->loadXML($keyword, LIBXML_NOENT); echo $dom->saveXML();
参考了rickgray的代码但有不同,自己在测试的时候发现低版本的php默认允许加载外部实体,而高版本的php是不加载外部实体的,要使用LIBXML_NOENT参数才可以解决这个问题,参考了stackoverflow的问题。
更新:XML外部实体的解析,和php版本并无关系,而是和编译时的libxml库版本有关。
我们可以看到,通过实例化一个DOMDocument对象,然后使用loadXML去加载xml,如果我们的提交的xml是这样,那么就会通过file协议去读取passwd文件,如下图
0x03 Vulnerability impact
xxe能做什么
1.文件读取
2.命令执行
3.内网探测和端口扫描
4.文件上传(java应用中的jar包上传)
5.命令执行(php安装了Expect的扩展)
6.dos攻击
0x04 漏洞发掘及利用技巧
白盒测试:查找处理xml的函数,查看处理的xml是否来自用户的输入,即是否可控
黑盒测试:查找可能存在xml处理的入口,例如某些邮件转发服务器支持用户自定义RSS推送功能可以,可以加载外部的xml进行攻击。SVG格式的图片在光栅化的过程导致的xxe。一些系统支持xml的导入,一些支持在线预览的应用例如docx中插入恶意xml进行xxe攻击等。。。
0x05 Avoid And Defense
禁用外部实体或者对外部实体的内容进行过滤
0x06 Reference
1.http://rickgray.me/2015/06/08/xml-entity-attack-review.html
2.https://security.tencent.com/index.php/blog/msg/69
相关文章推荐
- xss篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
- CSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
- SSRF篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
- sqli篇-本着就了解安全本质的想法,尽可能的用通俗易懂的语言去解释安全漏洞问题
- android安全问题(八)伪造短信(利用原生android4.0漏洞)
- android安全问题(八)伪造短信(利用原生android4.0漏洞)
- 解决Windows的几个安全漏洞或性能问题
- 内网安全问题本质论 推荐
- ***流量泄露问题与安全漏洞有何关
- 由Strurts2漏洞引开谈谈web代码安全问题
- 从团购网的漏洞看网站安全性问题 -- 安全 -- IT技术博客大学习 -- 共学习 共进步!
- php.ini安全问题详细解释
- 搞了一天终于实现了 DataGrid 中的多国语言的问题,采用了中文向其他语言自动翻译的方法,其实不难,主要是想法(本文不涉及这个计算机技术问题,仅以此作为标题)
- 研究人员指出最近Java频出安全漏洞问题
- java安全问题(开发过程中一定要注意!十大漏洞)
- Mozilla官方:Firefox 3.5.1问题并非安全漏洞 仅是堆溢出Crash
- 软件漏洞---安全问题的根源
- 全面了解 Cookie的传递流程、编程实现及安全问题
- 关于Java语言中的线程安全问题