一、漏洞原理

1、DTD

文档类型定义(DTD)可定义合法的XML文档构建模块。它使用一系列合法的元素来定义文档的结构。DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。

内部的 DOCTYPE 声明:

<!DOCTYPE 根元素 [元素声明]>

外部的 DOCTYPE 声明:

<!DOCTYPE 根元素 SYSTEM "文件名">

这是包含 DTD 的 "note.dtd" 文件

DTD内部实体声明:

<!ENTITY 实体名称 "实体的值">

DTD外部实体声明:

<!ENTITY 实体名称 SYSTEM "URI/URL">

2、XML外部实体

XML,可拓展的标记语言,(eXtensible Markup Language),用于传输和存储数据。

XML文档实例:

XML“外部实体”实例:

可以在DOCTYPE头部标签中通过SYSTEM关键字定义“实体”,这些“实体”可以访问本地或远程的内容。SYSTEM告诉XML解释器,从URI中读取实体的内容。攻击者可以通过实体将自定义的值发送给应用程序,然后让应用程序去呈现。

二、漏洞发现与利用

1、寻找XML输入点

比如Content-Type:text/xml, post的数据包含XML格式,如:

<forgot><username>admin</username></forgot>

请求头中添加Content-Type:text/xml,或Content-type:application/xml

同时,POST中添加payload

2、注入payload

三、漏洞危害

1、任意文件读取

通过提交自动以URI,可以读取任意文件(本地或远程)。

还可以通过DTD文档引入外部DTD文档,再引入外部实体声明,如下:

以上输入有回显的情况,/etc/passwd可以直接被显示出来,无回显的情况,需要把文件外发至远程服务器,具体如下:

2、拒绝服务攻击

原理为:构造恶意的XML实体文件耗尽可用内存,因为许多XML解析器在解析XML文档时倾向于将它的整个结构保留在内存中,解析非常慢,造成了拒绝服务器攻击。

3、测试后端服务器的开放端口

通过返回的“Connection refused”可以知道该81端口是closed的,而80端口是open的。

4、后端WEB漏洞如果可以通过URL加以利用,可造成WEB漏洞攻击

5、命令执行

PHP要开启PECL上的Expect扩展。

四、修复建议

1、配置XML处理器使用本地静态的DTD,不允许XML中含有任何自己声明的DTD

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

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

最新文章

  1. timus 1180. Stone Game 解题报告
  2. SQL查询的几种方式
  3. cocos2d-x 卡牌翻牌效果的实现
  4. ThinkPHP函数详解:R方法
  5. ellang 中进程异步通信中的信箱与保序
  6. 裸的单调队列-poj-2823-Sliding Window
  7. java 调用jdbc 实现excel和csv的导入和导出
  8. ubuntu Linux 安装和首次使用
  9. 关于JavaMail
  10. NNSZ OIers&#39; Blog Archive
  11. 一步一步从原理跟我学邮件收取及发送 12.telnet命令行收一封信pop3
  12. typescript接口(学习笔记非干货)
  13. 【Java】 剑指offer(47) 礼物的最大价值
  14. WINDOWS 命令行 串口 COM 发送数据
  15. [UE4]在蓝图中设置图片
  16. Linq快速入门——扩展方法
  17. libcurl同时下载多个文件
  18. 六、angular 生成二维码
  19. 1005. Spell It Right(20)—PAT 甲级
  20. (1.3.1)连接安全(连接实例与网络协议及TDS端点)

热门文章

  1. Ruby 基础教程1-5
  2. 解决jQuery不同版同时引用的冲突
  3. Django创建App报错
  4. visionpro吧-百度贴吧
  5. jQuery 调用后台方法(net)
  6. Python3 Tkinter-Frame
  7. 二 Capacity Scheduler 计算能力调度器
  8. [leetcode-775-Global and Local Inversions]
  9. (转)apktool+dex2jar+jd_gui
  10. iOS- Apple零配置网络协议Bonjour的使用?