Apache et arborescence du système - réseaux et sécurité - Linux et OS Alternatifs
Marsh Posté le 09-02-2003 à 12:21:07
un tout p'tit up paske c le week end
Marsh Posté le 09-02-2003 à 13:03:55
Si Apache est correctement configuré, ça ne doit pas arriver. Si ça arrive, c'est un bug ou un problème de configuration (et c'est valable quel que soit le serveur Web, IIS, Zeus,...).
Dans chaque directive <VirtualHost url>, il doit y avoir un "DocumentRoot" qui "isole" chaque site Web...
Et bien sûr, il ne doit y avoir aucun site dont le DocumentRoot est la base ($CHEMIN, /usr/www dans l'exemple).
#>-------- en gros comme ça : -----------------<
...
<VirtualHost url1>
ServerName url1
<Directory "/usr/www/url1">
Options Indexes -FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost url2>
ServerName url2
<Directory "/usr/www/url2">
Options Indexes -FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
....
#>--------------------------------------<
Remarque : s'il y a des scripts exécutables sur le serveur (par le biais de Perl, PHP, ASP, JSP, Bash ou autre langage du côté serveur) qui peuvent lire des fichiers à partir de paramètres passés par le client, faut faire attention au traitement de ces paramètres.
Chtit exemple A NE PAS SUIVRE (en PHP) :
>-------------------------------<
<?php
// page.php
// Cette page est appelée pour charger d'autres fichiers
$nomfic=$_GET["nomfichier"];
header("Content-Type: application/octet-stream" );
header("Content-Length: ".filesize($nomfic));
$fp = fopen($nomfic, 'r';
fpassthru($fp);
fclose($fp);
?>
>-------------------------------<
Si un comique tape comme url dans son navigateur :
http://site/page.php?nomfichier=../../etc/passwd
il récupèrera le fichier /etc/passwd du système ! Bon, les droits unix s'appliquent toujours (puisque Apache/PHP ne tourne pas en tant que root) donc il ne sera pas possible de récupérer /etc/master.passwd ou /etc/shadow, mais on peut plutôt chercher à récupérer un .htaccess et un fichier de mot de passe généré par htpasswd...
Bref bref... J'ai été un peu long, mais je tenais à signaler ce problème quand des scripts sont exécutés sur un serveur. (vécu inside)
Marsh Posté le 09-02-2003 à 15:49:03
merci pour ton aide, je verifierai mon fichier de conf demain au taf
(de mémoire il y ressemble bcp, seule l'option followsymlinks diffère je crois)
Marsh Posté le 09-02-2003 à 16:09:50
unk00 : le script php ke tu as mis, c est bien du cote server, donc fo etre un peu bete pour faire ca nan ?
Marsh Posté le 09-02-2003 à 16:47:15
L'option -FollowSymlink (noter le "-" devant) empêche simplement le suivi des liens symboliques. Sinon, par exemple, si un gars fait un lien
$> ln -s /usr/www/url1/fichier.html /usr/www/url2/fichier.html
alors la requête "http://url2/fichier.html" affichera le même fichier que "http://url1/fichier.html". Bon, bien sûr, ça nécessite en général un accès Shell sur la machine.
(tomate77)
Citation : fo etre un peu bete pour faire ca |
Ben oui, mais là, les développeurs n'avaient que peu d'intérêt pour l'aspect sécurité des choses. Le pire, c'est que sur ce projet, j'avais (pour une fois) fait une doc sur la sécurité dont une partie traitait des erreurs de développement à éviter : en gros, il était écrit qu'il fallait contrôler toutes les entrées envoyées par le client du côté du serveur (et pas en Javascript). Il y avait même un exemple (avec un échappement pour SQL).
Donc, en conclusion, les docs, ça sert à rien, personne ne les lit... :-/
Marsh Posté le 09-02-2003 à 16:49:14
ouais mais kan meme faire un truc aussi "bugue" fo le vouloir
Marsh Posté le 09-02-2003 à 16:56:35
Bah oui... Bon, en réalité, c'était pas un code aussi simple, et c'était sur un serveur IIS/ASP (et je connais pas les ASP), et comme je ne suivais pas le développement, je ne l'ai vu que quand j'ai fait quelques tests une fois que l'appli tournait...
Marsh Posté le 09-02-2003 à 19:06:42
ben y a aussi des option de securité dans le php.ini c'est po pour rien, je pense !
par contre coté perl et cgi ?!
Marsh Posté le 09-02-2003 à 23:06:07
Citation : ben y a aussi des option de securité dans le php.ini c'est po pour rien, je pense ! |
Oui, bien sur, c'était un exemple, qui marche par défaut sur certaines install de PHP. J'ai donné un exemple en PHP parce que c'était plus rapide pour illustrer (c'est ce que je connais le mieux du point de vue developpement).
Citation : par contre coté perl et cgi ?! |
Mmmh ? C'est à dire ? comment sécuriser ça ?
Marsh Posté le 10-02-2003 à 09:45:35
bon alors ca change rien a mon pb ...
j'ai meme testé avec un
<Directory "/usr/www/url1">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
<Directory "/usr/www/url2">
Options None
AllowOverride None
Order allow,deny
Allow from all
</Directory>
et j'arrive tjrs a remonter mon arbo...
Marsh Posté le 10-02-2003 à 10:00:56
unk00 a écrit :
|
oui je vois pas, j'ai lu des truc sur suexec, m 'enfin bon ca ma pas convaincu !
Marsh Posté le 10-02-2003 à 10:45:25
C'est bizarre... Et il n'y a aucune directive "DocumentRoot /usr/www" ou "<Directory /usr/www>", même hors de la configuration des hôtes virtuels (config initiale) ?
Je ne vois pas bien la raison de ce comportement... Tiens, quand on fait "http://url1/\.\./index_url2.html", on voit quoi dans le fichier de logs pour l'hôte virtuel url1 ? (un truc du genre <IP> <date> GET /%5C.%5C./index_url2.html HTTP/1.1 ; avec quelque part la valeur de retour) ? Juste pour voir ce que Apache va chercher comme fichier...
Marsh Posté le 10-02-2003 à 11:00:44
la seule directive <DIRECTORY> hors des mes hotes virtuels est :
<Directory />
Options None
AllowOverride None
Order deny,allow
Allow from all
</Directory>
et pas de documentroot défini
dans le fichier access_log de url1 on voit :
url1 - - [10/Feb/2003:10:55:51 +0100] "GET /%5C.%5C./url2/index_url2.html HTTP/1.1" 200 24894
NB : il y avait une petite erreur dans mon premier post : l'url ke je rentrais etait : http://url1/../url2/index_url2.html et non http://url1/../index_url2.html
Marsh Posté le 10-02-2003 à 11:25:47
Bon, je pensais qu'Apache empêchait ça ; et d'ailleurs, je viens de tester sur un serveur, et ici, Apache m'interdit bien de faire ça (erreur 404 : not found).
Désolé, je ne vois pas pourquoi là ça se comporte comme ça...
Marsh Posté le 10-02-2003 à 11:47:29
oui l'intérêt d'apache c kan meme de pouvoir empêcher ca, mais la je vois pas pkoi ca marche pas
merci kan meme de ton aide
Marsh Posté le 10-02-2003 à 14:34:20
Au fait, juste une remarque, les directives <Directory> pour chaque hôte virtuel sont définies que dans le bloc <VirtualHost> ou ailleurs dans le fichier ?
Marsh Posté le 10-02-2003 à 14:38:20
uniquement dans le bloc <virtualhost>
Marsh Posté le 10-02-2003 à 15:09:16
Pareil... Je ne pensais pas que c'était ça, mais bon...
S'il est pas trop gros, tu peux peut-être poster le "httpd.conf" (en virant les commentaires et les trucs d'indexation -AddIcon*, AddLanguage*, ...- et en remplacant les valeurs sensibles par qqch d'"inoffensif" ). Enfin, je ne sais si c'est judicieux/autorisé de poster un truc de 7-8 ko ici (?)
Y a ptet un spécialiste d'Apache qui trouvera le pb... Même si je n'ai pas ce problème, ça m'intéresse d'avoir la réponse...
Marsh Posté le 07-02-2003 à 13:56:03
admettons ke je dispose d'une machine faisant tourner Apache 1.3.27, de 2 sites web hébergés en virtual hosting (http://url1 et http://url2).
admettons aussi ke ces 2 sites soient stockés dans $CHEMIN/url1 et $CHEMIN/url2.
comment éviter qu'une personne tapant dans son navigateur :
http://url1/../index_url2.html
accède a la page d'accueil du site http://url2 ??
merci d'avance
---------------
Self Destruction Might Be The Answer - http://www.kazekami.org