Sì, questa è una cosa reale. Ma proprio come con SQLi non puoi semplicemente sfruttare alcun programma, ma uno scarsamente scritto con servizi igienici inadeguati potrebbe essere vulnerabile.
Diamo prima un'occhiata alle lingue interpretate. Perché l'injection di codice sia possibile qui devi avere qualcosa che prende il codice in una stringa e lo esegue.
In JavaScript hai la funzione eval()
che fa quello. Quindi se fai eval(untrustedData)
hai te stesso una vulnerabilità. Per questo motivo eval()
è considerato "malvagio" e spesso qui la raccomandazione di non usarlo affatto. Esistono anche altri casi in subclasso che consentono l'esecuzione di codice da una stringa, come new Function()
e setInterval()
.
In PHP hai anche una funzione eval()
, ritenuta così pericolosa che il manuale include un Attenzione:
Caution: The eval()
language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.
Che ne dici delle lingue compilate? Sono meno vulnerabili perché non hanno funzioni che eseguono codice arbitrario, dal momento che quel codice dovrebbe essere compilato per primo. Ovviamente è possibile scrivere un programma che genera codice sorgente (da dati non attendibili), lo compila e lo esegue. Ma sarebbe una cosa piuttosto strana da fare.
Potresti argomentare, come fa iain , che lo sfruttamento dei buffer overflow è una forma di iniezione di codice, dal momento che stanno iniettando il codice macchina nel programma. Immagino che si riduca alla semantica se lo conti o meno.