关于 emlog pro 的 AI 助手 execute_tool 端点缺少 CSRF 保护的 PoC,它允许攻击者利用管理员已认证的会话,对站点数据库执行任意 SQL——包括完全接管管理员账户。
| CVE | CVE-2026-73847 |
| CNA | GitHub |
| 公告 | GHSA-v6wr-4x55-7qp5 |
| CVSS 3.1 | 6.8 中危 — AV:N/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:N |
| CWE | CWE-352 (CSRF)、CWE-1275 (SameSite 设置不当)、CWE-798 (硬编码写入确认字符串) |
| 受影响版本 | emlog pro 2.6.23 及更早版本 |
| 致谢 | Dostxodjayev Abdullox (@squeeze440) — CVE 记录中的署名待更正,见下文 |
emlog pro 的后台管理面板内置了一个 AI 助手,可通过 POST /admin/ai.php?action=execute_tool 代替管理员执行 SQL。多个问题叠加在这一端点上:
admin/ 下所有其他破坏性操作文件都会先调用 LoginAuth::checkToken()(例如 admin/media.php:140),而 admin/ai.php 从未这样做。admin/ai.php:152、User::isAdmin())——没有 Origin/Referer 检查。include/service/ai.php:594:if (trim($confirm_code) !== 'confirm')。任何伪造请求只需发送 confirm_code=confirm 即可。include/service/ai.php:578,589)——仅凭一个已认证请求即可 SELECT 任意表。blog 表受写入保护(include/service/ai.php:591)—— 及其他所有表均可完全写入。串联起来:来自管理员浏览器的一个伪造请求即可读取所有表(包括密码哈希),并写入除 blog 之外的所有表,包括直接覆盖 user.password。
poc_raw_impact.sh)将 SQL/认证绕过原语与 CSRF 投递问题分离开来。在你控制的本地实例上运行:
./poc_raw_impact.sh http://TARGET admin '<adminpass>'
该脚本以 admin 身份登录,通过列别名绕过方式导出密码哈希,直接经由 user 表覆盖管理员密码,随后使用全新的 cookie jar 以攻击者选定的密码再次登录——证明只要有一个已认证请求到达该端点,即可实现完整账户接管。

poc_csrf.html)用真实浏览器验证 SameSite 问题,而非凭空假设。从与目标不同的任意源托管 poc_csrf.html(不同的 IP 即可——Chrome 将不同的字面量 IP 视为不同站点),并让已登录的管理员在登录后约两分钟内打开它:
python3 -m http.server 8888
# then point poc_csrf.html's form action at your target and get it opened
该表单在加载时自动提交,跨站 POST 一个伪造的 query_database 调用,并附带 confirm_code=confirm。

已实测验证:该伪造的跨站 POST 携带了管理员真实的认证 Cookie(sec-fetch-site: cross-site,Cookie 已附带),返回 200 {"code":0,"msg":"ok",...},且通过后续的一次已认证读取确认了注入行确实存在。约 48 分钟后,对同一个现已陈旧的 cookie jar 重复完全相同的请求则失败——未附带任何 Cookie,服务器返回了未认证重定向,从而证实约两分钟的 Lax+POST 窗口才是真正的限制条件(反映在 AC:H 中)。
emlog_options 中的任何机密(SMTP 凭据、API 密钥等)。blog 外的所有表,包括 user——可覆盖角色/密码/邮箱,已端到端演示为账户接管。role=admin 的账户;writer/editor 会被 User::checkRolePermission() 阻止。这不是从低权限角色的提权——而是将管理员登录状态下的一次恶意链接点击,转化为对站点的完全、悄无声息的攻陷。在 execute_tool 中加入 LoginAuth::checkToken(),在认证 Cookie 上设置 SameSite=Strict,并将静态的 confirm_code 字符串替换为真正的每会话一次性令牌。完整的修复细节见安全公告。
署名说明: 尽管 GHSA 本身已对报告者致谢并接受其提交,但作为 CNA 的 GitHub 在发布 CVE 记录时却没有附上 credits 条目。更正请求已于 2026-08-16 发送至 [email protected];若该记录得到更正,本 README 将随之更新。
本内容在安全公告公开且 CVE 已分配之后发布,仅供防御/教育用途。请勿对你不拥有或未经明确授权测试的 emlog 实例运行本 PoC。
userpassword(include/service/ai.php:822-828)——SELECT password AS pwd_hash FROM user 会返回原始哈希。SameSite 属性(include/lib/loginauth.php:99),Chrome 默认的“Lax+POST”宽限期(登录后大约前两分钟)成了该漏洞与可靠跨站投递之间的唯一屏障。