使用静态分析工具扫描thinkphp项目中的可控include和call_user_func,核心在于配置规则以捕获动态函数调用并追踪变量来源。推荐使用semgrep或rips等支持php语法的工具,通过编写yaml规则匹配include、require及call_user_func等危险函数,并结合数据流分析标记未过滤的超级全局变量(如$_get)作为污染源。这种方法能自动识别出直接拼接用户输入到文件包含或函数执行中的代码路径,从而定位潜在的文件包含漏洞(lfi/rfi)和任意函数调用风险。

如何检测动态文件包含漏洞
针对ThinkPHP项目中常见的include和require语句,静态分析需要识别那些参数直接来源于用户输入的节点。在ThinkPHP中,控制器通常通过$this->request->param()或input()助手函数获取数据,若这些数据未经严格校验便传入文件操作函数,即构成漏洞。配置扫描规则时,应重点监控include、require_once等标签,并检查其操作数是否源自$_GET、$_POST或框架特定的请求对象方法。

rules:
- id: php-thinkphp-insecure-include
patterns:
- pattern: include($VAR);
- pattern-inside: |
function $FUNC(...) {
...
}
message: "Potential insecure file inclusion in ThinkPHP"
severity: WARNING
metadata:
category: security
technology:
- php
- thinkphp
languages: [php]
fix:
regex: \$VAR
replacement: "sanitize($VAR)"
上述Semgrep规则示例展示了如何捕捉简单的include调用。在实际的ThinkPHP项目中,由于存在大量的路由分发和中间件处理,变量$VAR往往经过多层传递。因此,更有效的做法是结合数据流追踪,确保只有当$VAR的最终来源被确认为不可信的用户输入且未通过白名单过滤时,才触发告警。对于ThinkPHP 5.x及6.x版本,特别注意Loader::import或think\facade\File类中的相关方法,它们内部可能封装了文件包含逻辑。
如何排查call_user_func系列函数的滥用
call_user_func及其变体(如call_user_func_array)在ThinkPHP中常用于实现插件机制或动态方法调用,但若第一个参数(回调名称)可由用户控制,则可能导致任意代码执行。静态分析需聚焦于这些函数的第一个参数,追踪其值是否来自外部请求。在ThinkPHP中,这通常发生在自定义控制器或扩展包中,开发者可能直接将$_GET['func']作为回调名传入。

rules:
- id: php-thinkphp-call-user-func-risk
patterns:
- pattern: call_user_func($CALLBACK, ...)
- pattern-not-inside: |
if (in_array($CALLBACK, $WHITELIST)) { ... }
message: "Unsanitized callback in call_user_func"
severity: ERROR
languages: [php]
该规则旨在捕获未进行白名单校验的call_user_func调用。在ThinkPHP环境中,许多框架内置的方法调用已经过安全处理,因此扫描时应排除框架核心目录,仅关注应用层代码(如app/controller)。此外,需注意create_function(已废弃但仍有遗留代码)和eval的组合使用,它们与call_user_func类似,都涉及动态代码执行。通过限制可执行的回调范围,例如仅允许特定命名空间下的类方法,可以显著降低此类风险。
基于ThinkPHP路由参数直接传入include的具体问题
在ThinkPHP中,如果路由定义不当,导致URL参数直接映射到文件包含操作的变量上,将产生高危漏洞。例如,某控制器方法接收file参数并直接用于include,攻击者可通过构造?file=../../config/database.php读取敏感配置。静态分析工具必须能够解析ThinkPHP的路由规则,识别出哪些路由参数可能被传递给危险函数。这种场景下,变量来源明确为HTTP请求,且缺乏任何 sanitization 步骤,属于典型的注入点。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











