php反序列化

phar 反序列化
注意:要将 php.ini 中的 phar.readonly 选项设置为 Off,否则无法生成 phar 文件
//phar 的使用格式
startBuffering(); $phar->setStub(''); //设置stub,我们必须以这个为结尾,否则phar扩展将无法识别这个文件为phar文件 $phar->setMetadata($a); //将自定义的meta-data存入manifest,我感觉就是将序列化的东西存进去 $phar->addFromString('test.txt', 'test');//添加要压缩的文件 $phar->stopBuffering();//签名自动计算 这里我们可以使用winhex,看看他是否将meta-data序列化 注意:phar文件一定要用winhex或010或脚本直接修改,不能用记事本之类的,他的签名会变化的。 这里我们看到他是进行了序列化的。 然后解释phar文件的结构 1.a stub 可以理解为一个标志,格式为xxx,前面内容不限,但必须以__HALT_COMPILER();来结尾,否则phar扩展将无法识别这个文件为phar文件。2.a manifest describing the contents phar 文件本质上是一种压缩文件,其中每个被压缩文件的权限、属性等信息都放在这部分。这部分还会以序列化的形式存储用户自定义的 meta-data,这是上述攻击手法最核心的地方
3.the file contents 被压缩文件的内容。
4.[optional] a signature for verifying Phar integrity (phar file format only) 签名,放在文件末尾
然后我们具体是通过 phar 协议文件包含来使用的。
phar:// 相对路径 /a.phar
phar:// 绝对路径 /a.phar
phar:// 协议(像是 http tcp 协议这样的)
以下是另一个示例的代码
1 | class A { |
在 php 版本大于 7.1 后,对 private protected 这些不敏感,可以直接改成公共或是 var
# CVE-2016-7124
-
PHP5 < 5.6.25
PHP7 < 7.0.10序列化字符串中表示对象属性个数的值大于真实的属性个数时会跳过
__wakeup的执行。

绕过是在属性数字前面加个 +,但是这样 get 传参时候 + 有其他意思,要全部 url 编码一下或者直接给 + 换成他的编码格式 %2b

对于低版本的 php,直接在后面加上他要的内容即可
# POP 链
- POP 即面向属性编程 (Property Oriented Programing),利用代码中的各类对象属性和魔术方法,来构造一条人为控制的调用路线。
-
确定入口
能够开始执行调用的地方。
-
静态函数调用
1
$a->test();
-
动态函数调用
1 | $b = 'test'; |
魔术方法
1 | __destruct() // 对象销毁时自动执行 |
确定出口(利用点)
-
类方法中的危险函数
1
2
3
4eval()
system()
shell_exec()
file_get_contents() -
- 涉及 FLAG 的地方。
-
构造属性调用链
通过魔术方法构造调用链。
# 魔术方法
1 | __destruct() // 对象销毁时自动执行 |
# session 反序列化


- 标题: php反序列化
- 作者: The Redefine Team
- 创建于 : 2025-02-21 20:18:11
- 更新于 : 2025-03-08 15:19:12
- 链接: https://redefine.ohevan.com/2025/02/21/php反序列化/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论