PHP 5.6命令执行漏洞审计核心是追踪用户可控输入(如$_GET、$_POST)是否未经白名单校验或有效过滤,直接/间接流入system()、exec()、eval()、assert()、preg_replace(/e)等高危函数;需特别关注PHP 5.6特有风险,如assert()字符串执行、/e修饰符残留、反序列化__wakeup绕过及disable_functions未禁用等。

PHP 5.6 网站命令执行漏洞审计,核心是识别“用户可控输入”如何被直接或间接送入高危函数执行。这不是靠猜,而是按数据流向逐层检查:从请求入口($_GET、$_POST、$_COOKIE、$_SERVER)出发,追踪变量是否未经校验就进入执行类函数。
重点盯防的危险函数调用
在代码中快速定位以下函数的使用位置,尤其关注其参数是否包含任何外部输入:
-
eval()、assert():直接将字符串当PHP代码执行,最危险; -
system()、exec()、shell_exec()、passthru()、proc_open():调用系统命令; -
include、include_once、require、require_once:若文件路径由用户控制,可能触发远程/本地文件包含(LFI/RFI); -
preg_replace('/.*/e', ...)(PHP 5.6 中仍支持/e修饰符):正则替换时执行代码; -
unserialize():反序列化用户输入,配合魔术方法(如__wakeup、__destruct)可触发代码执行; -
file_get_contents('php://input')或file_get_contents($_GET['url']):读取并执行原始请求体或任意URL内容。
检查输入是否被“消毒”或限制
找到上述函数调用后,立刻判断其参数是否经过有效处理:
- 有没有白名单校验?例如只允许
$_GET['action']是'list'、'view'等固定值; - 是否用了
escapeshellarg()或escapeshellcmd()?注意:前者仅适用于单个参数,后者不能完全防住复杂命令拼接; - 路径类操作是否做了
realpath()+basename()双重校验?防止../路径穿越后仍被包含; - 对
unserialize()是否加了allowed_classes参数(PHP 7+)?PHP 5.6 需自行实现类名白名单逻辑; - 是否存在看似过滤实则绕过的写法?比如用
str_replace('cat', '', $input),攻击者可传catt或大小写混用绕过。
关注 PHP 5.6 特有风险点
该版本存在一些已知且易被忽略的陷阱:
-
assert()在zend.assertions=1(默认开启)且assert.exception=0时,第二个参数可为代码字符串; -
preg_replace的/e修饰符虽已弃用,但在 PHP 5.6 中仍可用,且常被开发者误认为“只是正则”,实际等同于eval; - 反序列化中
__wakeup()绕过漏洞存在于 PHP 5.6.25 之前版本(如 5.6.24),若对象属性数量被篡改,wakeup不会触发,导致后续逻辑失控; - 未禁用
disable_functions配置中的危险函数(如system,exec,shell_exec,eval,passthru),仅靠代码层防护不够稳健。
辅助验证手段
静态扫描之外,配合简单动态测试提高命中率:
- 对疑似功能点(如搜索框、文件名参数、回调地址)尝试传入
id、whoami、phpinfo()等关键字,观察回显或响应时间变化; - 用
sleep(5)测试是否存在命令延迟,确认命令是否真正执行; - 检查 HTTP 响应头或页面源码中是否泄露 PHP 版本、错误信息(如
display_errors=On),这会极大降低审计门槛; - 查看
phpinfo()页面(如有),确认disable_functions、allow_url_include、safe_mode(已废弃但旧配置可能残留)等关键安全配置项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











