CSB ---> (XXE)XML基础

news2024/11/16 22:56:43

本来今天想更一下CSbeacon上线多层的内网机器的,但是刚好今天是年后的第一节课,讲的是XXE的基础,那就来先盘一下基础!!       

1.XXE

XXE全称是XML External Entity即xml外部实体注入攻击!其后果会导致用户读取服务器上的任意文件,RCE,探测内网端口,攻击内网网站,甚至会出现零元购的现象。那么既然都涉及到了XML,那就来讲一下XML吧

2.XML(Extensible Markup Language)

xml,可拓展标记语言,和html有一点相似,但是html旨在显示数据,而xml旨在传输和保存数据

3.XML的组成

XML的组成包括三个成分(成分似乎有点复杂

  1. XMl声明
  2. DTD --->document type definition(文档类型定义)
  3. 文档内容

光说肯定云里雾里,下面就来通过一个例子来展现这门语言的编写!!

  老规矩,先给题目

首先先写一个XML的声明

4.XML的声明

其中的encoding可以省略,我就不省略了,

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

5.XML的文档类型定义

其实一开始看的时候,你会觉得有点恐怖,但是不要慌,跟着我一步一步来!!😊😊😊

首先先确定你的对元素的根元素,这里很明显是成绩信息student,于是就可以写基本框架

<!DOCTYPE student []>

接着首先你要确定你有几个元素,然后按照以下格式在上面的 [ ] 里面编写

<!ELEMENT student (根元素下一级对应的元素)>

于是就有

<!ELEMENT student (id,name,course,score)>

接着,分别对每一个元素进行限定了

<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>

所以整个DTD就已经呼之欲出了

<!DOCTYPE student[
<!ELEMENT student (id,name,course,score)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>

在这里,顺便补充一点知识

1.不想代码变得那么杂?来个inlcude

在看到这个DTD之后,相信不少人就会说了,写这么多代码在同一页,看到眼睛都痛,有没有一种方法可以像c/c++那样直接include一个文件呢?   有!! 当然有!!!这么写就好

<!DOCTYPE root-element SYSTEM "filename">

其中的file对应的如果在同一个路径下,就可以直接写filename,否则就要写绝对路劲或者../ ../../这种 

所以上面的代码就可以优化成

<!DOCTYPE student SYSTEM "note.dtd">

然后再相同的路径下新建一个note.dtd的文件,里面的内容可以如下

<!ELEMENT student (id,name,course,score)>
<!ELEMENT id (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>

2.对元素的描述 

对于元素的描述,我们有以下规定

<!ELEMENT 元素名  content> ----->这就是对元素的一般的描述  其中,有以下特性:

(1)EMPTY——表示该元素不能包含子元素和文本,但可以有属性。

(2)ANY——表示该元素可以包含任何在该DTD中定义的元素内容

(3)#PCDATA——可以包含任何字符数据,但是不能在其中包含任何子元素  

补充:如果选择了#PCDATA的话,文本中的标签会被当作标记来处理,而实体会被展开

即在后面的文档内容中,不可以直接出现像< & 这种,而是需要写对应的 &amp; &lt; &gt这种

3.属性

其中这里讲到了属性,那么什么是属性呢,比如有以下一串代码

<student id="1">张三</student>

其中的id=1就是元素student对应得属性,而且id= 后面的值一定要双引号括起来!!!

4.数量词的用法

其中对于一开始的代码,不知道大家还记不记得有这样的一行

<!ELEMENT student (id,name,course,score)>

可以概括为这样,根元素后面括号里面的都是根元素下出现的元素,并且对于这些元素

还有以上的这些的规则,所以如果代码这样改,那么意思就是?

<!ELEMENT student (id|dd,name+,course*,score?)>
  1. id或者dd至少出现一个
  2. name必须出现一次或者多次
  3. course可出现,也可以不出现
  4. score必须出现一次或者0次
  5. 而且他们出现的顺序分别是 id||dd name course score 这样的一个顺序!!!

5.属性(Attribution)

在xml中,我们可以对属性进行一个声明,其格式如下:其中的元素名称与属性相对

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

其中对于属性的类型,有如下几种选择

1. CDATA 值为字符数据 (character data) ---->常用

2. (en1|en2|..) 此值是枚举列表中的一个值

3. ID 值为唯一的 id...

然后对于其默认值,也同样有以下几种选择

#REQUIRED 属性值是必需的

#IMPLIED 属性不是必需的

#FIXED value 属性值是固定的

补充,对于CDATA,是指的是不应由 XML 解析器进行解析的文本数据,即当我们想在文档中使用< & 这些的时候,我们可以这样写

<元素>   
<! [ CDATA ["你想要插入的值"] ] >   //这里的< &就不会被解析,就能成功显示了
</元素>

6.普通实体

对于c/c++,python这些语言来说,存在对变量赋值的操作,那么xml有没有呢??那肯定是有的

对于普通实体 ,又可以分为内部实体和外部实体!!

1.内部实体

就是直接在DTD那里用这样的代码块来标识

<!ENTITY 变量的名字||你指定的名字  "对应的值">

想要引用也很简单,只需要在对应的文档内容中加上&并且对应的名字以及一个; 即可 

<元素>&你取的变量名;</元素>
&你取的变量名              //这两种写法都可以
2.外部实体

外部实体的话,对应的DTD的代码块就要发生改变

<!ENTITY 名称 SYSTEM "URI">

但是引用的方法却是一样的

<引用>&你取得名字;</引用>
    &你取的名字

7.参数实体

实体参数大部分都是为了给一般参数做铺垫,我来举个例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root [
    <!ENTITY % param1 "<!ENTITY internal '123'>">
    %param1;
]>

<root>
    <test>[This is my site]&internal;</test>
</root>

其中,这行代码的意思就是定义一个实体参数,当调用到实体参数之后,代码就会变成这样

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

<!DOCTYPE root [
<!ENTITY % param1 "<!ENTITY internal '123'>">     #一个实体给另外一个实体赋值
<!ENTITY internal '123'>]>

<root>
<test>[This is my site] 123'</test>
</root>

而且实体参数还不可以在文档内容中被调用,而且我用的edge浏览器还解析不成功,建议用win7

对于实体参数的外部调用,就是在<!ENTITY>的参数后面的加上SYSTEM,和普通的实体的外部调用差不多

6.文档内容

上面补充了那么多,相信你们都快要忘了对应的题目内容了吧!! 没事我再贴一次

 那于是就可以写了: 其中我这里是把id当成了一个属性去写,你也完全可以独立出来一个元素

<score_information>

<student id="1" >
    <name>张三</name>
    <course>xml</course>
    <score>90</score>
</student>

<student id="2">
    <name>李四</name>
    <course>html</course>
    <score>80</score>
</student>

<student id="3" >
    <name>王五</name>
    <course>js</course>
    <score>80</score>
</student>

</score_information>

7.例题

1.名字的那题

<?xml version="1.0" encoding="UTF-8"  ?>
<!DOCTYPE student[
<!ELEMENT student (name,course,score)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
]>

<score_information>

<student id="1">
    <name>张三</name>
    <course>xml</course>
    <score>90</score>
</student>

<student id="2">
    <name>李四</name>
    <course>html</course>
    <score>80</score>
</student>

<student id="3" >
    <name>王五</name>
    <course>js</course>
    <score>80</score>
</student>

</score_information>

2.逆推

就有如下代码,其中

  • article+就是代表article这个成员最起码要出现一次
  • 并且在article下包含了headline byline lead body notes这些元素
  • 而且对于article的属性中 只有author是必须的给出的,其余都是选择性的
<?xml version="1" encoding="UTF-8" ?>

<newspaper>
    <article author="">
        <headline></headline>
        <byline></byline>
        <lead></lead>
        <body></body>
        <notes></notes>
    </article>
</newspaper>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1462882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE C++ 设置碰撞前 后事件 碰撞中事件

一.在Actor中声明碰撞BOX组件 UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category "MySceneComponent")class UBoxComponent* MyBox; 在Actor以这样的形式实现代理绑定&#xff0c;在BeginPlay()里。 MyBox->OnComponentBeginOverlap.AddDynamic(); 转到…

《游戏引擎架构》--学习3

内存管理 优化动态内存分配 维持最低限度的堆分配&#xff0c;并且永不在紧凑循环中使用堆分配 容器 迭代器 Unicode

(C++) 详解内存地址空间

详解内存空间 0. 概述 一个C/C 程序&#xff0c;编译之后&#xff0c;形成的程序&#xff0c;在执行期间&#xff0c;内存中不仅存在一块区域用于存放代码&#xff0c;还有一些其他的区域用于使用&#xff0c;本节会详解C/C内部所使用的内存地址空间&#xff0c;关于各内存的…

Java下访问SQLServer 2008(低于2016)数据连接问题

环境&#xff1a;ubuntu20.04&#xff0c;tomcat&#xff0c;java 通过jdbc:sqlserver连接远程的SQLServer 2008R2数据库&#xff0c;2016版本之前仅支持TLS10&#xff0c;因此在连接时会出现如下错误&#xff0c; The driver could not establish a secure connection to SQ…

(二十二)Flask之上下文管理第三篇【收尾—讲一讲g】

目录&#xff1a; 每篇前言&#xff1a;g到底是什么&#xff1f;生命周期在请求周期内保持数据需要注意的是&#xff1a; 拓展—面向对象的私有字段深入讲解一下那句&#xff1a; 每篇前言&#xff1a; &#x1f3c6;&#x1f3c6;作者介绍&#xff1a;【孤寒者】—CSDN全栈领域…

Java项目:21 基于SSM实现的图书借阅管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于SSM实现的图书借阅管理系统设计了两个角色&#xff0c;分别是管理员、用户&#xff0c;在数据表user中以ident字段区分&#xff0c;为1表示管理员…

Vue中如何使用dayjs

Day.js中文网Day.js是一个极简的JavaScript库&#xff0c;可以为现代浏览器解析、验证、操作和显示日期和时间。https://dayjs.fenxianglu.cn/ 单位不区别大小写&#xff0c;支持复数和缩写形式 单位缩写描述 date D日期 [1,31]dayd星期 [0,6]&#xff08;星期日0&#xff0c…

【开源】JAVA+Vue.js实现超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一&#xff0c;在国际灾害事故排名中位列第18位&#xff0c;根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计&#xff0c;在46起尾矿库泄漏事故中&#xff0c;由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

【SpringCloud】使用 Spring Cloud Alibaba 之 Sentinel 实现微服务的限流、降级、熔断

目录 一、Sentinel 介绍1.1 什么是 Sentinel1.2 Sentinel 特性1.3 限流、降级与熔断的区别 二、实战演示2.1 下载启动 Sentinel 控制台2.2 后端微服务接入 Sentinel 控制台2.2.1 引入 Sentinel 依赖2.2.2 添加 Sentinel 连接配置 2.3 使用 Sentinel 进行流控&#xff08;含限流…

【LeetCode: 105. 从前序与中序遍历序列构造二叉树 + DFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【精选】Java面向对象进阶——内部类

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

设计师常常从哪些网站获取灵感?

1、Pinterest Pinterest是一个基于图片共享的社交网站。用户可以在平台上浏览、收集和分享各种想法、设计灵感和项目。Pinterest用户可以在其网站或应用程序上创建虚拟画板&#xff08;boards&#xff09;&#xff0c;根据主题或兴趣收集和整理你最喜欢的图片&#xff08;包括…

RxJS 核心原理-操作符(源码实现)

本文将深入探讨RXJS操作符的核心原理&#xff0c;并介绍一些常见的操作符、应用场景以及相应的代码示例。通过理解RXJS的响应式编程思想&#xff0c;您将能够更好地应用它来处理异步数据流和事件流。 建议读者在阅读本文之前&#xff0c;先参考我的另一篇文章《深入浅出 RxJS …

IDM(Internet Download Manager)2024免激活绿色版下载

IDM&#xff08;Internet Download Manager&#xff09;在安全保护方面提供了多种功能和策略&#xff0c;以确保用户的下载体验和数据安全。以下是一些IDM的安全保护功能和策略&#xff1a; IDM绿色下载如下: https://wm.makeding.com/iclk/?zoneid34275 病毒扫描功能&#…

Spring之AOP源码解析(中)

前言 在上一篇文章中,我们讲解了Spring中那些注解可能会产生AOP动态代理,我们通过源码发现,完成AOP相关操作都和ProxyFactory这个类有密切关系,这一篇我们将围绕这个类继续解析 演示 作用 ProxyFactory采用策略模式生成动态代理对象,具体生成cglib动态代理还是jdk动态代理,…

FairyGUI × Cocos Creator 3.x 使用方式

前言 上一篇文章 FariyGUI Cocos Creator 入门 简单介绍了FairyGUI&#xff0c;并且按照官方demo成功在Cocos Creator2.4.0上运行起来了。 当我今天使用Creator 3.x 再引入2.x的Lib时&#xff0c;发现出现了报错。 这篇文章将介绍如何在Creator 3.x上使用fgui。 引入 首先&…

想把握现货黄金价格走势 这两点能助你掌握优势

现货黄金价格走势很是狡猾&#xff0c;想要抓准它的波动是很难的。但我们作为投资者&#xff0c;偏要与它较劲。想要像捕捉猎物一样捕捉到现黄金价格走势&#xff0c;以下这两点投资者要注意。 了解清楚自己的风格适合什么市场&#xff1f;投资者有比较固定的投资风格&#xff…

Day4. 文件IO的基本概念和读写

温习&#xff1a; 文件的拷贝&#xff08;单个字符&#xff09;(fgetc/fputc) #include <stdio.h>int main(void) {FILE* fp NULL;FILE* fq NULL;char ch 0;fp fopen("str.txt","r");if (fp NULL){perror("file to fopen!");retur…

指南 | 从概念到实践:探索独立站在当代电商中的关键作用

搭建电商独立站指南 随着数字化时代的到来&#xff0c;电子商务已成为全球商业生态的核心组成部分。在这个不断变化的市场中&#xff0c;独立站作为企业建立在线身份和拓展业务的强大工具&#xff0c;正逐步展现出其不可替代的价值。 从概念到实践&#xff0c;本文将深入探索独…