大家好,我是Dest1ny!
今天继续来讲php基础篇,这次我们讲一个“引用”的概念。首先我们先引入它比较正经的概念!
引用的概念:
在 PHP 中,引用允许多个变量指向同一个内存地址。当你对某个变量进行修改时,其他引用到该内存地址的变量也会同步变化。这个机制同样适用于数组和对象。如果在序列化时,某些数据结构包含了引用,那么反序列化时需要保持这些引用关系。
巴拉巴拉讲了一堆,感觉啥也没听懂,我们导入例题来看一下
CLASS-1 例题来了!
例题如下:
大家可以先自行去阅读一下代码!
这里是大致的思路:
-
首先它接受pass的get传参并且可以反序列化。
-
它会把pass里的"*"都变成"\*"。
-
如果just4fun里的两个参数值都相等,则会输出上面包含flag.php的flag值。
-
失败则输出“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,制作不易,希望大家可以多多支持!!