php反序列化基础篇(引用的概念)!全网最详细!小白看这篇就够了!

大家好,我是Dest1ny!

今天继续来讲php基础篇,这次我们讲一个“引用”的概念。首先我们先引入​它比较正经的概念!

引用的概念​:

在 PHP 中,引用允许多个变量指向同一个内存地址。当你对某个变量进行修改时,其他引用到该内存地址的变量也会同步变化。这个机制同样适用于数组和对象。如果在序列化时,某些数据结构包含了引用,那么反序列化时需要保持这些引用关系。

巴拉巴拉讲了一堆,感觉啥也没听懂,我们导入例题来看一下

CLASS-1 例题来了!

例题如下:

大家可以先自行去阅读一下代码!

这里是大致的思路:

  1. 首先它接受pass的get传参并且可以反序列化。

  2. 它会把pass里的"*"都变成"\*"。

  3. 如果just4fun里的两个参数值都相等,则会输出上面包含flag.php的​flag值。

  4. 失败则输出“are you trolling?”。

CLASS-2 解题思路

​先把注释版本放在下面,方便大家阅读:

首先我们的最终目的是拿到flag,想拿到flag,就得让just4fun里的两个属性都​相同。

我们已经知道这个secret值只能是*

所以我们肯定想着用pass传参,去通过反序列化改变enter的值。

但是enter真可以直接把“*”传上去吗?这里有一个过滤的功能,并且会把你要传进去的“*”变成“ \*”,那就不太可能通过反序列化传上去了!

​怎么办呢?

CLASS-3 引用它来了

那其实是不是还有个思路,就是让enter的值等于secret的值就行,就是我们攻击点不是在传反序列化的时候去直接改变enter的值,而是让这两个属性绑在一起,间接去通过引用的方式去改变enter的值​。

这里我发一下payload:

这里大家看到我用了$a -> enter =&$a -> secret,作为payload​。那这句话什么意思呢??

这里有一个概念,就是指针,如果学过c或者c++什么的编程语言就会比较熟悉​。

其实是什么意思呢,就是比如我a=1,那么计算机​如何存储这个1呢?计算机会给1一个房间让它住进去,房间上有编号​。

如果计算机需要这个1​了,直接去房间找他就行。“&”这个东西就是把secret值存着的房间给提取出来,让enter自己去找secret的房间,然后自己去变得跟secret​一样。而这个时候,我们只给enter这个房间号就行,直接让enter绕过过滤系统,这个就是引用​!

大家看一下结果:

其实很简单,你只要可以满足pass里的序列化字符串里,没有“*”这个字符,不会触发过滤,又可以满足secret = enter就可以了​。

CLASS-4 ending

传一下看看

​http://127.0.0.1:8088/class19/1.php?pass=O:8:%22just4fun%22:2:{s:5:%22enter%22;N;s:6:%22secret%22;R:2;}

​结果:

ok,大功​告成!

我是Dest1ny,制作不易,希望​大家可以多多支持!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值