排查php框架命令执行漏洞需三步:一、用grep搜索高危函数调用点并确认参数是否源自$_get等外部输入;二、追溯变量污染路径,检查过滤有效性;三、验证绕过可能性并审查框架特有入口。

排查PHP框架中命令执行漏洞,就是揪出那些把用户输入直接喂给system()、exec()这类函数的危险调用链,避免黑客通过构造恶意参数在服务器上任意执行系统命令。
定位高危函数调用点
打开项目根目录,用grep递归搜索所有PHP文件中的敏感函数:grep -r "system\|exec\|shell_exec\|passthru\|pcntl_exec\|popen\|proc_open" --include="*.php" .
重点检查控制器(Controller)、模型(Model)、工具类(Helper/Util)和路由处理逻辑里的调用位置,这些地方最常出现未过滤的用户输入拼接。
【必须确认参数是否来自$_GET、$_POST、$_REQUEST、$_SERVER等外部输入】,如果函数第一个参数是硬编码字符串(如system("ls -l")),则不构成漏洞;但只要含变量(哪怕只是拼接一个$_GET['cmd']),就必须进入下一步验证。
追溯参数污染路径
第一步:找到上一步定位到的高危函数调用行,例如:exec($_GET['command']);
第二步:向上逐行追踪该变量的赋值来源——是否经过任何过滤?是否被多次赋值覆盖?是否从$_POST取值后又经json_decode()二次解析?
第三步:检查是否存在“看似过滤实则无效”的情况,比如仅用trim()或strtolower()处理,却未对分号、管道符、反引号、$()等命令分隔符做拦截。
这一步操作起来很简单,直接把文件拖进去就行。但容易踩的坑是:只看最近一次赋值,忽略中间层函数调用中可能发生的变量重写或数组合并(如array_merge($_GET, $default)后再传入exec)。
验证绕过可能性
方法一:构造基础payload测试
访问URL形如?command=id,观察响应是否返回当前用户UID/GID信息;若返回,则漏洞可利用。
方法二:尝试绕过常见黑名单
若代码中存在if (stripos($cmd, 'rm|cat|flag') !== false) die();这类校验,立即测试:?command=ca%00t%20/flag.php(利用%00截断)或?command=echo%20$(id)(用命令替换绕过空格过滤)。
方法三:检查是否启用disable_functions
在phpinfo()页面或通过echo ini_get('disable_functions');确认system/exec等是否已被禁用;若已禁用,仍需检查是否有未被禁用的替代函数(如popen)残留。
【注意:某些框架会将用户输入先base64_decode()再执行,务必检查解码逻辑是否可控】
检查框架特有执行入口
ThinkPHP:搜索input()、I()、get()等函数调用,尤其关注与shell_exec组合使用的场景,例如shell_exec('ping '.input('ip'))。
Laravel:检查Artisan::call()是否接收用户传参,如Artisan::call('queue:work --max-jobs='.request()->input('jobs')),该参数若未校验,可注入--env=prod;cat /etc/passwd。
Yii2:重点审查yii\helpers\Console::execute()及自定义命令中$this->options的使用,确认是否对$argv或$_SERVER['argv']做过滤。
这一步不需要写代码,直接用编辑器全局搜索关键词即可完成。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











