Diventa Autore per CoreTech | Scopri di più





Che cosa è OS Command Injection

18/03/20 CoreTech Blog

OS command injection (iniezione di comando del sistema operativo o semplicemente iniezione di comando ) è un tipo di vulnerabilità injection. Il payload inserito dall'utente malintenzionato viene eseguito come comando del sistema operativo. Gli attacchi di inserimento di comandi del sistema operativo sono possibili solo nel caso in cui il codice dell'applicazione Web include chiamate al sistema operativo e l'input dell'utente viene utilizzato nella chiamata. Essi non hanno un linguaggio specifico - vulnerabilità di iniezione di comando possono apparire in tutti i linguaggi che consentono di chiamare un comando della shell di sistema: C, Java, PHP, Perl, Ruby, Python, e molti alti.

Il sistema operativo esegue i comandi arbitrari inseriti con i privilegi del server web. Pertanto, di per sé, la vulnerabilità di iniezione di comando non porta alla compromissione completa del sistema. Tuttavia, gli aggressori potrebbero essere in grado di utilizzare l'escalation dei privilegi e altre vulnerabilità per ottenere più accesso.

Nota: L'iniezione di comando è spesso confusa con l'iniezione di codice . Le vulnerabilità di inserimento di codice consentono all'utente malintenzionato di inserire un codice nel linguaggio di programmazione in cui è compilata l'applicazione Web.

Esempio di inserimento dei comandi

Lo sviluppatore dell'applicazione PHP di esempio desidera che l'utente sia in grado di visualizzare l'output del comando Windows ping nell'applicazione web. L'utente deve inserire l'indirizzo IP e l'applicazione invia ping ICMP a tale indirizzo. Sfortunatamente, lo sviluppatore considera troppo attendibile l'utente e non esegue la convalida dell'input. L'indirizzo IP viene passato utilizzando il metodo GET e quindi utilizzato nella riga di comando.

<?php

  $address = $_GET["address"];

  $output = shell_exec("ping -n 3 $address");

  echo "<pre>$output</pre>";

?>

L'utente malintenzionato abusa di questo script manipolando la richiesta GET con il seguente payload:

http://example.com/ping.php?address=8.8.8.8%26dir

La funzione shell_exec esegue il comando del sistema operativo seguente: ping -n 3 8.8.8.8&dir. Il simbolo & in Windows separa i comandi del sistema operativo. Di conseguenza, l'applicazione vulnerabile esegue un comando aggiuntivo (dir) e visualizza l'output del comando (elenco directory) sullo schermo:

Pinging 8.8.8.8 with 32 bytes of data:

Reply from 8.8.8.8: bytes=32 time=30ms TTL=56

Reply from 8.8.8.8: bytes=32 time=35ms TTL=56

Reply from 8.8.8.8: bytes=32 time=35ms TTL=56

Ping statistics for 8.8.8.8:

    Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

    Minimum = 30ms, Maximum = 35ms, Average = 33ms

 Volume in drive C is OS

 Volume Serial Number is 1337-8055

 Directory of C:\Users\Noob\www

(...)

Caratteri speciali di iniezione di comando

È possibile utilizzare caratteri speciali diversi per inserire un comando arbitrario. Il più semplice e più comune per Linux è il punto e virgola (;) e per Windows, la e commerciale (&). Tuttavia, anche i seguenti payload per lo script ping.php funzioneranno:

  • address=8.8.8.8%3Bwhoami ( carattere;, solo Linux)
  • address=8.8.8.8&26whoami ( carattere & , solo Windows)
  • address=8.8.8.8%7Cwhoami (carattere |)
  • address=invalid%7C%7Cwhoami ( caratteri ||, il secondo comando viene eseguito solo se il primo comando ha esito negativo)
  • address=8.8.8.8&26&26whoami (caratteri && )
  • %3E(whoami) (carattere > , solo Linux)
  • %60whoami%60 ( solo carattere` , solo Linux, il risultato verrà segnalato dal comando ping come errore)

Comando Prevenzione dell'iniezione

Esistono diversi metodi per garantire la sicurezza dell'applicazione e impedire l'esecuzione arbitraria di comandi tramite inserimento di comandi. Il più semplice e sicuro è quello di non utilizzare mai chiamate come shell_exec in PHP per eseguire i comandi del sistema operativo host. È invece necessario utilizzare i comandi equivalenti del linguaggio di programmazione. Ad esempio, se uno sviluppatore desidera inviare posta utilizzando PHP su Linux/UNIX, potrebbe essere tentato di utilizzare il comando mail disponibile nel sistema operativo. Dovrebbero invece utilizzare la funzione mail() in PHP.

Questo approccio può essere difficile se non esiste un comando equivalente nel linguaggio di programmazione. Ad esempio, non esiste un modo diretto per inviare pacchetti ping ICMP da PHP. In questi casi, è necessario utilizzare l'igienizzazione dell'input prima di passare il valore a un comando della shell. Come con tutti i tipi di iniezioni, il modo più sicuro è quello di utilizzare una whitelist. Ad esempio, nello script ping.php, è possibile verificare se la variabile address è un indirizzo IP:

$address = filter_var($_GET["address"], FILTER_VALIDATE_IP);

Si sconsiglia di utilizzare le liste nere perché gli aggressori potrebbero trovare un modo per aggirarle. Tuttavia, se è assolutamente necessario utilizzare una lista nera, è necessario filtrare o eseguire l'escape dei seguenti caratteri speciali:

  • Windows: ( ) < /> & = ? ; [ ] ^ ~ ! . " % / : : , '
  • Linux: ( ) < /> & = ? ; [ ] : – : ! . " % / : : , '

Articoli su Acunetix e Hacking

Trovare le vulnerabilità dei siti web prima degli HackerL'importanza della convalida delle correzioni: lezioni da GoogleSDLC agile e sicuro - Best practiceIn che misura le aziende gestiscono la sicurezza delle applicazioni Web?Cross-Origin Resource Sharing (CORS) e intestazione Access-Control-Allow-OriginCosa sono i reindirizzamenti aperti?DevSecOps: come arrivarci da DevOpsIl bigino su SQL Injection per sviluppatoriSfruttare SSTI in ThymeleafSicurezza nginx: come proteggere la configurazione del serverRafforzamento del sistema Web in 5 semplici passaggiCos'è la sicurezza del sito Web - Come proteggere il tuo sito Web dall'hackingRapporto sulle vulnerabilità delle applicazioni Web Acunetix 2020Perché l'elenco delle directory è pericoloso?Cosa sono gli hack di Google?Cosa è l'attacco BEASTWeb Shells in Action - Rilevazione e prevenzione - parte 5Web Shells in Action - parte 4Mantenere le Web Shells sotto copertura - parte 3Introduzione alle web shell - parte 2: 101 Uso di PHPIntroduzione alle web shell - parte 1Debunking 5 miti sulla postura della sicurezza informaticaIniezioni di NoSQL e come evitarleConfigurazione passo passo di Acunetix con JenkinsCosa sono i riferimenti a oggetti diretti non sicuriAnche il più forte cade: un'iniezione SQL in Sophos XG FirewallAcunetix rilascia Business Logic RecorderCome recuperare un sito Web compromessoCome difendersi dagli hacker Black Hat durante la pandemia COVID-19Che cos'è l'inclusione remota dei file (RFI)?Apache Security - 10 consigli per un'installazione sicuraUn nuovo sguardo sugli attacchi correlati al proxy inversoVulnerabilità delle password comuni e come evitarleTutto quello che devi sapere sugli attacchi Man-in-the-MiddleChe cosa sono le iniezioni HTMLRed Teaming – 5 consigli su come farlo in modo sicuroTesta le tue competenze XSS utilizzando siti vulnerabiliPerché hacker malintenzionati hanno messo gli occhi sugli ospedaliPratiche di codifica sicura – I tre principi chiaveLa maledizione delle vecchie librerie JavaMutation XSS nella ricerca GoogleIgnorare SOP utilizzando la cache del browserCome e perché evitare reindirizzamenti e inoltri non convalidati?Dirottamento di sessione e altri attacchi di sessioneCome abbiamo trovato un altro XSS in Google con AcunetixChe cos'è un buffer overflowChe cos'è l'overflow di IntegerChe cos'è HSTS e perché dovrei usarlo?Che cosa è OS Command InjectionVulnerabilità delle entità esterne XML in Internet ExplorerCoreTech assicura protezione dei siti Web con AcunetixCoreTech distributore Acunetix a fianco dei partner per la CyberSecurityCyberSecurity applicativa, nuova opportunità per voi!