
pfSense CE 2.9.0-DEVELOPMENT - Medio - Remoto - SQLi - voucher_expire WHERE
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · pfsense-voucher-expire-sqli
Clase: SQLi Alcance: Remoto
pfSense CE 2.9.0-DEVELOPMENT (9363ac5) - pfsense.org
voucher.inc captiveportal_read_db("WHERE username = '{$voucher}'") luego el sessionid de la primera fila hacia captiveportal_remove_entries. El INSERT del login no autenticado usa SQLite3::escapeString.
| ID | sin CVE todavía |
| Clase | SQLi |
| Alcance | Remoto (WebGUI autenticada salvo que se indique lo contrario) |
| CWE | CWE-89 |
| CVSS | Medio: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:L |
| Producto | pfSense CE |
| Afectado | 2.9.0-DEVELOPMENT (9363ac5b8651a1c7a333180425ce7719070f95f9) |
| Auth | Sesión WebGUI con page-status-captiveportal-expire / page-services-captiveportal-vouchers |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Fijé el master público 9363ac5. El lab es un gadget PHP del sink fijado, HTTP en loopback sobre 127.0.0.1:19280.
Write-up de la serie: https://abraxaslabs.tech/research/pfsense-ce-leftovers
| Método | Sink | Privilegio |
|---|---|---|
| POST voucher expire token | captiveportal_read_db WHERE username = '{$voucher}' | Integridad: Probado en lab: UNION seleccionó otro sessionid y un UPDATE apilado reescribió esa fila. CONTROL expire solo eliminó A. La ruta de login no autenticado permaneció escapada. |
| mismo leftover | mismo sink | Recon: Inferido: UNION puede leer otras columnas de sesión desde captiveportal{zone}.db. |
| mismo leftover | mismo sink | Disponibilidad: Probado en lab: desconexión de la primera fila inyectada; puede eliminar/reescribir otra sesión en esa DB de zona. |
Requiere: page-status-captiveportal-expire / page-services-captiveportal-vouchers. CSRF-magic en POST salvo que se indique lo contrario. WebGUI PHP-FPM es root.
Requiere: page-status-captiveportal-expire / page-services-captiveportal-vouchers. CSRF-magic en POST salvo que se indique lo contrario. WebGUI PHP-FPM es root. CSRF-magic en POST salvo que se indique lo contrario. WebGUI PHP-FPM es root.
Escape del login no autenticado. voucher_auth sigue usando escapeshellarg. Sin shell. Sin DB de otra zona. Sin cookie de GUI.
Sin Diagnostics: Command a menos que esa página también esté concedida.
cd lab
./run.sh
Loopback 127.0.0.1:19280. Proyecto Compose pfsense-voucher-expire-sqli. Witness PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS. Solo loopback: 127.0.0.1:19280. Proyecto Compose pfsense-voucher-expire-sqli. Witness PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS. Gadget PHP de las líneas fijadas. El stack se desmonta tras la ejecución.
Última línea:
SUCCESS PFSENSE-VOUCHER-EXPIRE-SQLI control-expire-only-a=yes control-login-escaped=yes trigger-rewrite-b=yes PFSENSE-VOUCHER-EXPIRE-SQLI-WITNESS
Vincular parámetros. Dejar de concatenar el voucher en SQL.
9363ac5b8651a1c7a333180425ce7719070f95f9