OctoDevStudios/YellowKiosk
GitHub: OctoDevStudios/YellowKiosk
一个针对欧洲零售商交互式自助终端系统的真实安全审计案例研究,系统性地展示了Kiosk部署中硬编码凭据、明文存储、信息泄露等多种CWE漏洞及其修复建议。
Stars: 0 | Forks: 0
# Project-Yellow-Kiosk : 零售安全审计 (2026) 🔍
## 法语 🇫🇷
         
**项目描述** 📝
本仓库包含对一家**欧洲/瑞士主要多媒体零售商**在生产环境中使用的交互式自助服务终端 (Kiosk) 系统的结构化数据转储和漏洞分析。其目的具有教育意义:揭示零售环境中常见的实现模式与错误。
**已识别的安全漏洞 (CWE)** ⚠️
- CWE-798 — 使用硬编码凭据:admin 密码在客户端/代码中被暴露。
- CWE-312 — 敏感信息明文存储:密码/凭据以明文形式存储在 `data/product.json` 中。
- CWE-200 — 向未经授权的参与者暴露敏感信息:文件系统 (FS) 上的配置文件和数据转储可被读取。
- CWE-78 — 操作系统命令中使用的特殊元素未正确中和(OS 命令注入):执行本地脚本(.bat / powershell)— 存在潜在风险/未确认:如果使用了用户输入,需评估此风险。
- CWE-276 — 默认权限不正确:JSON 文件和静态资源可能被 Web 进程访问/修改而未进行安全加固。
**观察到的技术栈** 🧰
- Frontend / UI:`web/product.php`(单文件 PHP 渲染),内嵌 CSS/JS。
- 本地存储:`data/product.json`(扁平 JSON)和文本文件(如:`web/assets/selected_image.txt`)。
- 静态资源:`web/assets/`(图像、徽章、促销)。
- 脚本 / 运行时:`php/`(目录树中提供的 PHP 二进制文件)和 Windows 脚本(`quit_kiosk.bat`),PowerShell 对本地部署很有用。
- 目标环境:Windows (kiosk mode) / 处于 Kiosk 模式的 Edge。
**转储结构(节选)** 🗂️
- `data/product.json` — 产品数据、设置和各语言翻译。
- `web/product.php` — UI 入口点、管理逻辑和保存功能。
- `web/assets/` — 图像和资源。
- `web/quit_kiosk.bat` — 终端退出脚本。
- `php/` — 随处分发的二进制文件(本地服务器)。
**建议(修复方案)** 🛠️
- 移除硬编码密码,切勿在客户端暴露;实现基于服务器的身份验证。
- 切勿将密码以明文形式存储:使用 `password_hash()` / `password_verify()` (PHP) 并限制文件访问权限 (ACL/权限)。
- 限制 `data/` 目录的 FS 权限(由 kiosk 用户所有,设置最小 chmod)。
- 避免直接从应用程序代码执行 OS 命令;将此行为隔离在安全的服务中,或使用受限的 OS API。
- 添加日志记录和告警机制,监控对 `product.json` 的访问和修改。
- 验证并编码所有用户输入(即使在本地管理后台中)。
**方法论** 🔬
- 对可用源代码进行静态分析,检查导出的文件和脚本。
- 本仓库未包含主动的渗透测试或在生产环境中的利用——分析仅限于所提供的内容。
**影响** 📉
- 硬编码凭据和明文密码:严重程度高——如果攻击者能够读取文件或访问 UI,就能轻易获取管理员权限。
- 产品数据暴露:严重程度中等(机密性,定价泄露)。
**局限性** ⚖️
- 审计基于仓库中提供的静态工件;生产系统的实际状态(OS 权限、网络、部署策略)未经验证。
**免责声明** ⚖️
*本项目是一项网络安全案例研究。所有品牌名称、真实标识符和敏感数据均已匿名化或修改(`[原始零售商]` -> `YellowKiosk`)。作者不鼓励任何非法活动,并对这些信息的使用不承担任何责任。*
**许可证 / 用途** 📚
仅供教育用途 — 请参阅页眉的许可证徽章。
**操作说明 (Kiosk — FR)** 🧭
- **管理员密码(默认)**:`Admin_1025`。如果您通过管理员界面更改密码,新值将持久化保存在 [data/product.json](data/product.json) 的 `settings.admin_pwd` 中。
- **访问管理面板**:三击产品标题(左上角)。将出现一个密码输入框;输入管理员密码以显示编辑面板。
- **更改管理员密码**:在管理面板中,"Accès Administration" 选项卡,在 "Modifier le mot de passe admin" 字段中填写新密码,然后点击 "💾 Mettre à jour l'étiquette" 进行保存。
- **修改产品**:在管理面板(表单)中,您可以修改并保存以下字段(括号中为 JSON 路径):
- **Code Article (SKU)**:`article.code_article`
- **名称 / 显示标题**(按语言):`article.designation` 和 `translations[].article.designation`
- **屏幕尺寸**(按语言):`article.ecran` 和 `translations[].article.ecran`
- **RAM**:`pc.ram_gb`
- **系统**(按语言):`pc.systeme` 和 `translations[].pc.systeme`
- **处理器**(按语言):`pc.processeur` 和 `translations[].pc.processeur`
- **显卡**(按语言):`pc.carte_graphique` 和 `translations[].pc.carte_graphique`
- **存储**(按语言):`pc.stockage` 和 `translations[].pc.stockage`
- **配件**(按语言):`pc.accessoires` 和 `translations[].pc.accessoires`
- **充电器**:`pc.chargeur_key` 中的规范键值(例如:`included`),以及 `pc.chargeur` / `translations[].pc.chargeur` 中的本地化标签
- **基础价格 / 促销价格**:`article.prix_yellowkiosk`,`article.prix_promo`
- **价格类型**:`article.type_prix_key` 中的规范键值(本地化标签)
- **显示货币**:`settings.devise`(`chf` 或 `eur`)
- **管理语言**:`settings.lang`(`fr`,`en`,`de`,`es`)— 更改语言后,如果 `translations[lang]` 可用,将用其预填充字段。
- **保存**:"💾 Mettre à jour l'étiquette" 按钮将更改发送到服务器(`POST` 到 `web/product.php`),该服务器会以原子方式更新 `data/product.json` 和 `web/assets/selected_image.txt`。
- **图像**:将图像放置在 `web/assets/` 中;通过管理面板进行选择。`web/assets/selected_image.txt` 包含两张选定的图像(上 / 下)。
- **在显示端更改语言**:
- 临时 (URL):在 URL 中添加 `?lang=fr|en|de|es`。
- 永久:在管理面板中选择语言并保存(`settings.lang`)。
- **显示货币**:
- URL:`?devise=chf|eur` 强制以 CHF 或 EUR 显示。
- 永久:在管理面板中选择货币并保存(`settings.devise`)。
- **退出终端**:"Quitter le kiosk" 按钮 → 确认 → 触发 `POST quit_kiosk` 到 `web/product.php`。在 Windows 上,将执行 `web/quit_kiosk.bat` 以强制终止 `msedge.exe`、`php.exe` 和 `cmd.exe`。⚠️ 破坏性操作。
- **在本地启动**:
```
# 从仓库根目录(如果 php 在 PATH 中)
cd web
php -S localhost:8000
```
或在 Windows 上使用提供的二进制文件:
```
cd web
..\\php\\php.exe -S localhost:8000
```
- **安全 / 重要提示**:
- 管理员密码以明文形式存储在 `data/product.json` 中:存在重大风险。为了安全部署,请使用 `password_hash()` / `password_verify()`,限制 FS 权限,并且绝对不要在客户端暴露机密信息。
- "Quitter le kiosk" 操作会执行系统命令;在公开此功能之前,请验证权限和环境。
## 英语 🇬🇧
         
**项目描述** 📝
本仓库包含对一家**主要多媒体零售商(欧洲/瑞士)**在生产环境中使用的交互式自助服务终端系统的结构化数据转储和漏洞分析。此项工作具有学术/教育意义,旨在揭示常见的不安全模式。
**已识别的安全问题 (CWE)** ⚠️
- CWE-798 — 使用硬编码凭据。
- CWE-312 — 敏感信息明文存储。
- CWE-200 — 向未经授权的参与者暴露敏感信息。
- CWE-78 — 在执行本地脚本时潜在的 OS 命令注入。
- CWE-276 — 默认权限不正确。
**观察到的技术栈** 🧰
- `web/product.php`(单文件 PHP 应用)、本地 JSON 数据存储、静态资源文件夹、Windows batch/PowerShell 脚本、仓库中打包的 PHP 运行时。
**转储结构(节选)** 🗂️
- `data/product.json` — 产品数据、设置、翻译。
- `web/product.php` — UI 和管理端点。
- `web/assets/` — 图像。
- `web/quit_kiosk.bat` — 关机辅助脚本。
**建议** 🛠️
- 移除硬编码和暴露给客户端的凭据;实现服务器端身份验证和会话管理。
- 切勿存储明文密码;使用安全的散列算法并保护文件权限。
- 加固文件/目录权限,并限制对 Kiosk 服务账户的写入访问。
- 避免执行任意的 shell 命令;如有必要,请通过加固的特权服务运行。
**方法论** 🔬
静态代码审查 + 工件检查。未执行利用。
**免责声明** ⚖️
这是一个案例研究。所有品牌名称和敏感数据均已匿名化。不认可任何非法行为。
**使用说明 (Kiosk — EN)** 🧭
- **默认管理员密码**:`Admin_1025`。如果通过管理面板更改,新值将持久化保存在 `data/product.json` 的 `settings.admin_pwd` 中。
- **访问管理面板**:三击产品标题(左上角)。将出现一个密码输入框;输入管理员密码以打开编辑面板。
- **更改管理员密码**:在管理面板中,"Administration Access" 选项卡,填写新密码并点击 "💾 Update label" 以保存。
- **编辑产品**:从管理面板中,可以编辑以下字段(括号中为 JSON 路径):
- **SKU**:`article.code_article`
- **名称 / 显示标题**(按语言):`article.designation` 和 `translations[].article.designation`
- **屏幕尺寸**(按语言):`article.ecran` 和 `translations[].article.ecran`
- **RAM**:`pc.ram_gb`
- **OS**(按语言):`pc.systeme` 和 `translations[].pc.systeme`
- **CPU**(按语言):`pc.processeur` 和 `translations[].pc.processeur`
- **GPU**(按语言):`pc.carte_graphique` 和 `translations[].pc.carte_graphique`
- **存储**(按语言):`pc.stockage` 和 `translations[].pc.stockage`
- **配件**(按语言):`pc.accessoires` 和 `translations[].pc.accessoires`
- **充电器**:`pc.chargeur_key` 中的规范键值(例如 `included`),`pc.chargeur` / `translations[].pc.chargeur` 中的本地化标签
- **基础价格 / 促销价格**:`article.prix_yellowkiosk`,`article.prix_promo`
- **价格类型**:`article.type_prix_key` 中的规范键值(本地化标签)
- **显示货币**:`settings.devise`(`chf` 或 `eur`)
- **管理语言**:`settings.lang`(`fr`,`en`,`de`,`es`)— 如果 `translations[lang]` 可用,更改语言会使用其预填充文本字段。
- **保存**:"💾 Update label" 按钮将更改发送到服务器(`POST` 到 `web/product.php`),该服务器会以原子方式更新 `data/product.json` 和 `web/assets/selected_image.txt`。
- **图像**:将图像放置在 `web/assets/` 中;通过管理面板进行选择。`web/assets/selected_image.txt` 包含两张选定的图像(上 / 下)。
- **更改显示语言**:
- 临时 (URL):在 URL 后附加 `?lang=fr|en|de|es`。
- 永久:在管理面板中选择语言并保存(`settings.lang`)。
- **显示货币**:
- URL:`?devise=chf|eur` 强制显示 CHF 或 EUR。
- 永久:在管理面板中选择货币并保存(`settings.devise`)。
- **退出终端**:"Quit kiosk" 按钮 → 确认 → 触发 `POST quit_kiosk` 到 `web/product.php`。在 Windows 上,将执行 `web/quit_kiosk.bat` 以强制终止 `msedge.exe`、`php.exe` 和 `cmd.exe`。⚠️ 破坏性操作。
- **在本地运行**:
```
# 从仓库根目录(如果 php 在 PATH 中)
cd web
php -S localhost:8000
```
或者在 Windows 上使用打包的二进制文件:
```
cd web
..\\php\\php.exe -S localhost:8000
```
- **安全提示**:
- 管理员密码可能以明文形式存储在 `data/product.json` 中 — 存在重大风险。为了安全部署,请使用 `password_hash()` / `password_verify()`,限制 FS 权限,并且绝对不要在客户端暴露机密信息。
- "Quit kiosk" 操作会执行系统命令;在公开此功能之前,请验证权限和执行环境。
## 德语 🇩🇪
         
**项目描述** 📝
本仓库包含对一家**大型多媒体零售商(欧洲/瑞士)**在生产环境中使用的交互式自助服务终端系统的结构性数据转储和漏洞分析。其目的是揭示典型的安全错误。
**发现的漏洞 (CWE)** ⚠️
- CWE-798 — 硬编码凭据。
- CWE-312 — 敏感数据明文存储。
- CWE-200 — 敏感信息泄露。
- CWE-78 — 执行本地脚本时潜在的 OS 命令注入。
- CWE-276 — 不正确的默认权限。
**观察到的技术栈** 🧰
- PHP(单文件 UI)、本地 JSON 数据、Windows batch/PowerShell 脚本、Assets 文件夹。
**建议** 🛠️
- 移除硬编码凭据,采用安全的服务器端身份验证。
- 切勿将敏感密码以明文形式存储;使用散列算法 + 严格的文件权限。
**免责声明** ⚠️
本项目是一项案例研究;品牌名称和敏感数据已被匿名化。
**操作说明 (Kiosk — DE)** 🧭
- **默认管理员密码**:`Admin_1025`。如果通过管理面板进行更改,新值将保存在 `data/product.json` 的 `settings.admin_pwd` 下。
- **打开管理面板**:三击产品标题(左上角)。将出现一个密码输入框;输入管理员密码以打开编辑面板。
- **更改密码**:在管理面板中,“Zugang Administration”选项卡,输入新密码并点击“💾 Etikett aktualisieren”。
- **编辑产品**:可以通过管理表单编辑以下字段(括号中为 JSON 路径):
- **SKU**:`article.code_article`
- **名称 / 显示标题**(按语言):`article.designation` 和 `translations[].article.designation`
- **屏幕尺寸**(按语言):`article.ecran` 和 `translations[].article.ecran`
- **RAM**:`pc.ram_gb`
- **操作系统**(按语言):`pc.systeme` 和 `translations[].pc.systeme`
- **处理器**(按语言):`pc.processeur` 和 `translations[].pc.processeur`
- **显卡**(按语言):`pc.carte_graphique` 和 `translations[].pc.carte_graphique`
- **存储**(按语言):`pc.stockage` 和 `translations[].pc.stockage`
- **配件**(按语言):`pc.accessoires` 和 `translations[].pc.accessoires`
- **充电器**:`pc.chargeur_key` 中的规范键值(例如 `included`),`pc.chargeur` / `translations[].pc.chargeur` 中的本地化标签
- **基础价格 / 促销价格**:`article.prix_yellowkiosk`,`article.prix_promo`
- **价格类型**:`article.type_prix_key` 中的规范键值(本地化标签)
- **显示货币**:`settings.devise`(`chf` 或 `eur`)
- **管理语言**:`settings.lang`(`fr`,`en`,`de`,`es`)— 如果 `translations[lang]` 可用,切换语言会使用其预填充文本字段。
- **保存**:“💾 Etikett aktualisieren”按钮将更改发送到服务器(`POST` 到 `web/product.php`),该服务器会以原子方式更新 `data/product.json` 和 `web/assets/selected_image.txt`。
- **图像**:将图像放置在 `web/assets/` 中;通过管理面板进行选择。`web/assets/selected_image.txt` 包含两张选定的图像(上 / 下)。
- **更改显示语言**:
- 临时 (URL):在 URL 后附加 `?lang=fr|en|de|es`。
- 永久:在管理面板中选择语言并保存(`settings.lang`)。
- **显示货币**:
- URL:`?devise=chf|eur` 强制显示 CHF 或 EUR。
- 永久:在管理面板中选择货币并保存(`settings.devise`)。
- **退出终端**:“Kiosk beenden”按钮 → 确认 → 触发 `POST quit_kiosk` 到 `web/product.php`。在 Windows 上,将执行 `web/quit_kiosk.bat` 以强制终止 `msedge.exe`、`php.exe` 和 `cmd.exe`。⚠️ 破坏性操作。
- **在本地启动**:
```
# 从仓库根目录(如果 php 在 PATH 中)
cd web
php -S localhost:8000
```
或者在 Windows 上使用附带的二进制文件:
```
cd web
..\\php\\php.exe -S localhost:8000
```
- **安全提示**:
- 管理员密码可能以明文形式存储在 `data/product.json` 中 — 存在高风险。为了安全部署,请使用 `password_hash()` / `password_verify()`,限制 FS 权限,并且绝对不要在客户端暴露机密信息。
- “Kiosk beenden”操作会执行系统命令;在使用前请检查权限和执行环境。
标签:AI合规, CWE-200, CWE-276, CWE-312, CWE-78, CWE-798, ffuf, Homebrew安装, IPv6, PHP安全, PowerShell, XXE攻击, 不安全默认权限, 交互式自助终端, 操作系统命令注入, 教育案例, 无线安全, 明文存储, 服务器监控, 漏洞分析, 硬编码凭证, 网络安全审计, 路径探测, 零售多媒体系统, 零售安全