第一步确认框架类型与入口文件:访问首页查看http响应头x-powered-by或源码,无标识则查index.php及composer.json;第二步定位版本号——thinkphp搜think_version、laravel查application.php的version常量,版本决定漏洞池;第三步抓真实请求映射控制器,依路由文件(route.php/web.php/routes.php)反推类路径;第四步在控制器中逆向追踪$_get/$_post等输入点,检查是否进入sql拼接、文件包含、反序列化等高危函数;第五步验证中间件绕过,通过删 middleware 声明、审查 handle() 逻辑、构造越权url测试权限失效;第六步扫描exec/system/eval等危险函数及composer audit检测第三方漏洞。

你要对一个正在运行的PHP框架项目做安全审计,不是写报告、不是交差,是真刀真枪找出能被利用的漏洞路径——从入口路由开始追数据流,到中间件绕过、SQL拼接点、反序列化触发点,最后验证是否可执行任意代码。
定位框架类型与入口文件
第一步不是打开代码,而是访问首页源码或HTTP响应头,看有没有X-Powered-By: ThinkPHP、Laravel、CodeIgniter等标识;没有就查public/index.php或index.php是否存在,再看composer.json里require字段是否含"topthink/framework"或"laravel/framework"。
找到入口后立刻确认框架版本:ThinkPHP在thinkphp/base.php搜THINK_VERSION,Laravel在vendor/laravel/framework/src/Illuminate/Foundation/Application.php找VERSION常量——【版本号决定漏洞池范围,5.0.24和8.0.0的可利用链完全不同】。
这一步操作起来很简单,直接把base.php拖进编辑器全局搜索就行。
抓取真实请求并映射到控制器
用浏览器开发者工具→Network→刷新页面,过滤XHR或Doc,点开任意一个带参数的请求,记下完整URL(如/admin/user/edit?id=123)和请求方法(GET/POST)。
对照框架路由定义文件定位处理逻辑:
- ThinkPHP 5.x:查route/route.php或application/route.php,找匹配admin/user/edit的Route::get()或Route::post()规则,看绑定的控制器类名(如'admin/User' => 'controller.User' );
- Laravel:查routes/web.php,用Route::get('/admin/user/edit', [UserController::class, 'edit'])反推类路径;
- CodeIgniter:查app/Config/Routes.php,匹配$routes->get('admin/user/edit', 'User::edit')。
控制器文件路径确定后,立即打开对应PHP文件,找到目标方法(如edit()),这是后续所有审计的起点。
逆向追踪用户输入数据流
第一步:在控制器方法内搜索$_GET、$_POST、$_REQUEST、$request->get()、$request->input()等接收点,标记所有可控变量(如$id = $request->input('id');)。
第二步:逐行跟踪该变量是否进入高危函数——重点盯住以下三类调用链:
- Db::table()->where()->find()或query("SELECT * FROM user WHERE id = ".$id) → 若$id未经过intval()或预处理,就是SQL注入候选点;
- file_get_contents($_GET['file'])或include $_POST['template'] → 直接触发LFI/RFI或代码执行;
- unserialize($_COOKIE['data'])或Phar::loadFromData($phar_data) → 检查是否启用__wakeup/__destruct且存在POP链可用 gadget。
第三步:若变量经由模型层传递(如UserModel::getById($id)),必须跟进模型方法,不能停在控制器——很多漏洞藏在app/model目录下的whereRaw()或DB::raw()调用里。
验证中间件与权限控制失效点
方法一:手动删掉路由绑定的中间件声明,比如把Route::get('/admin/log', [LogController::class, 'index'])->middleware('auth.admin');临时改成->middleware('throttle:0,1'),然后直接访问URL看是否还能进后台页面。
方法二:检查中间件源码(如app/Http/Middleware/AuthAdmin.php),重点看handle()方法里是否有return $next($request);无条件放行,或只校验session('user_type') === 'admin'却没验证该session是否真实存在、是否被篡改。
方法三:构造越权请求,比如登录普通用户后,把URL中/user/profile改成/admin/config,观察返回状态码和响应体——【HTTP 200不等于权限有效,要确认返回内容是否真为管理员配置页】。
扫描危险函数与第三方组件漏洞
打开终端,进项目根目录,执行:grep -r "exec\|system\|passthru\|eval\|assert\|create_function" ./app/ --include="*.php",筛出所有可能执行命令的函数调用位置。
接着运行:composer outdated --direct列出直连依赖,再运行:composer audit(需提前composer global require roave/security-advisories),输出含CVE编号的漏洞包列表。
对每个报出漏洞的包,去OSV.dev或Snyk.io查具体影响版本和PoC——例如monolog/monolog Logger::addHandler(new SocketHandler(...))且日志内容可控。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











