iamKimlong/medicare-portal-owasp

GitHub: iamKimlong/medicare-portal-owasp

覆盖OWASP Top 10全漏洞的医疗门户演示平台,支持一键切换漏洞/安全模式进行对比教学。

Stars: 2 | Forks: 0

[设置](#setup) · [测试账号](#test-accounts) · [SECURE_MODE](#how-secure_mode-works) · [OWASP 覆盖范围](#owasp-top-10-coverage) · [项目结构](#project-structure) # MediCare Portal **用于演示 OWASP Top 10 (2021) 的故意存在漏洞的医疗患者门户。** 每个漏洞都有一个对应的安全修复版本,由 `config.php` 中的单个布尔值控制。在现场演示中切换该值,即可实时展示攻击与修复的对比。 ![image](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4e9880024f185135.png) ## ⚡ 设置 任选其一:
选项 A: Docker (推荐) ### 前置条件 - 已安装并运行 [Docker](https://docs.docker.com/get-docker/) ### 1. 构建并运行 ``` cd medicare-portal docker build -t medicare-portal . docker run -d -p 80:80 --name medicare medicare-portal ``` ### 2. 打开应用 访问 `http://localhost` - 你应该能看到登录页面。 ### 3. 停止 / 重启 ``` docker stop medicare docker start medicare # 或 docker restart medicare ``` ### 4. 重置数据库 ``` docker exec medicare bash -c "mysql -u root -pmedicare_demo medicare < /var/www/html/db/schema.sql" ``` ### 5. 清理 ``` docker rm -f medicare docker rmi medicare-portal ```
选项 B: 手动设置 (Arch Linux + Apache + MariaDB) ### 1. 安装依赖 ``` sudo pacman -S php apache mariadb php-apache ``` ### 2. 设置 MariaDB ``` sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql sudo systemctl start mariadb sudo systemctl enable mariadb sudo mariadb-secure-installation ``` 根据提示设置 root 密码。然后导入 schema: ``` mariadb -u root -p < db/schema.sql ``` 这将创建 `medicare` 数据库、所有表,并填充测试账号。 ### 3. 配置 Apache 以下所有编辑均在 `/etc/httpd/conf/httpd.conf` 中进行。 **切换到 prefork MPM**(必需,因为 Arch 的 PHP 模块非线程安全): ``` # 找到此行并将其注释掉: #LoadModule mpm_event_module modules/mod_mpm_event.so # 在其下方添加: LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ``` **启用 PHP 和 rewrite**(添加到 `LoadModule` 列表末尾): ``` LoadModule php_module modules/libphp.so AddHandler php-script .php Include conf/extra/php_module.conf ``` **取消注释 mod_rewrite**(找到现有的注释行): ``` LoadModule rewrite_module modules/mod_rewrite.so ``` **设置文档根目录**(找到并替换现有的 `DocumentRoot` 和 `` 块): ``` DocumentRoot "/path/to/medicare-portal" Options Indexes FollowSymLinks AllowOverride All Require all granted ``` 将 `/path/to/medicare-portal` 替换为项目的实际绝对路径。 ### 4. 配置 PHP 编辑 `/etc/php/php.ini` 并取消注释: ``` extension=pdo_mysql extension=mysqli ``` ### 5. 允许 Apache 访问你的主目录 Arch 的 Apache systemd 单元设置了 `ProtectHome=yes`,这会阻止访问 `/home` 下的任何内容。如果你的项目位于此处,请覆盖此设置: ``` sudo vim /etc/systemd/system/httpd.service.d/hardening.conf ``` 取消注释(或添加)这一行: ``` ProtectHome=no ``` 然后重新加载服务配置: ``` sudo systemctl daemon-reload ``` ### 6. 设置文件权限 ``` chmod -R 755 /path/to/medicare-portal chmod -R 777 /path/to/medicare-portal/uploads ``` ### 7. 更新数据库凭证 编辑 `config.php`: ``` define('DB_PASS', 'your_password_here'); // whatever you set in step 2 ``` ### 8. 启动 Apache ``` sudo systemctl restart httpd ``` 打开 `http://localhost` - 你应该能看到登录页面。 ### 替代方案: PHP 内置服务器 (无 Apache) 用于无需 Apache 配置的快速测试: ``` cd /path/to/medicare-portal php -S localhost:8080 ``` 这适用于大多数功能,但 `.htaccess` 规则将不适用,且 webshell 上传演示 (A08) 不会自动执行 `/uploads/` 中的 PHP 文件。 ### 清理 有关完整的还原步骤,请参阅 [docs/undo.md](docs/undo.md)。
## 测试账号 使用 **MD5 哈希** 的种子账号(用于 A02 漏洞演示): | 角色 | 邮箱 | 密码 | |---------|------------------- |-------------| | Patient | minhanh@demo.com | password123 | | Patient | chenwei@demo.com | password123 | | Doctor | haruka.sato@demo.com | password123 | | Admin | admin@demo.com | admin123 | 使用 **bcrypt 哈希** 的种子账号(用于安全模式登录): | 角色 | 邮箱 | 密码 | |---------|-----------------------|-------------| | Patient | jihoon.park@demo.com | password123 | | Doctor | xiaoming.li@demo.com | password123 | | Admin | admin.tanaka@demo.com | admin123 | MD5 账号在两种模式下均可使用。Bcrypt 账号仅可在安全模式下使用。 ## ⚙️ SECURE_MODE 工作原理 每个易受攻击的代码路径都会检查 `config.php` 中的一个常量: ``` define('SECURE_MODE', false); // vulnerable define('SECURE_MODE', true); // hardened ``` 每个功能文件包含两个函数 —— 一个易受攻击,一个安全 —— 并根据此标志分派到相应的函数。更改该值,刷新浏览器,行为即刻切换。无需重启。 ### UI 切换开关 应用页脚包含一个药丸状切换开关,可直接在浏览器中切换 SECURE(安全)和 VULNERABLE(易受攻击)模式 —— 无需手动编辑 `config.php`。还有一个单独的按钮用于切换每个页面上的 OWASP 漏洞提示卡片。 这两个开关都会重写磁盘上的 `config.php`,因此更改会在请求之间持久保留。 ### 配置选项 ``` define('SECURE_MODE', false); // false = vulnerable, true = hardened define('SHOW_SECURE_TOGGLE', true); // show/hide the mode toggle in the footer define('SHOW_VULN_HINT', true); // show/hide OWASP vulnerability hint cards ``` 将 `SHOW_SECURE_TOGGLE` 和 `SHOW_VULN_HINT` 设置为 `false`,即可获得无 UI 装饰的纯净演示环境。 ## 🚀 OWASP Top 10 覆盖范围 | # | 类别 | 文件 | 易受攻击的行为 | 安全修复 | |-----|---------------------------------|------------------------------|-----------------------------------------|----------------------------------------------| | A01 | Broken Access Control (访问控制失效) | `patient/records.php` | 通过 `?patient_id=` 参数导致 IDOR | Session 所有权检查 + 角色控制 | | A02 | Cryptographic Failures (加密失败) | `auth/register.php` | 密码以纯 MD5 存储 | 使用 bcrypt 的 `password_hash()` | | A03 | Injection (SQLi) (注入) | `shared/search.php` | 查询中使用原始字符串拼接 | PDO 预处理语句 | | A03 | Injection (XSS) (注入) | `patient/chat.php` | 原始 `echo $msg['body']` | 输出时使用 `htmlspecialchars()` | | A04 | Insecure Design (不安全设计) | `patient/appointments.php` | 无速率限制,无冲突检查 | 时段冲突检查 + 每日预约上限 | | A05 | Security Misconfiguration (安全配置错误) | `.htaccess`, Apache config | 详细错误信息,目录列表 | 错误抑制,`Options -Indexes` | | A06 | Vulnerable Components (易受攻击的组件) | `composer.json` | PHPMailer 5.2.23 (CVE-2016-10033) | 幻灯片中引用的已修补版本 | | A07 | Auth & Session Failures (认证和会话失败) | `auth/login.php` | 登录时无 `session_regenerate_id()` | Session 重生成 + 登录时间戳 | | A08 | Software & Data Integrity (软件和数据完整性) | `shared/upload.php` | 无 MIME 检查,`.php` 文件可执行 | MIME 白名单 + 随机重命名 | | A09 | Logging & Monitoring Failures (日志和监控失败) | `admin/audit_log.php` | 未写入审计条目 | 所有敏感操作记录到 `audit_log` | | A10 | SSRF | `shared/insurance_fetch.php` | 对任何 URL 使用 `file_get_contents()` | 域名白名单 + 私有 IP 阻断 | ## 项目结构 ``` medicare-portal/ ├── config.php ← SECURE_MODE + config toggles + DB connection + helpers ├── helpers.php ← Layout rendering + centralized vuln hint registry ├── toggle_mode.php ← Endpoint for UI mode/hint toggles ├── index.php ← Redirects to login or dashboard │ ├── auth/ │ ├── login.php ← A02 (MD5), A07 (session fixation) │ ├── register.php ← A02 (MD5 vs bcrypt) │ └── logout.php │ ├── patient/ │ ├── dashboard.php ← Appointments + messages overview │ ├── records.php ← A01 (IDOR) │ ├── appointments.php ← A04 (insecure design) │ └── chat.php ← A03 (stored XSS) │ ├── doctor/ │ ├── dashboard.php ← Upcoming appointments + messages │ ├── patients.php ← Patient list for this doctor │ └── chat.php ← A03 (stored XSS, doctor side) │ ├── admin/ │ ├── dashboard.php ← System stats + A05 (error leakage) │ ├── users.php ← User management (delete) │ └── audit_log.php ← A09 (logging failures) │ ├── shared/ │ ├── search.php ← A03 (SQL injection) + A02 (hash leakage) │ ├── upload.php ← A08 (unrestricted file upload) │ └── insurance_fetch.php ← A10 (SSRF) │ ├── uploads/ ← Uploaded files land here (writable) ├── assets/ │ ├── style.css ← Full custom CSS │ └── main.js ← Chat scroll + nav highlighting + toggle handlers │ ├── db/ │ └── schema.sql ← Full schema + seed data (MD5 + bcrypt accounts) │ ├── docs/ │ ├── note.md ← Step-by-step OWASP testing guide │ └── undo.md ← Teardown instructions │ ├── docker/ │ ├── apache-vhost.conf ← Apache vhost for Docker │ └── entrypoint.sh ← Starts MariaDB + imports schema + runs Apache │ ├── Dockerfile ← Single-container build (Apache + PHP + MariaDB) ├── .dockerignore ├── composer.json ← A06 (vulnerable dependency) ├── .htaccess ← A05 (misconfiguration surface) └── .gitignore ``` ## ⚠️ 免责声明 此应用**故意存在漏洞**。请仅在隔离环境中运行 —— 你的本地机器、虚拟机或容器。切勿将其暴露到你无法完全控制的网络中。
标签:Apache, CISA项目, DNS 反向解析, Docker, ffuf, GitHub Advanced Security, HTTP工具, OpenVAS, OWASP Top 10, PHP, Web安全, XML 请求, XSS, 医疗信息系统, 安全加固, 安全开发, 安全防御评估, 教育实训, 漏洞情报, 漏洞靶场, 网络安全, 网络安全审计, 脆弱代码演示, 蓝队分析, 请求拦截, 防御检测, 隐私保护