Faille XSS dans moteur de recheche

Signaler
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010
-
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010
-
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.

pourriez vous m'aider SVP

Faille XSS dans moteur de recheche

9 réponses

Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
7
Bonjour,

précise un peux plus, et donne nous du code comme ca on pourra t'aider,

Cordialement,
- Pysco68
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010

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'.

\n");
print(" \n");
print("</center> \n");
}
else {
if(@ !$p) $p=1;
if($nombreCorrespondances==1) {
print(" \n");
print("La requête '$requete' a donné 1 résultat.
\n");
print(" \n");
}
else {
if($nombreCorrespondances>=$NombreRepMax) {
print(" \n");
print("La requête '$requete' a donné plus de $NombreRepMax résultats.
\n");
print(" \n");
$nombreCorrespondances=$NombreRepMax;
}
else {
print(" \n");
print("La requête '$requete' a donné $nombreCorrespondances résultats.
\n");
print(" \n");
}
}
print(" \n");
print("Liste des pages ".$p." à ".(min(($p+$NombreRepPages-1),$nombreCorrespondances))." :

");
print(" \n");
for($compt=$p;$compt<=min(($p+$NombreRepPages-1),$nombreCorrespondances);$compt++) {
print(" \n");
print("$compt. ".$titreDocument[$documentsCorrespondantsOrd[$compt]]."
\n");
print($descriptionDocument[$documentsCorrespondantsOrd[$compt]]."

\n");
print(" \n");
}
print("<center> \n");
if(($p-$NombreRepPages)>0) {
print(" \n");
print("<< page précédente \n");
print(" \n");
}
if($nombreCorrespondances>$NombreRepPages) {
print(" \n");
for($a=1;$a<=(floor(($nombreCorrespondances-1)/$NombreRepPages)+1);$a++) {
if((floor($p/$NombreRepPages)+1)==$a) {
print("$a \n");
}
else {
@ print("$a \n");
}
}
print(" \n");
}
if(($p+$NombreRepPages)<=$nombreCorrespondances) {
print(" \n");
@ print(" page suivante >> \n");
print(" \n");
}
print("</center> \n");
}

// **************************************************************************
// Affichage du formulaire permettant d'effectuer une nouvelle recherche
// **************************************************************************
print("<form action=\"resultats.php\" method=\"post\"> \n");
print("<table align=\"center\"> \n");
print("----, \n\");
print(\" \n\");
print(\"Effectuer une nouvelle recherche:
\n\");
print(\" \n\");
print(\"</td> \n\");
print(\"----
\n");
print(" \n");
print(" ");
print(" \n");
print(", \n\");
print("
\n");
print("</form> \n");
print("<center>\n");
print("</td></tr> \n");
print("</table> \n");
$idFiqReq=fopen("req.txt","a+");
fputs($idFiqReq,$requete."\n");
fclose($idFiqReq);
}
?>





fichier pour indexer mon site indexat.php

<?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 :

\n");
$nombreFichiersAIndexer=count($listeXFichiers);
for ($compt=0;$compt<$nombreFichiersAIndexer;$compt++) {
print($compt." / ".$listeXFichiers[$compt]."
\n");
}
print("
\n");


// ****************************************************************************
// 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.");
}
?>
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010

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
Messages postés
8
Date d'inscription
dimanche 25 juillet 2010
Statut
Membre
Dernière intervention
12 août 2010

Ta essayer avec un mysql_real_escape_string()?

Tu pourrais nous copier juste les lignes ou tu récupère le texte saisie par l'utilisateur?
Messages postés
8
Date d'inscription
dimanche 25 juillet 2010
Statut
Membre
Dernière intervention
12 août 2010

Ou strip_tags()...
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010

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

Le code pour appeler le moteur de recherche et

<form action="Moteur_de_Recherche/resultats.php" method="post">
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010

je ne connait pas la balise strip_tags()... tu pourrais me donner un exemple
Messages postés
56
Date d'inscription
mardi 5 mars 2002
Statut
Membre
Dernière intervention
12 août 2010

Salut,

google ou php.net sont tes amis.

http://www.google.fr/search?sourceid=chrome&ie=UTF-8&q=strip_tags()


______oOOO________OOOo________

RaftY, du code C commode!
Messages postés
8
Date d'inscription
vendredi 1 octobre 2004
Statut
Membre
Dernière intervention
6 octobre 2010

Merci a tous problème resolus