XML介绍

XML全称可扩展标记语言(EXtensible Markup Language),XML跟HTML格式类似,但是作用不同,XML侧重于数据传输,HTML注重于标记语言,也就是说XML其实是一种数据传输的手段

XML格式

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明-->
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->
  • 所有 XML 元素都必须有关闭标签。
  • XML 标签对大小写敏感。
  • XML 必须正确地嵌套。
  • XML 文档必须有根元素。
  • XML 的属性值须加引号。

使用PHP代码来读取XML文件:

<?php
libxml_disable_entity_loader(false);
$xmlContent = file_get_contents("./xml.xml");
$dom = new DOMDocument();
$dom->loadXML($xmlContent, LIBXML_NONET| LIBXML_DTDLOAD);
$cred = simplexml_import_dom($dom);
var_dump($cred);
?> # 运行结果
class SimpleXMLElement#2 (2) {
public $comment =>
array(2) {
[0] =>
class SimpleXMLElement#4 (0) {
}
[1] =>
class SimpleXMLElement#3 (0) {
}
}
public $book =>
class SimpleXMLElement#5 (6) {
public $@attributes =>
array(1) {
'category' =>
string(7) "COOKING"
}
public $comment =>
array(5) {
[0] =>
class SimpleXMLElement#10 (0) {
...
}
[1] =>
class SimpleXMLElement#9 (0) {
...
}
[2] =>
class SimpleXMLElement#8 (0) {
...
}
[3] =>
class SimpleXMLElement#7 (0) {
...
}
[4] =>
}
}
public $title =>
string(16) "Everyday Italian"
public $author =>
string(19) "Giada De Laurentiis"
public $year =>
string(4) "2005"
public $price =>
string(5) "30.00"
}
}

XML元素内容中不能有这些特殊字符:< > &,但可以使用它们的实体编码字符:

&lt; &gt; &amp; &apos; &quot; 替换< > & ' "

DTD(document type definition)介绍

  • DTD是XML的一部分,他用来给XML定义一种格式规范,比如自定义一种标签
  • DTD用来为XML文档定义语义约束。可以嵌入在XML文档中(内部声明),也可以独立的放在另外一个单独的文件中(外部引用)。是XML文档中的几条语句,用来说明哪些元素/属性是合法的以及元素间应当怎样嵌套/结合,也用来将一些特殊字符和可复用代码段自定义为实体。
  • DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。DTD 可以在 XML 文档内声明,也可以外部引用。

内部DTD

这是我们在XML内部自己定义的DTD:

<?xml version="1.0"?>
<!DOCTYPE note [<!--定义此文档是 note 类型的文档-->
<!ELEMENT note (to,from,head,body,end)><!--定义note元素有四个元素-->
<!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->
<!ELEMENT end (#PCDATA)><!--定义end元素为”#PCDATA”类型-->
]>
<note>
<to>F12</to>
<from>is</from>
<head>very</head>
<body>Handsome</body>
<end><![CDATA[This is a CDATA section. It can contain any text data, including special characters like <, >, and &.]]></end>
</note>

这是一些DTD的格式说明:

PCDATA

PCDATA的意思是被解析的字符数据,是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。文本中的标签会被当作标记来处理,而实体会被展开,被解析的字符数据不应当包含任何&,<,或者>字符,需要用它们的实体编码来替换

CDATA

CDATA意思是字符数据,CDATA 是不会被解析器解析的文本,在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开,使用方法是<![CDATA[内容]]>

<?php
libxml_disable_entity_loader(false);
$xmlContent = file_get_contents("./xml.xml");
$dom = new DOMDocument();
$dom->loadXML($xmlContent, LIBXML_NONET|LIBXML_DTDLOAD);
$cred = simplexml_import_dom($dom);
var_dump($cred);
?> # 运行结果
class SimpleXMLElement#2 (5) {
public $to =>
string(3) "F12"
public $from =>
string(2) "is"
public $head =>
string(4) "very"
public $body =>
string(8) "Handsome"
public $end =>
class SimpleXMLElement#3 (0) {
}
}

可以看到CDATA中的内容没有被解析

外部DTD

引入外部DTD文件

<!DOCTYPE 根元素名称 SYSTEM "dtd路径">

<!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL"(网络上的DTD文件)

示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root-element SYSTEM "test.dtd">
<note>
<to>F12</to>
<from>is</from>
<head>very</head>
<body>Handsome</body>
</note>
<!ELEMENT to (#PCDATA)><!--定义to元素为”#PCDATA”类型-->
<!ELEMENT from (#PCDATA)><!--定义from元素为”#PCDATA”类型-->
<!ELEMENT head (#PCDATA)><!--定义head元素为”#PCDATA”类型-->
<!ELEMENT body (#PCDATA)><!--定义body元素为”#PCDATA”类型-->

DTD属性

属性声明语法:

<!ATTLIST 元素名称 属性名称 属性类型 默认值>

DTD实例:

<!ATTLIST example suxin CDATA "F">

XML实例:

<example suxin="F" />

这个属性跟html标签中的属性是一个意思

属性类型选项:

DTD实体

  1. 实体是用于定义引用普通文本或特殊字符的快捷方式的变量。
  2. 实体引用是对实体的引用。
  3. 实体可在内部或外部进行声明

可以将DTD实体理解为一个变量

一般实体

<!ENTITY 实体名称 "实体内容">

引用方法:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY abc "F12">
]>
<test>&abc;</test>

参数实体

<!ENTITY % 实体名称 "实体内容">

引用方法:

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY %abc "F12">
%abc
]>
<test>test</test>

一般实体在代码块中引用通过&名称进行引用,而参数实体是通过%名称进行引用的,参数实体直接在DTD实体中就引用了

外部实体

外部实体,用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机。

<!ENTITY 实体名称 SYSTEM "URI/URL">
或者
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<author>&file;</author>

外部实体的引用是支持协议的,如http,file等,如果是php的话,也支持伪协议等等

内部实体

<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY abc "F12"> #这个就是内部实体,其实和上面的一般实体一样
]>
<test>&abc;</test>

XML注入

XML注入的原理跟SQL注入的原理差不多,都是闭合以达到执行语句的效果,一个简单的例子

<?php

libxml_disable_entity_loader (false);
$input=$_POST[0];
$xmlfile = "<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<bookstore>
<book category='COOKING'>
<title>Everyday Italian</title>
<author>$input</author>
<year>2024</year>
<price>30.00</price>
</book>
</bookstore>";
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
var_dump($creds); ?>

这里我们可以控制$input的内容,post一个0=F12

如果我们这样传,0=F12</author><name>hacker_F12</name><author>

可以看到成功注入name标签

防御建议

对传入的数据做个转义过滤就行了

XXE攻击

外部实体注入

实际上就是利用DTD搭配协议来进行攻击

<?php

libxml_disable_entity_loader (false);
$xmlfile = file_get_contents('php://input');
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
echo $creds; ?>



可以看到读到了F12 is very handsome

内部实体注入

主要是利用外部实体加参数实体,通过报错带出数据,一张图即可理解

XXE注入详解的更多相关文章

  1. XML外部实体(XXE)注入详解

    ###XML与xxe注入基础知识 1.XMl定义 XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言:可扩展的样式语言(Ex ...

  2. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  3. 安全测试基础-SQL注入详解

    1:什么是SQL注入 SQL注入是一种将SQL代码插入或添加到应用(用户)的输入参数中的攻击,之后再将这些参数传递给后台的SQL服务器加以解析并执行. www.xx.com/news.php?id=1 ...

  4. 【web安全】第六弹:手工SQL注入详解

    前一段时间,在对SQL注入有了新的理解之后,写了这篇文章.本来准备投稿,因为内容过于基础被打回来了,想想屯着也没意思,发出来发出来~~本来有好多图的,但是博客园发图很麻烦,word文档的链接会贴在文章 ...

  5. xpath注入详解

      0x01 什么是xpath XPath 即为 XML 路径语言,是 W3C XSLT 标准的主要元素,它是一种用来确定 XML(标准通用标记语言的子集)文档中某部分位置的语言. XPath 基于  ...

  6. MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解

    判断数据库的类型 当我们通过一些测试,发现存在SQL注入之后,首先要做的就是判断数据库的类型. 常用的数据库有MySQL.Access.SQLServer.Oracle.PostgreSQL.虽然绝大 ...

  7. Angular依赖注入详解

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  8. ASP+ACCESS手工注入详解

    SQL注入这么长时间,看见有的朋友还是不会手工注入,那么我来演示一下.高手略过. 我们大家知道,一般注入产生在没经过虑的变量上,像ID?=XX这样的. 下面以这个网址为例: http://zsb.xx ...

  9. Android 注入详解

    Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...

  10. Spring 3.0 注解注入详解

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

随机推荐

  1. 42 干货系列从零用Rust编写负载均衡及代理,wmproxy中配置tcp转websocket

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  2. 题解| CF1561D2. Up the Strip(递推)

    题目链接:Here 这个思路学习自 Harris-H ,考虑递推而不是DP 与 D1 不同,开始考虑 \(f_{i-1} \to f_i\) 显然操作 1 多了 \(f_{i-1}\) ,操作2 多了 ...

  3. mybatis-plus 对date类型取当天的数据

    数据库中的字段是时间类型,要取出当天的数据,使用mybatis-plus 如何实现,思路是用 时间大于当天凌晨,小于当天23:59:59的时间 //调用的代码Date start = DateUtil ...

  4. P1955【绿】

    这道题是标准的"离散化+并查集"模版题,通过这道题彻底理解了并查集,同时还意识到了我之前一直用map来实现离散化的方法其实是最简单但是最慢的方法,以这道题为例,map导致时间消耗有 ...

  5. NLP复习之神经网络

    NLP复习之神经网络 前言 tips: 设计神经网络时,输入层与输出层节点数往往固定,中间层可以自由指定: 神经网络中的拓扑与箭头代表预测过程数据流向,与训练的数据流有一定区别: 我们不妨重点关注连接 ...

  6. 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题

    七.用go语言,假设用 RB-INSERT 将一个结点 x 插入一棵红黑树,紧接着又用 RB-DELETE 将它从树中删除.结果的红黑树与初始的红黑树是否一样?证明你的答案. 文心一言: 首先,我们需 ...

  7. python3使用diagrams生成架构图

    技术背景 对于一个架构师或者任何一个软件工程师而言,绘制架构图都是一个比较值得学习的技能.这就像我们学习的时候整理的一些Xmind那种思维逻辑图一样,不仅可以帮我们看到组件之间的联系和层级,还能够展示 ...

  8. grpc-环境与示例

    1. 数据传输基本原理 2. grpc环境安装 代码生成器 go get -u github.com/golang/protobuf/protoc-gen-go // 会自动在 $GOPATH/bin ...

  9. Go-稀疏数组

    package main import "fmt" // 稀疏数组 // 1. 二维数组 // 2. 存在大量相同相同数据和少量不同数据 // 思维: 将大量相同数据转化为: (数 ...

  10. Grafana针对内存监控值的学习与使用

    Grafana针对内存监控值的学习与使用 背景 因为学习内存相关的知识, 可以通过pgcacher/sar -r 等命令监控系统信息. 但是现在发现. 不太直观, 所以想着使用别的方式来进行处理. 然 ...