thinkphp用户输入点定位:入口文件public/index.php仅为起点,核心输入点在控制器中对request()、$_get/$_post及路由变量(如:user/:id)的未过滤使用,需重点审计store/update方法、db::query拼接、文件操作路径拼接及权限校验逻辑。

入口文件和路由怎么定位用户输入点
ThinkPHP 的用户输入几乎都从 public/index.php 开始,但真正要抓漏洞,得跳过入口,直接盯住控制器方法里对 request() 或超全局变量的使用。别在入口文件里反复看 require base.php——它不处理业务逻辑。
实操建议:
- 在 PhpStorm 中全局搜索
request()->、$request->、input(、param(,尤其注意没加validate()的store()、update()方法 - 同时搜
$_GET[、$_POST[、$_REQUEST[—— ThinkPHP 5/6 虽推荐用 request 对象,但老项目或补丁代码常直取超全局变量 - 留意路由定义中带变量的部分,比如
route.php里get('user/:id', 'index/user/info'),:id会透传进控制器,若没做intval()或正则约束,就可能引发类型混淆或 SQL 注入
哪些函数调用链最容易出 SQL 注入
不是所有 Db::query() 都危险,关键看参数是否拼接了未过滤的用户输入。ThinkPHP 的查询构造器(如 where())本身安全,但一旦混用原生 SQL 或字符串拼接,风险立刻上升。
常见高危组合:
-
Db::query("SELECT * FROM user WHERE id = " . $_GET['id'])—— 直接拼接,无过滤即沦陷 -
Db::name('user')->where('id', $_GET['id'])->find()—— 看似安全,但如果$_GET['id']是数组(如?id[0]=exp&id[1]=1),可能触发表达式注入 -
model->where($map)->select()中$map来自input('map/a')且未校验键名,攻击者可传map[username] => admin&map[password] => 123&map[1][exp] => 1=1绕过
查法:用 IDE 的「Find Usages」反向追踪 Db::query、think\Db::execute、mysqli_query(若手动封装了底层连接)的每个调用点,逐个确认输入来源。
文件操作类漏洞集中在哪些位置
ThinkPHP 自身对 file_get_contents、readfile 这类函数不做封装,所以漏洞基本出现在开发者写的下载、模板加载、配置读取逻辑里。最典型的是用 $_GET['file'] 拼路径后直接传给 readfile()。
典型错误模式:
-
$file = ROOT_PATH . 'public/uploads/' . $_GET['name']; readfile($file);—— 无路径规范化、无白名单、无realpath()校验,?name=../../../runtime/log/202610/15.log直接读日志 -
include $template;中$template来自数据库或配置项,且未限制目录范围,可能被写入恶意路径 -
move_uploaded_file($_FILES['file']['tmp_name'], $dest)的$dest包含用户可控字段(如$_POST['dir']),导致目录穿越或覆盖关键文件
注意:ThinkPHP 5.1+ 的 think\File 类自带扩展名校验,但很多项目仍手写上传逻辑,绕过框架防护。
权限控制为什么总被绕过
ThinkPHP 的 @auth、@can、中间件(如 CheckAuth)只是“开关”,不等于“锁”。真正失效往往因为权限判断逻辑写在控制器里,而攻击者能通过 URL 直接访问未受保护的方法,或者中间件没注册到对应路由分组。
检查要点:
- 看
app/middleware.php或路由分组中是否漏配中间件,比如后台路由用了group(['middleware' => ['auth']], function () { ... }),但某个导出接口写在了 group 外 - 查
Gate::allows('delete', $post)这类调用,确认$post是否真从数据库查出——如果直接用input('id')构造模型,攻击者可传任意 ID 绕过模型级授权 - 注意
Auth::id()返回 null 时的默认行为,有些代码写成if (!Auth::id()) redirect('/login'),但没 exit 或 return,后续逻辑仍执行
最隐蔽的坑是「水平越权」:同一个控制器方法既处理自己的数据,也处理他人的,仅靠前端隐藏按钮,后端没校验当前用户与资源 owner 是否一致。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











