您的位置:首页 > 文旅 > 美景 > 商标转让费用_电子商城网站的设计与实现_如何优化网站_网站建设技术外包

商标转让费用_电子商城网站的设计与实现_如何优化网站_网站建设技术外包

2024/12/23 12:32:02 来源:https://blog.csdn.net/2402_87387800/article/details/144457647  浏览:    关键词:商标转让费用_电子商城网站的设计与实现_如何优化网站_网站建设技术外包
商标转让费用_电子商城网站的设计与实现_如何优化网站_网站建设技术外包

知识点:PHP中的序列化和反序列化

一、序列化和反序列化

1.序列化(serialize)

将对象的状态信息转换为可以存储或传输的形式的过程,简单来说,就是将状态信息保存为字符串。为了解决不同机器之间传输复杂数据类型的一种机制

2.反序列化(unserialize)

将字符串转换为状态信息。

3.最终目的

实现对象的跨平台存储、网络传输

4.魔术方法

PHP中有一类特殊的方法叫“Magic Function”,即魔术方法,PHP将所有以__(双下划线)开头的类方法保留为魔术方法,主要重点关注

__construct():当对象创建(new)时会自动调用,但在unserialize()时是不会自动调用的(构造函数)
​
__destruct():当对象操作执行完毕后(被销毁)自动执行destruct()函数的代码
​
__wakeup():unserialize()时自动调用
​
__call()方法当调用类实例中不存在的函数时自动执行

5.其他函数

  • var:理解为定义属性一般用在class函数后,表定义xx为xx类的一个属性。

  • var_dump函数:用于输出变量的相关信息,包括类型与值。

  • class函数:定义一个类,并在类中定义属性和方法。

  • public函数:是PHP中访问控制修饰符之一,用于定义类的成员(属性和方法)的可访问级别。类的成员在类的外部可以被访问和修改。

注:在PHP的OOP中,类(Class)是构成面向对象编程的基本单位。类可以包含属性(变量)和方法(函数)。

6.序列化特征值

为了能够对一个类的序列化字符序列进行反序列化,这个对象的类必须已经定义过。

如果序列类A的一个对象,将会返回一个跟类A相关,而且包含了对象所有变量值的字符串。

以下是常用的序列化得到的字符串所代表的含义:

例如:

二、解题思路

step 1 打开靶场审题

题目为unserialize,即与反序列化有关,看页面,显示出一个不完整的PHP代码——括号都没有完全闭合。

注:这里的 ?code= 为GET传参

step 2 代码审计

_wakeup()为魔术方法,通常用于反序列化中。

unserialize() 反序列化函数会检查是否存在一个 __wakeup() 方法。如果存在,则会先调用 __wakeup 方法,预先准备对象需要的资源,比如连接数据库。

这题到目前的代码是没有看见序列化函数的,所以我们传递参数的时候是需要自己传递已经序列化的参数,题目也给了提示,是传参给code

step 3 补充代码将其序列化

将代码补充完整,将其序列化显示出来

<?php
class xctf{                    
public $flag = '111';            
public function __wakeup(){     
exit('bad requests');
}
}
$a = new xctf();          
echo(serialize($a));       
?>

将其序列化:php代码运行

目前我还没有配置好PHP运行环境,找到了一个在线网站菜鸟教程在线编辑器,可以在线运行php代码。

以上代码运行结果如下:

O:4:"xctf":1:{s:4:"flag";s:3:"111";}
“O”:代表object(为A时代表Array)
“4”:代表"xctf"占4个字符长度
"xctf":对应前面提到的长度为 4 的对象名称,也就是这个被序列化对象的名称是 xctf。
“1”:代表着对象具有一个成员属性:s代表string
{...} :花括号内的内容是具体用来描述对象中成员属性的序列化表示情况,里面包含了具体的属性名和属性值的序列化内容。
​
“s”:表示这是一个字符串(String)类型的数据,在序列化中,每个成员属性如果是字符串类型都会以 s 开头来标识。
“4”:紧跟 s 后的数字表示后面所定义的字符串(这里是属性名)的长度,也就是 flag 这个字符串长度为 4 个字符,代表的是对象的成员属性名称。字符型(如果为i,代表int型)
"flag" :对应前面长度为 4 所指的具体的字符串内容,也就是对象 xctf 里包含的这个成员属性的名称是 flag。
​
后面又出现的
s:3:"111" 同理,先是 s 标识字符串类型,3 表示后面所跟字符串内容的长度为 3 个字符,最后的 "111" 就是该成员属性(名为 flag)具体所存储的字符串值内容,即值为 111。

step 4 构造payload,进行传参

根据代码审计,我们构造出来序列化序列之后,不能给__wakeup()执行,否则会返回bad request参数,所以需要在序列化参数做些修改。

尝试传参

?code=O:4:"xctf":1:{s:4:"flag";s:3:"111";}

得到 bad request 信息

step 5 修改payload,得到flag

这里的漏洞就是:如果我们在序列化中说明的对象个数要比实际的对象个数要大,那么将不会执行__wakeup()这个方法,即绕过 _wakeup()

所以,我们将序列化输出的对象个数改成比1大的数就行了比如:

?code=O:4:"xctf":4:{s:4:"flag";s:3:"111";}

即可得到flag。也就是证明,我们的序列化参数真实传递给了$code

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com