thinkphp代码审计需从index.php入口跟踪请求生命周期,重点关注app::run()后的路由解析、反序列化入口、魔术方法链、模型层sql注入绕过及模板引擎eval风险。

从入口文件开始跟踪请求生命周期
ThinkPHP的代码审计不能跳过入口逻辑。所有HTTP请求都经由index.php进入,它加载thinkphp/base.php并实例化think\App对象。关键点在于App::run()调用后,框架会解析URL、匹配路由、实例化控制器——这个链路一旦被污染,后续所有环节都可能失控。
实操建议:
- 在
index.php末尾加var_dump($_SERVER['REQUEST_URI']);die;确认实际进入路径,避免被伪静态或Nginx重写干扰判断 - 搜索
app()->bind或Container::getInstance()->bind,这些地方常被用于绑定恶意类或覆盖核心服务 - 重点关注
think\Route类中的parseUrl和dispatch方法,它们直接决定哪个控制器/方法被执行,且参数未经过滤时极易引入RCE或目录遍历
盯紧魔术方法与反序列化入口点
ThinkPHP 3.2.x 和 6.x 的反序列化漏洞均始于对用户输入的盲目反序列化,典型入口是unserialize(base64_decode($_GET['data']))或unserialize(file_get_contents('php://input'))。但真正危险的是后续触发的__destruct、__wakeup、__toString等魔术方法链。
实操建议:
- 全局搜索
unserialize(、base64_decode(、file_get_contents('php://input'),尤其注意控制器中以test、debug、callback命名的方法 - 在
think\Model(3.x)或think\orm\Model(6.x)中检查__destruct是否调用save()、update()等可被控制的方法;6.x中Model::__destruct依赖$this->lazySave,该属性若来自用户输入即构成可控支点 - 搜索
__toString实现,例如think\model\concern\Conversion::__toString会调用toJson()再调用toArray(),若$this->data含恶意对象,可能二次触发__get或__call
模型层SQL注入的过滤绕过模式
ThinkPHP的where()、find()、select()等方法看似安全,但底层使用parseWhere解析条件时,若传入数组键名或值未严格校验,就会绕过think_filter的黑名单(如updatexml、extractvalue未被拦截)。
实操建议:
- 定位
Think\Model->where()调用处,检查参数是否直接来自I('id')、input('get.id')等未过滤函数 - 跟进
parseWhere逻辑,注意当条件为array('id' => array('exp', 'and updatexml(1,concat(0x7e,(select user())),0x7e)'))时,exp类型会被放行,而concat和子查询不会被think_filter识别 - 对比
3.2.3与5.1.31+的parseSet函数差异:老版本对:xxx占位符仅做简单in_array判断,新版本引入bind机制但若开发者手动拼接SQL仍无效
模板引擎执行与show/display方法利用
show()和display()方法本身不是漏洞,但当$content参数完全可控且TMPL_ENGINE_TYPE设为php时,会直接eval传入内容。更隐蔽的是think引擎下,模板缓存生成过程也会解析<?php 标签。
实操建议:
- 搜索
show(、display(调用,检查第一个参数是否来自$_GET、$_POST或input(),例如$this->show(I('tpl')) - 若
TMPL_ENGINE_TYPE === 'php',构造?tpl=<?php %20system('id');?>即可执行命令;若为think,需触发缓存生成(首次访问),此时<?php仍会被保留并最终include - 注意
Runtime/Cache/目录权限和缓存文件名生成逻辑,部分环境因md5($content)导致无法预测路径,需配合phpinfo()泄露绝对路径再包含
真正难啃的是跨组件联动:比如反序列化触发Model析构 → save()写入恶意data → 后续where查询时该data被当作条件解析 → 最终进eval或system。这种链式污染在审计时必须逐层标记可控变量,漏掉任意一环,POC就跑不通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











