PHP反序列化命令执行+PHP反序列化POP大链 +PHP反序列化基础
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP反序列化命令执行 | 1 |
[题目考点]:
反序列化命令执行,获取题目flag。
[Flag格式]:
SangFor{t5euvZ_OB8Jd_h2-}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
name赋值为system,$male赋值为whoami,即调用system(whoami)
5、序列化结果:
6、最终结果:
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP反序列化POP大链 | 2 |
[题目考点]:
通过多个类中不同的魔术方法,构造反序列化POP链,获取题目flag。
[Flag格式]:
SangFor{qMWi3Uhs1r2uX6FB}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
实验主页
代码分析
1、首先通读代码,代码中存在6个类,每一个类中定义了两个变量,同时每个类中定义了不同的魔术方法。
__desctruct() 类执行完毕以后调用,其最主要的作用是拿来做垃圾回收机制。 __toString() 在对象当做字符串的时候会被调用 ___call() 当所调用的成员方法不存在(或者没有权限)该类时调用,用于对错误后做一些操作或者提示信息 __invoke() 直接调用对象名当方法使用时,就调用的是__invoke()方法
2、我们的目标是获取flag,函数getFlag()在类getFlag类中,而__destruct()魔术方法可以作为POP链的触发点
3、通过构造POP链,把__destruct()函数作为触发点,getFlag()函数作为终止点,最终获取flag
5、输出序列化内容为:
6、最终结果:
既然可以读取passwd文件,那么尝试读一下flag.php文件吧!
[题目信息]:
题目名称 | 题目难度 |
---|---|
PHP反序列化基础-2 | 1 |
[题目考点]:
PHP反序列化基础2
[Flag格式]:
SangFor{8wTFrFxSKMzXM3ng}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
实验主页
代码分析
1、首先定义类Ser
2、第二行定义公有变量 $name
3、存在魔术方法wakeup
当实例化的类反序列化时会自动触发__wakeup()魔术方法
4、在__wakeup函数中存在file_get_contents()函数,并且参数为$name,可控(注意成员变量$name为私有类型)
成员变量大致可以分为三类:
- public 共有类型
- private 私有类型
- protected 被保护类型
当成员变量为私有类型时,当$name被反序列化时,前后为%00。
如果不做处理,在cmd命令行中显示类似于空格,复制到url地址栏时会被转化为%20,也就是空格的url编码,所以需要将输出的结果进行url。
5、最后存在unserialize()函数,并且参数可控
利用方法
1、实例化类Ser
2、使用php://filter伪协议,$name赋值所需读取文件名称
3、将实例化类Ser序列化并输出
4、将输出结果通过GET方式输入
将base64进行解码。
[题目信息]:
题目名称 题目难度 PHP反序列化基础 1 [题目考点]:
1. PHP反序列化基础
[Flag格式]:
SangFor{k26Bj-V9ENIY7tBy}
[环境部署]:
docker-compose.yml文件或者docker tar原始文件。
docker-compose up -d
[题目writeup]:
实验主页
代码分析
1、首先定义类Ser
2、第二行定义公有变量 $name
3、存在魔术方法 __toString
当实例化的类被当作字符串处理时会自动触发__toString魔术方法
4、在__toString函数中存在file_get_contents()函数,并且参数为$name,可控
5、最后存在unserialize()函数,并且参数可控
利用方法
1、实例化类Ser
2、使用php://filter伪协议,$name赋值所需读取文件名称
3、将实例化类Ser序列化并输出
4、将输出结果通过GET方式输入
将base64进行解码。