<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.cgi-bin.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'security.cgi-bin.attacks.php',
    1 => 'Faiblesses connues',
    2 => 'Faiblesses connues',
  ),
  'up' => 
  array (
    0 => 'security.cgi-bin.php',
    1 => 'Binaires CGI',
  ),
  'prev' => 
  array (
    0 => 'security.cgi-bin.php',
    1 => 'Binaires CGI',
  ),
  'next' => 
  array (
    0 => 'security.cgi-bin.default.php',
    1 => 'Cas 1 : Seuls les fichiers publics sont servis',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'security/cgi-bin.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.cgi-bin.attacks" class="sect1">
    <h2 class="title">Faiblesses connues</h2>
    <p class="simpara">
     Utiliser PHP comme un exécutable <abbr title="Common Gateway Interface">CGI</abbr> est une possibilité
     pour les cas où l&#039;on ne veut pas l&#039;utiliser comme un module
     du serveur web (comme Apache), ou bien lorsque l&#039;on souhaite l&#039;utiliser en
     combinaison avec un gestionnaire <abbr title="Common Gateway Interface">CGI</abbr> complémentaire, afin de
     créer un environnement de script sécurisé (en utilisant
     des techniques de <strong class="command">chroot</strong> ou <strong class="command">setuid</strong>).
     Une telle décision signifie habituellement que l&#039;exécutable
     <strong class="command">php</strong> sera installé dans le répertoire du serveur web <var class="filename">cgi-bin</var>.
     Le conseil de sécurité CERT <a href="http://www.cert.org/advisories/CA-1996-11.html" class="link external">&raquo;&nbsp;CA-96.11</a> recommande
     de ne pas placer d&#039;interpréteurs dans le répertoire <var class="filename">cgi-bin</var>.
     Même si le binaire <strong class="command">php</strong> peut être utilisé comme interpréteur autonome,
     PHP est conçu pour prévenir les attaques que cette configuration peut rendre possibles :
    </p>
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       Accès au système de fichiers :
       <var class="filename">http://my.host/cgi-bin/php?/etc/passwd</var>
      </span>
      <span class="simpara">
       Lorsque la requête est passée dans une url, après le point
       d&#039;interrogation (<code class="literal">?</code>), elle est envoyée à l&#039;interpréteur
       comme une ligne de commande par l&#039;interface CGI. Habituellement,
       l&#039;interpréteur ouvre le fichier spécifié et l&#039;exécute.
      </span>
      <span class="simpara">
       Lorsqu&#039;il est invoqué comme exécutable CGI, <strong class="command">php</strong> refuse
       d&#039;interpréter les arguments de la ligne de commande.
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       Accès à n&#039;importe quel document web sur le serveur :
       <var class="filename">http://my.host/cgi-bin/php/secret/doc.html</var>
      </span>
      <span class="simpara">
       Le &quot;path information&quot; dans l&#039;url, situé juste après le nom
       de l&#039;exécutable PHP, <var class="filename">/secret/doc.html</var> est
       utilisé par convention pour spécifier le nom du fichier
       qui doit être ouvert et interprété par le programme
       <abbr title="Common Gateway Interface">CGI</abbr>. Habituellement, des directives de configuration
       du serveur web (pour le serveur Apache : <code class="literal">Action</code>) sont utilisées pour
       rediriger des requêtes vers des documents comme
       <var class="filename">http://my.host/secret/script.php</var> vers
       l&#039;interpréteur PHP. Dans une telle configuration, le serveur web
       vérifie d&#039;abord s&#039;il a accès au répertoire
       <var class="filename">/secret</var>, et redirige ensuite la requête vers
       <var class="filename">http://my.host/cgi-bin/php/secret/script.php</var>.
       Malheureusement, si la requête est faite directement sous cette forme,
       aucune vérification d&#039;accès n&#039;est faite par le serveur web
       pour le fichier <var class="filename">/secret/script.php</var>,
       mais uniquement pour le fichier <var class="filename">/cgi-bin/php</var>.
       De cette manière, n&#039;importe quel utilisateur qui peut accéder
       au fichier <var class="filename">/cgi-bin/php</var> peut aussi
       accéder à n&#039;importe quel document protégé sur le serveur web.
      </span>
      <span class="simpara">
       Avec PHP, les options d&#039;exécution
       <a href="ini.core.php#ini.cgi.force-redirect" class="link">cgi.force_redirect</a>,
       <a href="ini.core.php#ini.doc-root" class="link">doc_root</a> et
       <a href="ini.core.php#ini.user-dir" class="link">user_dir</a> peuvent être
       utilisées pour prévenir ce genre d&#039;attaque, si des restrictions
       d&#039;accès sont appliquées sur les documents du serveur. Voir
       ci-dessous pour des explications plus complètes sur les
       différentes combinaisons.
      </span>
     </li>
    </ul>
   </div><?php manual_footer($setup); ?>