Skip to main content

Esecuzione di attività amministrative Joomla da remoto

In un precedente articolo abbiamo affrontato la possibilità di eseguire una funzione amministrativa Joomla da linea di comando locale; in questo articolo vediamo invece come eseguirla richiamando il sito da remoto tramite l’ausilio di un tool esterno chiamato wget.

wget è un eseguibile che può essere a sua volta incluso in uno script o in una operazione pianificata, pertanto ci permette allo stesso modo di automatizzare operazioni amministrative.

Esigenza

La soluzione precedente, relativa all’utilizzo di uno script ha un significativo limite: lo script in questione deve essere eseguito dallo stesso server su cui risiede il nostro sito. Nel nostro caso, invece, era necessaria una schedulazione che partisse da un PC remoto

Richiamare di una pagina web

Richiamare una pagina web da linea di comando, di per sè, è facilmente risolvibile. Lo strumento wget fa esattamente questo salvando il risultato in un file. Un comando quale:

wget http://testsite/index.php?option=com_frontpage

recupera e salva la home page del nostro sito.

La questione interessante è che una pagina PHP, come sono le pagine di un sito dinamico come Joomla, sono pagine di elaborazione lato server. Ovvero lavorano in due fasi:

  • eseguono delle operazioni direttamente sul server
  • restituiscono un output HTML al richiedente

Quello che wget salva nel file è solo il risultato dell’operazione; il punto fondamentale è che nel frattempo sul server è stata eseguita l’operazione che ci interessa.

Autenticazione

Dato che la nostra funzione è nell’area amministrativa di Joomla, la cosa si complica un tantino. Wget è in grado di passare utente e password per una pagina protetta da un sistema di autenticazione http; ma l’autenticazione Joomla funziona diversamente.

L’autenticazione gestita da Joomla prevede una apposita pagina di login che deposita un cookie sul PC dell’utente e, se va a buon fine, lo modifica successivamente coerentemente con un dato di sessione salvato sul server .

A complicare ulteriormente le cose, la maschera di login non è sempre uguale, ma contiene un token variabile per rendere univoco ogni tentativo di autenticazione e diminuire le probabilità di “attacchi” tramite forza bruta alla nostra password. Questo token casuale è una caratteristica presente in quasi tutte le form usate da Joomla.

Dobbiamo quindi gestire tutti questi passaggi prima di poter eseguire la pagina.

Fortunatamente, wget è uno strumento potente: tramite l’uso di apposite opzioni, è possibile recuperare diverse pagine in sequenza di modo tale che risultino come un’unica sessione.

Maschera di login

La prima cosa da fare è recuperare la pagina di login, salvando il cookie che viene passato. Ecco il comando da usare (è spezzato su più righe per motivi di leggibilità):

wget  -O /tmp/login.html  --keep-session-cookies  --save-cookies tmp/cookies.txt  http://testsite/administrator/index.php

Vediamo nel dettaglio le opzioni che vengono usate:

  • -O /tmp/login.html” dice a wget di salvare la pagina restituita nel file indicato.
  • –keep-session-cookies” indica a wget di salvare in un file tutti i cookie di sessione, che solitamente il browser mantiene in memoria senza salvare in un file. Questa opzione in particolare ci permette di considerare chiamate successive di wget come un’unica sessione del browser, e vedremo che questo ci verrà utile nei passaggi successivi.
  • –save-cookies /tmp/cookies.txt” indica a wget quale file usare per il salvataggio dei cookies.
  • L’ultimo parametro è l’indirizzo della pagina da reperire, ovvero la index.php presente nella root di administrator. Questo parametro non cambierà nelle successive chiamate, dato che come sappiamo in Joomla è sempre la stessa pagina che viene invocata. Lo specifico componente verrà invocato tramite i parametri della richiesta URL (GET).

Possiamo controllare il buon risultato dell’operazione aprendo nel browser il file /tmp/login.html. Dovremmo vedere una maschera di login in puro formato HTML, ovvero senza l’applicazione degli stili CSS.

Reperimento del token

Come già detto, ogni volta che carichiamo la maschera di login viene aggiunto un token casuale per garantire l’univocità del tentativo di login. La prima cosa da fare è quindi quella di reperire questo token dalla pagina appena salvata.

Osservando la sorgente HTML della pagina di login vediamo che tale token viene aggiunto come un campo nascosto, come nell’esempio qui riportato:

<input type="hidden" name="7c82c705bad64a6bd252fb4a1282ac39" value="1" />

Value è sempre 1; quello che ci interessa è invece  il valore del campo “name” (nell’esempio, “7c82c705bad64a6bd252fb4a1282ac39”).

Invio dell’autenticazione

Adesso che abbiamo tutti i dati necessari possiamo tentare l’autenticazione, inviando un altro comando wget:

wget  -O /tmp/admin.html  --load-cookies /tmp/cookies.txt  --keep-session-cookies  --save-cookies /tmp/cookies.txt  --post-data="option=com_login&task=login&username=mioutente&passwd=miapassword&7c82c705bad64a6bd252fb4a1282ac39=1  http://testsite

Vediamo le opzioni aggiuntive:

  • “–load-cookies /tmp/cookies.txt” carica e invia alla pagina le informazioni del cookie salvate dal comando precedentemente.
  • “–post-data…” passa alla pagina index.php alcune informazioni aggiuntive quali, in particolare, la chiamata del componente “com_login” e dell’attività “login”, più i dati di autenticazione veri e propri (utente e password), più il token casuale reperito al punto precedente.

Anche in questo caso apriamo nel browser la pagina /tmp/admin.html: se tutto è andato bene dovremmo vedere la pagina iniziale del pannello amministrativo (sempre priva di CSS), se invece ci sono errori di autenticazione saranno mostrati a video.

Esecuzione del task

A questo punto nel nostro cookie locale abbiamo salvate tutte le informazioni necessarie per la nostra sessione: al prossimo comando wget, il sito Joomla ci riconoscerà come utenti autenticati (perlomeno per i prossimi 15 minuti, se non avete modificato le impostazioni di durata della sessione di Joomla) e ci permetterà di eseguire la funzione amministrativa richiesta. Procediamo:

wget  -O /tmp/task.html  --load-cookies /tmp/cookies.txt  --post-data="option=com_xvm&task=import"  http://testsite/administrator/index.php

Analizziamo le differenze rispetto alla precedente chiamata.

  • Sono state rimosse le opzioni relative al salvataggio dei cookies, dato che questa è l’ultima operazione del ciclo e non ci servirà poi di utilizzarli ulteriormente.
  • Il parametro “–post-data…” passa la richiesta URL relativa all’attività amministrativa da eseguire

Se tutto va bene, nella pagina /tmp/task.html troveremo il risultato della nostra operazione. Apriamola nel browser per verificare, a patto ovviamente che il nostro componente restituisca un qualche messaggio di conferma dell’operazione.

Rifiniture e conclusioni

L’intero passaggio, ovvero le successive chiamate a wget e le operazioni sui file, sono state incluse in uno script Perl che esegue tutto automaticamente. Potete usare qualsiasi altro linguaggio di scripting, l’importante sono i passaggi sopra riportati e la possibilità di aprire un file di testo alla ricerca del token, per poterlo usare nelle chiamate successive.

Per una maggior leggibilità e flessibilità, quasi tutte le stringhe (opzioni, file di salvataggio, url) sono state spostate in variabili da configurare all’inizio dello script.

Ecco lo script risultante. Nota: lo script viene fornito così com’è, senza nessuna garanzia nè assistenza, a puro titolo divulgativo. Non usatelo se non siete sicuri di sapere come usarlo.