hantise_2004
Messages postés8Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention 6 octobre 2010
-
27 juil. 2010 à 07:52
hantise_2004
Messages postés8Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention 6 octobre 2010
-
5 août 2010 à 07:19
Bonjour,
J'ai découvert une faille de type XSS dans mon moteur de recherche j'ai essayer d'inclure HTMLentitie et htmlspecialchars mais ils me font planter mon moteur de recheche chaque fois que je les inclus dans mon fichier php.
hantise_2004
Messages postés8Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention 6 octobre 2010 27 juil. 2010 à 09:09
Fichier resultats.php
<?php
$largeurTableau= "95%"; // Largeur du Tableau
$NombreRepPages=10; // Nombre n d'intitulés de pages Web à afficher par pages de résultat
$NombreRepMax=200; // Nombre maximum de résultats à traiter par le moteur
$policeResultats="verdana"; // Police de caractères utilisée pour l'affichage des résultats
$couleurPoliceResultats="#000000"; // Couleur de la police de caractères utilisée pour l'affichage des résultats
?>
<html>
<head>
<title>Moteur de recherche - Résultats de la recherche</title>
</head>
<?php
$fichierIndex="indexsite.dat";
$motsVides=" and or et ou le la les un une du de des a à au aux son sa ses ne ni non sauf ce ces cet je tu il elle on nous vous ils elles etc mon ma ton ta vos se y en ";
if(!file_exists("indexsite.dat")) {
print("Le site Web n'a pas encore été indexé : veuillez exécuter le script d'indexation avant d'effectuer votre première recherche.\n");
exit;
}
if(!$requete) {
print("<center>\n");
print("\n");
print("Vous avez activé la recherche sans avoir préalablement saisi votre requête.
");
print("Cliquez ici pour effectuer une nouvelle recherche.
\n");
print("\n");
print("</center>\n");
}
else {
$requete =trim(stripslashes($requete));
$requete1= $requete;
$expressions[]="Liste des expressions";
while($testExpress=ereg("["]([^"]+)["]",$requete1,$corresExpress)) {
$exp=$corresExpress[1];
$expressions[]=$exp;
$requete1=ereg_replace($corresExpress[0],"",$requete1);
}
$nombreExpressions=count($expressions)-1;
function netGuil($term) {
if(ereg("^["]*([^"]+)["]*$",$term,$corres)) {
$reps=$corres[1];
return $reps;
}
else {
return($term);
}
}
$requete2=$requete;
$motsCles[]="Liste des mots-clés";
$mot=trim(stripslashes(strtok($requete2," ")));
if(!(ereg("[ ]".$mot."[ ]",$motsVides))) {
$motsCles[]=netGuil($mot);
}
while($mot=trim(stripslashes(strtok(" ")))) {
if($mot and (!(ereg("[ ]".$mot."[ ]",$motsVides)))) {
$motsCles[]=netGuil($mot);
}
}
$nombreMotsCles=count($motsCles)-1;
$contenuIndex=file($fichierIndex);
$nlignesIndex=count($contenuIndex);
$nombreDocumentsIndexes=($nlignesIndex-1)/4;
for($compt=1;$compt<=$nombreDocumentsIndexes;$compt++) {
$cheminDocument[$compt]=trim(stripslashes($contenuIndex[(4*($compt-1))+1]));
$titreDocument[$compt]=trim(stripslashes($contenuIndex[(4*($compt-1))+2]));
$descriptionDocument[$compt]=trim(stripslashes($contenuIndex[(4*($compt-1))+3]));
$texteDocument[$compt]=trim(stripslashes($contenuIndex[(4*($compt-1))+4]));
}
for($compt=1;$compt<=$nombreDocumentsIndexes;$compt++) {
$score[$compt]=0;
if(eregi("(^|[ .,:;!?'()])".$requete."([ .,:;!?'()]|$)",$texteDocument[$compt])) $score[$compt]=$score[$compt]+1;
for($a=1;$a<=$nombreExpressions;$a++) {
if(eregi("(^|[ .,:;!?'()])".$expressions[$a]."([ .,:;!?'()]|$)",$titreDocument[$compt])) $score[$compt]=$score[$compt]+2;
if(eregi("(^|[ .,:;!?'()])".$expressions[$a]."([ .,:;!?'()]|$)",$texteDocument[$compt])) $score[$compt]=$score[$compt]+1;
}
for($b=1;$b<=$nombreMotsCles;$b++) {
if(eregi("([^*]*)[*]",$motsCles[$b],$corMotCle)) {
if(eregi("(^|[ .,:;!?'()])".$corMotCle[1],$titreDocument[$compt])) $score[$compt]=$score[$compt]+2;
if(eregi("(^|[ .,:;!?'()])".$corMotCle[1],$texteDocument[$compt])) $score[$compt]=$score[$compt]+1;
}
else {
if(eregi("(^|[ .,:;!?'()])".$motsCles[$b]."([ .,:;!?'()]|$)",$titreDocument[$compt])) $score[$compt]=$score[$compt]+2;
if(eregi("(^|[ .,:;!?'()])".$motsCles[$b]."([ .,:;!?'()]|$)",$texteDocument[$compt])) $score[$compt]=$score[$compt]+1;
}
}
}
$HiScore=max($score);
arsort($score);
$documentsCorrespondantsOrd[]=0;
for(reset($score);$cle=key($score);next($score)) {
if(current($score)>0) {
$documentsCorrespondantsOrd[]=$cle;
}
}
$nombreCorrespondances=count($documentsCorrespondantsOrd)-1;
print("\n\");
print(\"----
\n");
if($nombreCorrespondances<1) {
print("<center> \n");
print(" \n");
print("Désolé, aucune page ne correspond à la recherche : '$requete'.
<?php
// ##################################################################################
// Paramètres de configuration du module d'indexation : nom du répertoire principal à parcourir (rappelons que ses sous-répertoires sont parcourus de façon automatique)
// Localisation du répertoire principal à indexer Note : le nom du répertoire ne doit pas être refermé par un slash
// Entrez la valeur "." pour le répertoire courant, ".." pour le répertoire parent
$cheminRepertoire="..";
// Renseignement sur les types de fichiers à indexer Note : Entrez ici les différents formats de fichiers à indexer, séparés par une virgule
// Rappel : les seuls formats acceptés pour l'instant sont htm, html et txt
$listeFormatsFichiers="htm,html";
?>
<html>
<head>
<title>Moteur de recherche - Module d'indexation</title>
</head>
<?php
if(!is_dir($cheminRepertoire)) {
print("Erreur ! ".basename($cheminRepertoire)." n'est pas un répertoire.");
exit;
}
$formatsInterdits =" php php3 php4 ";
$formatCourant= strtok($listeFormatsFichiers,",");
do {
if(eregi(" ".$formatCourant." ",$formatsInterdits)) {
print("Rappel : les fichiers de format $formatCourant ne peuvent pas être indexés.
\n");
$formatCourant =strtok(",");
continue;
}
else {
$formatFichiers[]=".".$formatCourant;
$formatCourant=strtok(",");
continue;
}
} while($formatCourant);
function listeRecursiveFichiers($cheminRep,$extension) {
global $tableauCorrespondances;
static $formatsTraites;
$idRep=opendir($cheminRep);
while($objet=readdir($idRep)) {
$formatObjet=strstr($objet,".");
$cheminObjet=$cheminRep."/".$objet;
if($objet=="." or $objet=="..") {
continue;
}
if($formatObjet==$extension) {
$tableauCorrespondances[]=$cheminObjet;
}
if(is_dir($cheminObjet)) {
listeRecursiveFichiers($cheminObjet,$extension);
}
}
closedir($idRep);
}
$nombreFormats=count($formatFichiers); // nombre de formats de fichiers à indexer
for($compt=0;$compt<$nombreFormats;$compt++) {
listeRecursiveFichiers($cheminRepertoire,$formatFichiers[$compt]);
}
$listeXFichiers=$tableauCorrespondances;
print("
La liste des fichiers à indexer est la suivante :
// ****************************************************************************
// Création du fichier indexsite.dat et enregistrement de différentes valeurs :
// ****************************************************************************
$idFicIndex=fopen("indexsite.dat","w+");
// Ecriture d'un message d'avertissement sur la première ligne
fputs($idFicIndex,"Fichier Index. Ne pas éditer ! \n");
for($compt=0;$compt<count($listeXFichiers);$compt++) {
$cheminFichierCandid=$listeXFichiers[$compt];
if(!is_readable($cheminFichierCandid)) {
continue;
}
$idFicCandid=fopen($cheminFichierCandid,"r");
$titre="";
$description="";
$ligne="";
$texte="";
while(!feof($idFicCandid)) {
$ligne=fgets($idFicCandid,10000);
$ligne=str_replace(" "," ",$ligne);
$ligne=str_replace(" "," ",$ligne);
$ligne=trim($ligne);
if (ereg("^[^<>]+$",$ligne)
or ereg(">[^<>]+<",$ligne)
or ereg(">[^<>]+$",$ligne)
or ereg("^[^<>]+<",$ligne)
) {
$ligne=$ligne." ";
}
$texte=$texte.$ligne;
}
fclose($idFicCandid);
$texte=stripslashes($texte);
if($testTitre=eregi("<title>(.*)</title>",$texte,$corresTitre)) {
$titre=$corresTitre[1];
}
else {
$titre="Document sans titre";
}
$testMeta=eregi("name="description"[ ]*content="([^"]*)"",$texte,$corresDescript);
if($testMeta) {
$description=$corresDescript[1];
$description=substr($description,0,150);
}
$texte=eregi_replace("<script.+/script>","",$texte);
$texte=strip_tags($texte);
$texte=substr($texte,0,8000);
if(!$testMeta) {
$description=substr($texte,0,150);
}
if(strlen($description)>140) {
if($testFin1=ereg("(.*)[ ][^ ]*$",$description,$corresFin1)) {
$description=$corresFin1[1];
if($testFin2=ereg("(.*)[,;:.]$",$description,$corresFin2)) {
$description=$corresFin2[1];
}
$description=$description."...";
}
else {
$description=$description."...";
}
}
fputs($idFicIndex,$cheminFichierCandid."\n"); // écriture du chemin du fichier (ligne N)
fputs($idFicIndex,$titre."\n"); // écriture du titre (ligne N+1)
fputs($idFicIndex,$description."\n"); // écriture de la description (ligne N+2)
fputs($idFicIndex,$texte."\n"); // écriture du texte à indexer (ligne N+3)
print("$compt / Le fichier $cheminFichierCandid a bien été indexé
\n");
}
fclose($idFicIndex);
//**********************************************************************************
// Vérification du résultat de l'indexation
//**********************************************************************************
$tabFicIndVerif=file("indexsite.dat");
$nlignesEffectivementIndexees=(count($tabFicIndVerif)-1)/4;
print("
\n");
if($nlignesEffectivementIndexees==$nombreFichiersAIndexer) {
print("L'indexation des fichiers contenus dans le répertoire "$cheminRepertoire" a atteint son terme et s'est déroulée correctement. \n");
print("Pour effectuer une première recherche, cliquez ici.\n");
}
else {
print("L'indexation des fichiers contenus dans le répertoire "$cheminRepertoire" n'a pas atteint son terme.
Ce problème est peut-être dû au nombre relativement important de fichiers à indexer. Afin de tous les englober dans le fichier indexsite.dat, vous devez recommencer l'opération d'indexation en ayant préalablement augmenté (si vous en avez la possibilité) la durée maximum d'exécution des scripts PHP, dans le fichier php.ini.");
}
?>
hantise_2004
Messages postés8Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention 6 octobre 2010 27 juil. 2010 à 09:14
exemple de requette non filtrée par le moteur de recherche
une attaque XSS toute simple <script>alert(document.cookie);</script> mon moteur de recherche l'exècute sans le bloquer
hantise_2004
Messages postés8Date d'inscriptionvendredi 1 octobre 2004StatutMembreDernière intervention 6 octobre 2010 29 juil. 2010 à 08:34
Je ne passe par par une base Mysql
Je lance le fichier indexat.php qui index mon site et stocke les donnée dans un fichier texte indexsite.dat ou il enregistre tout les liens