
pfSense CE 2.9.0-DEVELOPMENT - 高危 - 远程 - RCE - timezone php.ini prepend
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-timezone-phpini
类别: RCE 可达性: 远程
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
system.php 写入 $_POST['timezone'] 时未针对 system_get_timezone_list() 进行 in_array 校验。is_timezone() 仅拒绝末尾斜杠。system_timezone_configure 写入 /var/db/zoneinfo。rc.php_ini_setup 将 date.timezone="${TIMEZONE}" 插值到 php.ini 中。引号加换行符可添加 auto_prepend_file。
| ID | 暂无 CVE |
| 类别 | RCE |
| 可达性 | 远程(除非另有说明,需已认证 WebGUI) |
| CWE | CWE-94 |
| CVSS | 高危:8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| 产品 | pfSense CE |
| 受影响版本 | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) |
| 认证 | 具有 page-system-generalsetup 权限的 WebGUI 会话 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
我固定了公共 master 分支 9363ac5。实验环境是固定版本 sink 的 PHP gadget,在 127.0.0.1:18940 上提供回环 HTTP 服务。
系列文章:https://abraxaslabs.tech/research/pfsense-ce-leftovers
| 方法 | Sink | 权限影响 |
|---|---|---|
| POST system.php timezone | rc.php_ini_setup date.timezone="${TIMEZONE}" | 完整性: 实验环境已验证:生成的 php.ini 接受了 auto_prepend_file;php -c 加上 php-fpm 模拟脚本运行了 prepend 并写入了见证文件。 |
| 同一遗留问题 | 同一 sink | 侦察: 推断:prepend 在 php.ini 重建 / php-fpm 重启后以 root PHP 身份运行。 |
| 同一遗留问题 | 同一 sink | 可用性: 推断:损坏的 php.ini 可导致 GUI 瘫痪,直至修复。 |
需要: page-system-generalsetup。除非另有说明,POST 请求受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。
需要: page-system-generalsetup。除非另有说明,POST 请求受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。除非另有说明,POST 请求受 CSRF-magic 保护。WebGUI PHP-FPM 以 root 运行。
Form_Select 仅用于 UI。hostname/domain 有其自身的字符集检查。未认证不可利用。
除非该页面也被授权,否则无 Diagnostics: Command 可用。
cd lab
./run.sh
回环 127.0.0.1:18940。Compose 项目 pfsense-timezone-phpini。见证文件 PFSENSE-TIMEZONE-PHPINI-WITNESS。仅限回环:127.0.0.1:18940。Compose 项目 pfsense-timezone-phpini。见证文件 PFSENSE-TIMEZONE-PHPINI-WITNESS。固定代码行的 PHP gadget。运行结束后栈会拆除。
最后一行:
SUCCESS PFSENSE-TIMEZONE-PHPINI control-clean=yes trigger-prepend=yes is-timezone-accepts=yes not-allowlisted=yes PFSENSE-TIMEZONE-PHPINI-WITNESS
针对 system_get_timezone_list() 对 timezone 进行 in_array 校验。对 rc.php_ini_setup 的插值进行引号转义。
9363ac5b8651a1c7a333180425ce7719070f95f9