PI Debug/ WordPress, plug-in a rischio

Il successo di questo CMS è in parte dovuto alla marea di plug-in che ne estendono le funzionalità. Tuttavia, bisogna stare attenti a cosa si installa nel proprio sito Web: un bug può permette ai pirata l'esecuzione di una SQL Injection

Negli ultimi anni, l’e-commerce ha aumentato la propria diffusione in modo esponenziale. Soprattutto perché ormai non si vende più soltanto su Amazon, eBay o altre grosse piattaforme: chiunque può aprire un proprio sito Web e vendere ciò che desidera. Una buona parte del merito va ai CMS destinati alla costruzione di siti di e-commerce. I Content Management System sono applicazioni Web, solitamente scritte in PHP o ASP, che permettono anche a chi non è esperto di programmazione la costruzione di un sito utilizzando una serie di schemi pronti all’uso. I CMS per l’e-commerce esistono da molto tempo, ma solo recentemente sono diventati più semplici da usare e gestire. Non soltanto: anche i normali CMS, quelli utilizzati per realizzare blog, hanno prodotto dei plug-in che permettono la vendita di prodotti o servizi. È il caso di WordPress , il CMS più diffuso al mondo: si calcola che WordPress sia utilizzato nel 20 per cento di tutti i siti Web esistenti. Tuttavia, dobbiamo ricordare che quasi il 70 per cento dei siti non è costruito con un CMS (molti siti governativi, ad esempio, hanno piattaforme statiche). Ciò significa che WordPress è il motore di due terzi dei siti Web basati su CMS.

Esistono diversi plug-in di WordPress che permettono di realizzare in pochi clic un sito di e-commerce. Uno dei più diffusi fino a qualche tempo fa era Product Catalog 8 . Al momento, questo plug-in è stato sospeso perché lo sviluppatore non ha più il tempo di aggiornarlo e questo lo rende un facile bersaglio per i pirati. Secondo le statistiche di WordPress, infatti, la maggior parte degli utenti non è particolarmente solerte nell’aggiornare il proprio CMS e i relativi plug-in. Il risultato è che diversi siti rischiano di essere vulnerabili ai vari bug che affliggono questo ormai datato plug-in.


La pagina del plugin Product Catalog 8 è stata rimossa dal sito di WordPress, ma la si trova ancora su Web Archive

Un’iniezione SQL
C’è un bug che risalta fra tutti per la sua pericolosità, perché offre la possibilità di una SQL Injection . Ma forse dobbiamo fare qualche passo indietro. WordPress è un’applicazione PHP basata su database SQL. Di solito si utilizza un server MySQL oppure PostgreSQL, ma si può anche ricorrere ad un file SQLite. Ad ogni modo, è poco rilevante, perché in ciascun caso il risultato è che tutte le informazioni del sito Web vengono memorizzate nel database. Questo include i testi, la struttura delle pagine, l’interfaccia, e persino le immagini e i file allegati (il loro URL). Ma, soprattutto, i dati sugli utenti, i commenti e le password di accesso, inclusa quelle di amministrazione. Ciò significa che è estremamente importante proteggere questo database e impedire che un malintenzionato possa accedervi in lettura e, soprattutto, in scrittura. Perché potendo scrivere nel database un pirata potrebbe, ad esempio, cancellare delle tabelle o modificare la password di amministratore per accedere al sito e modificarlo a proprio piacimento.

I database SQL sono molto comodi per i programmatori perché si basano su delle query, ovvero dei comandi. Per fare qualche esempio: esiste un comando per leggere le tabelle, uno per crearle e uno per distruggerle. Basta inviare tali comandi tramite PHP e si può manipolare il database. Siccome i comandi sono di fatto delle stringhe di testo, sono molto comode da realizzare e da adattare alle varie esigenze. Il problema nasce quando un comando deve essere realizzato utilizzando delle informazioni fornite dall’utente. Ad esempio, il comando DROP TABLE gianni provvede a cancellare la tabella chiamata gianni . Si può decidere di inserire in una pagina HTML una casella di testo tramite la quale l’utente possa indicare il nome della tabella da eliminare. Poi PHP non deve far altro che concatenare DROP TABLE con il valore della casella di testo e il gioco è fatto. Il problema è che in questo modo se l’utente commette un errore, il comando può essere snaturato. Addirittura, se l’utente è un malintenzionato, può scrivere nella casella di testo un codice che sostituisce il comando con un altro, in modo da “iniettare” nel server SQL un comando malevolo al posto di quello previsto originariamente. Per evitare che ciò accada, si deve controllare ogni contributo dell’utente, per assicurarsi che non contenga caratteri speciali che possano modificare la query.

Questione di codice
Questo controllo, però, non avviene nel codice del plug-in Product Catalog: quest’estensione è realizzata con una serie di file PHP. Tra questi, c’è il file includes/ajax-functions.php , che contiene una serie di funzioni. In particolare, si nota la funzione UpdateCategoryList , che può essere chiamata fornendo alla pagina wp-admin/admin-ajax.php il suo nome nel campo action fornito tramite HTTP POST (è quindi sufficiente creare un semplice form HTML contente questo codice:

<input type="text" name="action" value="UpdateCategoryList">
.

Il codice di questa funzione è il seguente:

function UpdateCategoryList() {
global $wpdb, $subcategories_table;

global $wpdb;
$table = $subcategories_table;
$catid = $_POST['selectedCategory'];

if($catid !== '0') {

$get_items = $wpdb->get_results( "SELECT * FROM $table WHERE subcategory_category = $catid ORDER BY subcategory_name ASC" );
echo json_encode($get_items);
}
else {
$get_items = "";
echo json_encode($get_items);
}

die();

}

Si può immediatamente notare che la funzione riceve tramite HTTP POST un testo chiamato selectedCategory , che viene subito inserito nella variabile $catid . Il problema è che poi tale variabile viene inserita direttamente nella query SQL, ovvero quel testo che inizia con il comando SELECT . Siccome non c’è alcun controllo sul contenuto della variabile $catid e non viene applicata alcuna funzione di escape per eliminare potenziali caratteri pericolosi. Ciò significa che un utente malintenzionato può facilmente sfruttare l’occasione per far eseguire a PHP una query a propria discrezione. In poche parole, ad un pirata è sufficiente scrivere questo codice:

<form method="post" action="http://www.sitoweb.com/wp-admin/admin-ajax.php">
<input type="text" name="selectedCategory" value="0 UNION SELECT 1,2,3,4,5,6 FROM wp_terms WHERE term_id=1">
<input type="text" name="action" value="UpdateCategoryList">
<input type="submit" value="Send">
</form>

per produrre un form tramite il quale inviare una query arbitraria. Il pirata può quindi modificare parti sensibili del database, inclusi gli hash delle password degli utenti amministratori.


Basta una semplice richiesta HTTP POST per eseguire l’exploit

Come correre ai ripari
Se questo plug-in è presente sulla nostra installazione di WordPress, la soluzione migliore consiste nel disabilitarlo e passare ad un altro plug-in simile ma costantemente aggiornato. Questo caso ci insegna quanto sia importante mantenere aggiornato il CMS, perché essere presi di mira dai pirati è davvero molto facile se si utilizzano applicazioni contenenti bug. Se siamo dei programmatori, invece, possiamo evitare le SQL Injection in due modi. Il primo, e più semplice, consiste nel ricorrere ad una funzione di escape, che rimuova tutti i simboli speciali che potrebbero modificare la natura della query che abbiamo scritto:

$unsafe_variable = $_POST["user-input"];
$safe_variable = mysql_real_escape_string($unsafe_variable);
mysql_query("INSERT INTO table (column) VALUES ('". $safe_variable. "')");

La funzione di escape fornita da PHP si chiama mysql_real_escape_string , ed è valida nella maggioranza dei casi. L’alternativa, è rappresentata dall’uso delle funzioni MYSQLi invece della comuni MYSQL. In particolare, le query possono essere “preparate” con una funzione chiamata, per l’appunto mysqli.prepare .
Questo è un esempio di utilizzo:

<?php
$mysqli = new mysqli("server", "username", "password", "database_name");
$unsafe_variable = $_POST["user-input"];
$stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)");
$stmt->bind_param("s", $unsafe_variable);
$stmt->execute();
$stmt->close();
$mysqli->close();
?>

Questa opzione è solitamente la migliore, ma ha un difetto: supporta soltanto MySQL. Se si vuole utilizzare un differente database SQL, si deve provvedere a sviluppare un livello di astrazione utilizzando PDO, il che complica abbastanza le cose.

AVVERTENZE
Le informazioni contenute in questo articolo sono state pubblicate a scopo puramente didattico , per consentire ai lettori di conoscere e imparare a difendersi dai pericoli a cui sono esposti navigando in Internet o in generale utilizzando applicazioni affette da vulnerabilità.
L’editore e la redazione non si assumono responsabilità alcuna circa l’utilizzo improprio di tali informazioni , che possa avere lo scopo di violare la legge o di arrecare danni a terzi. Per cui, eventuali sanzioni economiche e penali saranno esclusivamente a carico dei trasgressori.

La tua email sarà utilizzata per comunicarti se qualcuno risponde al tuo commento e non sarà pubblicato. Dichiari di avere preso visione e di accettare quanto previsto dalla informativa privacy

  • Uqbar scrive:
    Di che ci lamentiamo?
    Questa è internet, baby! Internet!Nulla è dovuto, nulla è garantito!E tu non puoi farci nulla! Nulla!
  • iRoby scrive:
    Jack Ma
    Le migliori parole sulla questione USA e profitti delle aziende e di Silicon Valley.Le carogne stanno in USA.Jack Ma il proprietario di Alibaba che dice in faccia a tutti a Davos come stanno le cose.http://comedonchisciotte.org/ascoltate-e-ritagliate-le-frasi-di-alibaba-jack/
  • rollercasto scrive:
    logica dei gamberi
    Mah, come si fa a scagionare il pilota automatico quando è proprio lui la causa dell'incidente?Un mistero della logica.O forse intendevano che il guidatore era così stupido che, sapendo che il pilota automatico è limitato, si è messo a guardare un film?O magari non è stato informato correttamente e ha pensato che il pilota automatico fosse un pilota automatico, mentre non lo è?Quando la grana corre, la legge si inchina, forse è questa la spiegazione corretta.
  • ._. scrive:
    MA PERCHE'?
    ma perchè XXXXX di quel XXXXXXXX in sto paese del XXXXX non c'è più un soldo per nulla, si vive di XXXXX, le infrastrutture sono penose, non ci sono soldi per gli italiani colpiti dalle calamità naturali ma, XXXXXXX la XXXXXXX succhiaXXXXX, i negri che accogliamo a braccia aperte hanno un albergo 5 stelle e sono lautamente pagati? fanXXXX vadano, a spalare neve e macerie in abruzzo o se ne vadano fuori dal XXXXX, che noi italiani il XXXX ce lo stiamo già facendo.
    • il negro scrive:
      Re: MA PERCHE'?
      perchè noi negri abbiamo il XXXXX più grossoavere il XXXXX grosso è l'unica cosa che contaalle donne bianche il XXXXX grosso e nero piace[img]http://www.videoXXXXXogratis.com/thumbs/maddy-oreilly-succhia-un-enorme-XXXXX-nero-prima-di-chinarsi-e-XXXXXXX-doggystyle.jpg[/img]
      • ._. scrive:
        Re: MA PERCHE'?
        si ma dio XXXXX XXXXX XXXXX XXXXX c'avete il cervello piccolo idioti, fuori dall'italia pezzi di XXXXX, tornatevene nei vostri paesi, XXXXXXX negri.
    • sei un idiota scrive:
      Re: MA PERCHE'?
      [img]http://img.macjams.com/song_art/5525_Snot250.jpg[/img]
      • ._. scrive:
        Re: MA PERCHE'?
        idiota del XXXXX sei tu, che rispondi con una foto di XXXXX e non capisci che l'europa ce l'ha messo nel XXXX, e XXXXXdio preferisce aiutare i negri e far morire noi di fame, e XXXXXXX XXXXX a quelli come te piace così, quindi XXXXXXX XXXXXXXX.
        • sei un idiota scrive:
          Re: MA PERCHE'?
          ma suicidati XXXXXXXX e libera il mondo dalla tua stupidità[img]http://awakenedbride.files.wordpress.com/2010/12/suicide-gun-point-man.jpg[/img][img]http://farm4.staticflickr.com/3246/3000767908_a5847c8f6f.jpg[/img]
  • Giuseppe2016 scrive:
    Amici amici
    Se un russo fa qualcosa è qualcosa di male.Se lo fa un americano è cosa buona anche se è dare armi all'ISIS.In ogni caso loro sono i buoni e i russi i cattivi, ma gli americani ormai si vede da lontano che sono in malafede.Ormai si è visto che gli unici a combattere veramente l'ISIS erano e sono i russi, gli altri sono troppo intrallazzati con i terroristi direttamente e meno direttamente.E noi per fare un piacere a loro abbiamo consegnato una nave di bombe all'Arabia Saudita che le ha usate anche per bombardare i civili, ma questo i giornali non lo dicono e stanno zitti zitti sui bambini yemeniti uccisi dall'acciaio italiano (prodotto dai proprietari tedeschi).La Siria se faceva qualcosa del genere è un paese criminale e la stampa si scatenava, ma se lo fa un alleato usa come i Sauditi sono tutti bravi e santi.Almeno questo è quel che si capisce dai media indipendenti, i giornali italiani raccontano le solite balle come se gli americani fossero sbarcati ieri in questo paese, difficile trovare un paese più XXXXXXXXX e allineato del nostro.Comperiamo persino 90 F-35 talmente difettosi da essere problematici persino per gli americani.in ogni caso le loro guerre/primavere non meno sanguinose, ci riempiono di immigrati che poi dobbiamo mantenere, ci portano a schierare truppe e armi contro la Russia, un paese amico e che non ha mai fatto nulla contro di noi (li abbiamo solo aggrediti noi durante la II° guerra mondiale).USA proprio un paese amico amico! E' seguendo come cagnolini obbedienti questi comportamenti americani che rovineremo il nostro paese.
  • ukkoz scrive:
    manovre
    Zuckerberg si sta esponendo non poco.Non so quale sia la strategia, sicuramente pensata con il consiglio di amministrazione e con il marketing, ma quanto accaduto mostra che si sta consolidando il trend del decisionismo di piattaforme che dovrebbero essere assolutamente neutrali.Una gran brutta storia, pensando alle conseguenze future.
    • scevro scrive:
      Re: manovre
      - Scritto da: ukkoz
      Zuckerberg si sta esponendo non poco.
      Non so quale sia la strategia, sicuramente
      pensata con il consiglio di amministrazione e con
      il marketing, ma quanto accaduto mostra che si
      sta consolidando il trend del decisionismo di
      piattaforme che dovrebbero essere assolutamente
      neutrali.
      Una gran brutta storia, pensando alle conseguenze
      future.la strategia è quella di fare più soldi possibile
      • Thepassenge r scrive:
        Re: manovre
        e censurare notizie scomode marcandoel come fake o nazioni intere se non sono pro-EU, pro-estabilishment.ma andassero a XXXXXX questi delinquenti capitalisti e sopratutto che andassero a XXXXXX tutti gli utonti italiani privi di morale che bazzicano nell'ignoranza e nel qualunquismo che li tengono in vita.- Scritto da: scevro
        - Scritto da: ukkoz

        Zuckerberg si sta esponendo non poco.

        Non so quale sia la strategia, sicuramente

        pensata con il consiglio di amministrazione e
        con

        il marketing, ma quanto accaduto mostra che si

        sta consolidando il trend del decisionismo di

        piattaforme che dovrebbero essere assolutamente

        neutrali.

        Una gran brutta storia, pensando alle
        conseguenze

        future.

        la strategia è quella di fare più soldi possibile
  • iRoby scrive:
    Strumento politico
    Quel social è sempre più uno strumento politico.Se accetti finanziamenti dallo Stato, questi ti possiede.E d'altronde non puoi fare altrimenti, perché se non li danno a te, li daranno ad un altro social...
    • asd... scrive:
      Re: Strumento politico
      - Scritto da: iRoby
      Quel social è sempre più uno strumento politico.

      Se accetti finanziamenti dallo Stato, questi ti
      possiede.
      E d'altronde non puoi fare altrimenti, perché se
      non li danno a te, li daranno ad un altro
      social...infatti la reale responsabilità non è dei social, ma degli utenti che non li boicottano
      • Il fuddaro scrive:
        Re: Strumento politico
        - Scritto da: asd...
        - Scritto da: iRoby

        Quel social è sempre più uno strumento politico.



        Se accetti finanziamenti dallo Stato, questi ti

        possiede.

        E d'altronde non puoi fare altrimenti, perché se

        non li danno a te, li daranno ad un altro

        social...

        infatti la reale responsabilità non è dei social,
        ma degli utenti che non li
        boicottanoPer il gregge che si e creato tramite social, boicottare lo stesso sarebbe la loro morte virtuale e reale. quei buoi senza apparire, non esistono.Fare diversamente, si scopre che non valgono un pero.
Chiudi i commenti