可利用的 PHP 函数
Posted
技术标签:
【中文标题】可利用的 PHP 函数【英文标题】:Exploitable PHP functions 【发布时间】:2010-06-25 04:34:35 【问题描述】:我正在尝试构建可用于任意代码执行的函数列表。目的不是列出应列入黑名单或以其他方式禁止的功能。相反,在搜索受感染的服务器以查找后门时,我希望有一个方便的 red-flag 关键字grep
-able 列表。
这个想法是,如果你想构建一个多用途的恶意 php 脚本——比如像 c99 或 r57 这样的“web shell”脚本——你将不得不使用一个或多个相对较小的文件中某处的一组函数,以允许用户执行任意代码。搜索这些函数可以帮助您更快地将数万 PHP 文件的大海捞针缩小到需要仔细检查的相对较小的脚本集。
显然,例如,以下任何内容都将被视为恶意(或糟糕的编码):
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
等等。
前几天在一个被入侵的网站上搜索时,我没有注意到一段恶意代码,因为我没有意识到 preg_replace
可能会因使用 /e
标志而变得危险(严重吗?为什么会出现这种情况?)。还有其他我想念的吗?
这是我目前的清单:
Shell 执行
system
exec
popen
backtick operator
pcntl_exec
PHP 执行
eval
preg_replace
(带有 /e
修饰符)
create_function
include
[_once
] / require
[_once
](查看 mario 的回答了解漏洞利用详情)
拥有能够修改文件的函数列表可能也很有用,但我想 99% 的时间利用代码将至少包含上述函数之一。但是,如果您有能够编辑或输出文件的所有功能的列表,请将其发布,我将在此处包含它。 (我不算mysql_execute
,因为这是另一类漏洞利用的一部分。)
【问题讨论】:
作为旁注,如果可能的话,我希望在不久的将来看到该列表:) @yoda: 发表在哪里?我会在这里更新列表,因为 SO 是所有知识的源泉。/e
修饰符有什么作用?
@Billy:e
修饰符使替换字符串被评估为 PHP 代码。
不得不说:执行正则表达式中的代码是 Perl 和 Python 可能做的事情,而不是 PHP 独有的事情。不过我不知道细节。
【参考方案1】:
为了构建这个列表,我使用了 2 个来源。 A Study In Scarlet 和 RATS。我还添加了一些我自己的东西,这个帖子上的人提供了帮助。
编辑:发布此列表后,我联系了RIPS 的创始人,截至目前,此工具搜索 PHP 代码以使用此列表中的每个函数。
大多数这些函数调用被归类为接收器。当一个受污染的变量(如 $_REQUEST)被传递给一个接收器函数时,你就有了一个漏洞。 RATS 和 RIPS 之类的程序使用类似 grep 的功能来识别应用程序中的所有接收器。这意味着程序员在使用这些函数时应该格外小心,但如果它们都被禁止,那么你将无法完成很多工作。
“权力越大,责任越大。”
--斯坦·李
命令执行
exec - Returns last line of commands output
passthru - Passes commands output directly to the browser
system - Passes commands output directly to the browser and returns last line
shell_exec - Returns commands output
`` (backticks) - Same as shell_exec()
popen - Opens read or write pipe to process of a command
proc_open - Similar to popen() but greater degree of control
pcntl_exec - Executes a program
PHP 代码执行
除了eval
,还有其他的PHP代码执行方式:include
/require
可以通过Local File Include和Remote File Include漏洞的形式远程执行代码。
eval()
assert() - identical to eval()
preg_replace('/.*/e',...) - /e does an eval() on the match
create_function()
include()
include_once()
require()
require_once()
$_GET['func_name']($_GET['argument']);
$func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array());
接受回调的函数列表
这些函数接受一个字符串参数,该参数可用于调用攻击者选择的函数。根据功能,攻击者可能有也可能没有传递参数的能力。在这种情况下,可以使用像 phpinfo()
这样的 Information Disclosure
函数。
Function => Position of callback arguments
'ob_start' => 0,
'array_diff_uassoc' => -1,
'array_diff_ukey' => -1,
'array_filter' => 1,
'array_intersect_uassoc' => -1,
'array_intersect_ukey' => -1,
'array_map' => 0,
'array_reduce' => 1,
'array_udiff_assoc' => -1,
'array_udiff_uassoc' => array(-1, -2),
'array_udiff' => -1,
'array_uintersect_assoc' => -1,
'array_uintersect_uassoc' => array(-1, -2),
'array_uintersect' => -1,
'array_walk_recursive' => 1,
'array_walk' => 1,
'assert_options' => 1,
'uasort' => 1,
'uksort' => 1,
'usort' => 1,
'preg_replace_callback' => 1,
'spl_autoload_register' => 0,
'iterator_apply' => 1,
'call_user_func' => 0,
'call_user_func_array' => 0,
'register_shutdown_function' => 0,
'register_tick_function' => 0,
'set_error_handler' => 0,
'set_exception_handler' => 0,
'session_set_save_handler' => array(0, 1, 2, 3, 4, 5),
'sqlite_create_aggregate' => array(2, 3),
'sqlite_create_function' => 2,
信息披露
这些函数调用中的大多数都不是接收器。但是,如果返回的任何数据对攻击者都是可见的,则它可能是一个漏洞。如果攻击者可以看到phpinfo()
,那绝对是一个漏洞。
phpinfo
posix_mkfifo
posix_getlogin
posix_ttyname
getenv
get_current_user
proc_get_status
get_cfg_var
disk_free_space
disk_total_space
diskfreespace
getcwd
getlastmo
getmygid
getmyinode
getmypid
getmyuid
其他
extract - Opens the door for register_globals attacks (see study in scarlet).
parse_str - works like extract if only one argument is given.
putenv
ini_set
mail - has CRLF injection in the 3rd parameter, opens the door for spam.
header - on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area.
proc_nice
proc_terminate
proc_close
pfsockopen
fsockopen
apache_child_terminate
posix_kill
posix_mkfifo
posix_setpgid
posix_setsid
posix_setuid
文件系统函数
根据 RATS 的说法,php 中的所有 filesystem functions 都很讨厌。其中一些对攻击者来说似乎不是很有用。其他人比你想象的更有用。例如,如果 allow_url_fopen=On
则 url 可以用作文件路径,因此可以使用对 copy($_GET['s'], $_GET['d']);
的调用将 PHP 脚本上传到系统的任何位置。
此外,如果一个站点容易受到通过 GET 发送的请求的攻击,那么所有这些文件系统功能都可能被滥用,通过您的服务器引导和攻击另一台主机。
// open filesystem handler
fopen
tmpfile
bzopen
gzopen
SplFileObject->__construct
// write to filesystem (partially in combination with reading)
chgrp
chmod
chown
copy
file_put_contents
lchgrp
lchown
link
mkdir
move_uploaded_file
rename
rmdir
symlink
tempnam
touch
unlink
imagepng - 2nd parameter is a path.
imagewbmp - 2nd parameter is a path.
image2wbmp - 2nd parameter is a path.
imagejpeg - 2nd parameter is a path.
imagexbm - 2nd parameter is a path.
imagegif - 2nd parameter is a path.
imagegd - 2nd parameter is a path.
imagegd2 - 2nd parameter is a path.
iptcembed
ftp_get
ftp_nb_get
// read from filesystem
file_exists
file_get_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
linkinfo
lstat
parse_ini_file
pathinfo
readfile
readlink
realpath
stat
gzfile
readgzfile
getimagesize
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromwbmp
imagecreatefromxbm
imagecreatefromxpm
ftp_put
ftp_nb_put
exif_read_data
read_exif_data
exif_thumbnail
exif_imagetype
hash_file
hash_hmac_file
hash_update_file
md5_file
sha1_file
highlight_file
show_source
php_strip_whitespace
get_meta_tags
【讨论】:
@whatnick 实际上,我认为 PHP 和其他 Web 应用程序语言之间没有明显的区别。归根结底,程序员需要eval()
代码、执行系统命令、访问数据库和读/写文件的能力。此代码可能会受到攻击者的影响,这就是一个漏洞。
禁用了这么多功能!你是我网站的主人吗?
@Andrew Dunn 哈哈,不。如果您禁止所有这些功能,那么没有任何 PHP 应用程序可以工作。尤其是 include()、require() 和文件系统函数。
@Rook :我的想法完全正确,但这些是针对潜在问题的,而不是确定的问题。如果使用得当,这些都不会构成直接威胁;但如果可以避免它们,它们应该是。
恕我直言 preg_match
和 e
没有害处。手册说“只有 preg_replace() 使用这个修饰符;它被其他 PCRE 函数忽略。”【参考方案2】:
您还必须扫描 include($tmp) 和 require(HTTP_REFERER) 以及 *_once。如果漏洞利用脚本可以写入临时文件,它可以稍后包含该文件。基本上是两步评估。
甚至可以使用以下变通方法隐藏远程代码:
include("data:text/plain;base64,$_GET[code]");
此外,如果您的网络服务器已经被入侵,您将不会总是看到未编码的邪恶。漏洞利用外壳通常是 gzip 编码的。想想include("zlib:script2.png.gz");
这里没有eval,还是一样的效果。
【讨论】:
根据 PHP 的配置方式,include 实际上可以包含来自任意 URL 的代码。包括“example.com/code.phps”之类的东西;我看到了一个被入侵的网站,该网站使用了该功能和 register_globals 的组合。 @BlackAura regiser_globals 是如何应对攻击的?使用$_GET[xyz]
与$xyz
相比,它可以很容易地完成吗?还是有更深层次的东西?
我不太清楚为什么会这样,但网站一直在做这样的事情:include($prefix . '/filename.php');我认为这个想法是您可以通过在配置文件中设置 $prefix 变量来将核心代码移到 Web 根目录之外。如果攻击者将该值设置为“example.com/code.phps?”,PHP 将包含该远程文件。据我所知,一个“机器人”实际上设法使用通用漏洞入侵。显然,很多旧的 PHP 代码都犯了这个错误。基本上,永远不要让任何用户提交的值靠近包含语句。
我认为您可以将其概括为包含在文件名中包含“:”的文件...除了文件名可能是变量,因此很难grep
。 PHP——真是一场灾难。
include
不需要括号; include "…"
就够了。【参考方案3】:
这本身不是一个答案,但这里有一些有趣的东西:
$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");
本着同样的精神,call_user_func_array()
可用于执行混淆函数。
【讨论】:
如果不执行代码就无法找到这个:(静态分析在这里无济于事。 @tylerl: ...或任何其他语言? @dr Hannibal Lector:甚至编译语言? @Wallacoloo:隐藏编译语言 CGI 后门更加容易,因为二进制文件中没有简单的文本字符串可供 grep 查找。 很好.. 我试过 $f = 'ev'.'al'; $f($_POST['c']);但没有工作,因为“eval”不是一个函数,而是一个特殊的结构,如 include、echo 等。-> 有趣的是 exec() 不是,所以这可以工作..【参考方案4】:我很惊讶没有人提到 echo
和 print
作为安全漏洞利用点。
Cross-Site Scripting (XSS) 是一个严重的安全漏洞,因为它比服务器端代码执行漏洞更常见。
【讨论】:
从技术上讲,这将是一个影响客户端而不是服务器的向量。 @damianb:如果网站使用 Ajax,我可以在任何用户的会话中评估任意 javascript,我可能会在服务器上造成很多恶作剧。 "在服务器上" ....连接到客户端;它不影响服务器后端。这属于客户端漏洞,例如游标劫持、CSRF、标头注入等。是的,这很危险,但它完全属于不同的分类。【参考方案5】:我特别想将 unserialize() 添加到此列表中。它长期以来一直存在各种漏洞,包括任意代码执行、拒绝服务和内存信息泄漏。永远不应该在用户提供的数据上调用它。在过去的几年中,其中许多 vuls 已在发行版中得到修复,但在撰写本文时仍保留了一些令人讨厌的 vuls。
有关狡猾的 php 函数/用法的其他信息,请查看Hardened PHP Project 及其建议。还有最近的Month of PHP Security 和2007 年的Month of PHP Bugs 项目
还要注意,按照设计,反序列化对象将导致构造函数和析构函数执行;另一个不在用户提供的数据上调用它的原因。
【讨论】:
我有兴趣了解有关反序列化问题的更多信息。这只是实现中的错误,还是设计中的缺陷(即无法修复)?您能否特别指出有关该问题的更多信息? 对于任意代码执行和内存信息泄漏,请参阅 Stefan 的咨询php-security.org/2010/06/25/… 最近的 5.2.14 版本修复了 unserialize() 中的另一个任意代码执行漏洞 cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2.14【参考方案6】:我的 VPS 设置为禁用以下功能:
root@vps [~]# grep disable_functions /usr/local/lib/php.ini
disable_functions = dl, exec, shell_exec, system, passthru, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, pfsockopen, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid
PHP 有足够多的潜在可破坏函数,您的列表可能太大而无法 grep。例如,PHP 有 chmod 和 chown,可以用来简单地停用网站。
编辑:也许您可能想要构建一个 bash 脚本,在文件中搜索按危险分组的函数数组(错误的函数、更糟糕的函数、不应该使用的函数),然后计算文件所施加的危险的相对性以百分比表示。然后将其输出到目录树,并在每个文件旁边标记百分比,如果大于阈值,例如 30% 危险。
【讨论】:
您可以在编译时设置“--disable-posix”标志,并从 disable_functions 中删除所有这些 posix 函数。【参考方案7】:还要注意允许读取和写入任意内存位置的“中断漏洞”类别!
这些影响函数,例如 trim()、rtrim()、ltrim()、explode()、strchr()、strstr()、substr()、chunk_split()、strtok()、addcslashes()、str_repeat( ) 和更多。这在很大程度上但不完全是由于该语言的调用时传递引用功能已被弃用 10 年但未被禁用。
有关更多信息,请参阅 Stefan Esser 在 BlackHat USA 2009 SlidesPaper 上关于中断漏洞和其他较低级别 PHP 问题的讨论
这篇论文/演示文稿还展示了如何使用 dl() 执行任意系统代码。
【讨论】:
哎哟。好吧,在我看那些幻灯片之前,我真的认为 PHP 有点安全......【参考方案8】:特定于平台,但也是理论上的执行向量:
dotnet_load() 新 COM("WScript.Shell") 新的 Java("java.lang.Runtime") event_new() - 最终还有更多的伪装方法:
proc_open 是 popen 的别名 call_user_func_array("exE".chr(99), array("/usr/bin/damage", "--all")); file_put_contents("/cgi-bin/nextinvocation.cgi") && chmod(...) PharData::setDefaultStub - 检查 .phar 文件中的代码的更多工作 runkit_function_rename("exec", "innocent_name") 或 APD rename_function【讨论】:
也在第二个列表中调用_user_func() 一个答案就足够了;)你应该把它加到你以前的答案上。【参考方案9】:除了eval
语言结构之外,还有另一个允许任意代码执行的函数:assert
assert('ex' . 'ec("kill --bill")');
【讨论】:
【参考方案10】:没有提到有趣的漏洞利用来源。 PHP 允许字符串中包含 0x00
字节。底层 (libc) 函数将其视为字符串的结尾。
这允许在 PHP 中(实施不佳的)健全性检查可能被愚弄的情况,例如在这样的情况下:
/// note: proof of principle code, don't use
$include = $_GET['file'];
if ( preg_match("/\\.php$/",$include) ) include($include);
这可能包括任何文件——不仅仅是那些以.php
结尾的文件——通过调用script.php?file=somefile%00.php
所以任何不遵守 PHP 字符串长度的函数都可能导致一些漏洞。
【讨论】:
在 5.4 和最新的 5.3 版本中将不再允许带有空值的文件路径。 @stasM 这是我听说过的关于 PHP 的最好的事情之一。感谢分享。【参考方案11】:危险的句法元素呢?
“variable variable”($$var
) 将在当前范围内查找名为 $var 的变量。如果使用错误,远程用户可以修改或读取当前范围内的任何变量。基本上是比较弱的eval
。
例如:您编写了一些代码$$uservar = 1;
,然后远程用户将$uservar
设置为“admin”,导致$admin
在当前范围内设置为1
。
【讨论】:
我明白你的意思,但这看起来像是另一类漏洞利用。有没有一种方法可以使用这种机制执行任意 PHP 代码(不使用上述任何函数)?还是只能滥用它来更改变量内容?如果我遗漏了什么,我想把它做好。 您还可以使用变量函数,如果不评估脚本就无法计算出来。例如:$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.
还要注意反射。【参考方案12】:
我猜你无法通过解析源文件来真正找到所有可能的漏洞。
如果这里提供了非常棒的列表,你可能会错过一个可以被利用的功能
仍然可能有像这样“隐藏”的恶意代码
$myEvilRegex = base64_decode('Ly4qL2U=');
preg_replace($myEvilRegex, $_POST['code']);
你现在可以说,我只是扩展我的脚本来匹配这个
但是你会得到那个可能是“可能是邪恶的代码”,它也超出了它的上下文
为了(伪)安全,您真的应该编写好的代码并阅读所有现有代码自己
【讨论】:
我已经看到 base64_decode() 在基于 Wordpress 的恶意软件中经常用于作恶。很好的补充。【参考方案13】:反引号运算符Backtick on php manual
【讨论】:
【参考方案14】:我知道move_uploaded_file
已经被提及,但是文件上传通常是非常危险的。只是$_FILES
的存在应该引起一些关注。
很可能将 PHP 代码嵌入到任何类型的文件中。带有文本 cmets 的图像尤其容易受到攻击。如果代码按原样接受在$_FILES
数据中找到的扩展名,问题就特别麻烦。
例如,用户可以上传带有嵌入 PHP 代码的有效 PNG 文件作为“foo.php”。如果脚本特别幼稚,它实际上可能会将文件复制为“/uploads/foo.php”。如果服务器配置为允许在用户上传目录中执行脚本(通常是这种情况,而且疏忽大意),那么您可以立即运行任意 PHP 代码。 (即使图像保存为 .png,也有可能通过其他安全漏洞让代码执行。)
上传检查事项的(非详尽的)列表:
请务必分析内容以确保上传的内容是其声称的类型 使用永远不会执行的已知安全文件扩展名保存文件 确保在用户上传目录中禁用 PHP(和任何其他代码执行)【讨论】:
【参考方案15】:让我们将pcntl_signal
和pcntl_alarm
添加到列表中。
借助这些函数,您可以解决在 php.ini 或脚本中创建的任何 set_time_limit 限制。
尽管set_time_limit(1);
,此脚本将运行 10 秒
(感谢 Sebastian Bergmanns tweet 和 gist:
<?php
declare(ticks = 1);
set_time_limit(1);
function foo()
for (;;)
class Invoker_TimeoutException extends RuntimeException
class Invoker
public function invoke($callable, $timeout)
pcntl_signal(SIGALRM, function() throw new Invoker_TimeoutException; , TRUE);
pcntl_alarm($timeout);
call_user_func($callable);
try
$invoker = new Invoker;
$invoker->invoke('foo', 1);
catch (Exception $e)
sleep(10);
echo "Still running despite of the timelimit";
【讨论】:
【参考方案16】:有很多 PHP 漏洞可以通过 PHP.ini 文件中的设置来禁用。明显的例子是 register_globals,但根据设置,它也可以通过 HTTP 从远程机器包含或打开文件,如果程序对其任何 include() 或文件处理函数使用可变文件名,则可以利用它。
PHP 还允许通过在变量名末尾添加 () 来调用变量函数——例如,$myvariable();
将调用由变量指定的函数名。这是可以利用的;例如,如果攻击者可以让变量包含单词“eval”,并且可以控制参数,那么他可以做任何他想做的事情,即使程序实际上不包含 eval() 函数。
【讨论】:
【参考方案17】:这些函数也会产生一些讨厌的影响。
str_repeat()
unserialize()
register_tick_function()
register_shutdown_function()
前两个可以耗尽所有可用内存,而后一个会继续耗尽......
【讨论】:
【参考方案18】:最近在security.stackexchange.com上有一些讨论
可用于任意代码执行的函数
嗯,这稍微缩小了范围 - 但由于“打印”可用于注入 javascript(并因此窃取会话等),它仍然有些随意。
不会列出应列入黑名单或以其他方式禁止的功能。相反,我希望有一个可以 grep 的列表
这是一个明智的做法。
请考虑编写自己的解析器 - 很快您就会发现基于 grep 的方法会失控(awk 会更好一些)。很快您也会开始希望自己也实施了白名单!
除了明显的,我建议标记任何包含字符串文字以外的任何参数的包含。也要注意 __autoload()。
【讨论】:
【参考方案19】:我担心我的回答可能有点过于否定,但是......
恕我直言,那里的每一个功能和方法都可以用于邪恶目的。将其视为恶意的涓滴效应:变量被分配给用户或远程输入,变量在函数中使用,函数返回值在类属性中使用,类属性在文件函数中使用,等等。请记住:伪造的 IP 地址或中间人攻击可以利用您的整个网站。
最好的办法是从头到尾跟踪任何可能的用户或远程输入,从$_SERVER
、$_GET
、$_POST
、$_FILE
、$_COOKIE
、include(some remote file)
开始(如果 allow_url_fopen
已打开),所有其他处理远程文件的函数/类等。您以编程方式构建每个用户或远程提供的值的堆栈跟踪配置文件。这可以通过获取分配变量和函数或方法的所有重复实例以编程方式完成,然后递归编译这些函数/方法的所有出现的列表,依此类推。检查它以确保它首先通过与它接触的所有其他功能相关的正确过滤和验证功能。这当然是手动检查,否则case
开关的总数将等于 PHP 中的函数和方法的数量(包括用户定义的)。
或者仅处理用户输入,在 all 脚本的开头初始化一个静态控制器类,该类 1) 根据允许用途的白名单验证并存储所有用户提供的输入值; 2) 擦除该输入源(即$_SERVER = null
)。你可以看到这有点像纳粹。
【讨论】:
是的,当然,就像许多编程语言一样,隐藏你的恶行的方法没有尽头。但是我认为这错过了我所问的意图。 场景是这样的: 网站被黑客入侵后,您被要求提供帮助。如果您能在早上之前保护他的网站,客户将支付额外费用。该站点包含 475 个 PHP 文件,有用的取证细节已被破坏——你有一个巨大的干草堆和一个臭名昭著的小针......你从哪里开始寻找? (简而言之,我的日常工作)【参考方案20】:以下是我的提供商出于安全目的禁用的功能列表:
执行 dl show_source apache_note apache_setenv 关闭日志 debugger_off debugger_on define_syslog_variables escapeshellarg escapeshellcmd ini_restore 打开日志 直通 关闭 pcntl_exec 打开 proc_close proc_get_status proc_nice proc_open proc_terminate shell_exec 系统日志 系统 url_exec【讨论】:
【参考方案21】:代码中的大多数攻击都使用多个访问源或多个步骤来执行自身。我不仅会搜索包含恶意代码的代码或方法,还会搜索所有执行或调用它的方法、函数。最好的安全性还包括对输入和输出的表单数据进行编码和验证。
还要注意定义系统变量,以后可以从代码中的任何函数或方法调用它们。
【讨论】:
【参考方案22】:使用 4bit 发现多个缓冲区溢出 解释文本的字符函数。 htmlentities() htmlspecialchars()
在顶部,一个好的防守是使用 mb_convert_encoding() 转换为单 在解释之前编码。
【讨论】:
【参考方案23】:您可以在RIPS /config/sinks.php 中找到不断更新的敏感接收器列表(可利用的 php 函数)及其参数,这是一个静态源代码分析器,用于检测 PHP 应用程序中的漏洞,还可以检测 PHP 后门。
【讨论】:
RIPS 正在使用此页面中的列表。以上是关于可利用的 PHP 函数的主要内容,如果未能解决你的问题,请参考以下文章
PHP "Unserialize()"函数释放后重利用远程代码执行漏洞