PHP框架中匿名函数若被用户输入污染并直接执行会导致任意代码执行漏洞,审计需重点识别可控参数进入call_user_func、array_map等动态调用位置的路径,并通过反向回溯、污点分析和Hook方法确认污染链。

PHP框架中匿名函数若被用户输入污染并直接执行,会导致任意代码执行漏洞,审计时需重点识别可控参数进入call_user_func、array_map等动态调用位置的路径。
定位匿名函数定义与调用点
在框架源码中全局搜索function(、fn(、=> function(,注意匹配换行和空格变体,如function\n($a)或function/*comment*/($b)。
对每个匹配结果,向上追溯其赋值来源:若该匿名函数变量由$_GET、$_POST、路由参数、配置文件读取或数据库查询结果直接赋值,立即标记为高危候选。
特别检查Laravel的Route::get('/xxx', function() { ... })、ThinkPHP的Route::rule('x', function() {})这类注册式写法——【此处匿名函数体本身不可控,但若内部调用链引入了用户输入,则风险转移到调用链下游】。
立即学习“PHP免费学习笔记(深入)”;
追踪用户输入进入回调函数的路径
方法一:从危险函数反向回溯
找到所有call_user_func、call_user_func_array、array_map、array_filter、usort、uasort等函数调用,检查其第二个及以上参数是否为变量;若该变量是匿名函数且由上层传入,逐层跟进该变量的定义位置。
方法二:污点分析式正向跟踪
以$_REQUEST为起点,使用IDE的“Find Usages”功能,观察其值是否经trim、intval等过滤后仍保留进字符串拼接、变量名解析(如$$var)、或作为回调函数名传入call_user_func——【一旦发现未过滤的$_REQUEST键名直接用于创建匿名函数参数名或闭包绑定变量名,即可确认漏洞】。
方法三:Hook关键魔术方法
在__invoke方法定义处下断点,运行典型请求(如带callback=xxx参数的URL),观察是否触发;若触发且$this对象属性含用户输入,则说明该匿名函数已被污染实例化。
验证漏洞是否存在
第一步:构造POC确认执行权限
在疑似位置插入echo 'test_'.phpinfo();并发起请求,观察响应中是否包含phpinfo输出;若成功,说明匿名函数上下文具备完整执行能力。
第二步:检查沙箱隔离状态
执行system('id')或shell_exec('whoami'),若返回当前Web服务运行用户(如www-data),说明无有效执行隔离;若报错为disabled functions,则需转向assert、create_function等替代利用链。
第三步:确认调用链无中断过滤
检查从输入接收点到匿名函数执行点之间,是否经过preg_replace('/.*/e')、eval()、or die()等会提前终止流程的语句;如有,该路径实际不可达,需另寻其他入口。



















