Faille XSS dans moteur de recheche

hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 6 octobre 2010 - 27 juil. 2010 à 07:52
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Derniè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.

pourriez vous m'aider SVP

Faille XSS dans moteur de recheche

9 réponses

pysco68 Messages postés 681 Date d'inscription samedi 26 février 2005 Statut Membre Dernière intervention 21 août 2014 8
27 juil. 2010 à 08:35
Bonjour,

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

Cordialement,
- Pysco68
0
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Derniè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'.

\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.");
}
?>
0
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Derniè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
0
cs_Seby63 Messages postés 8 Date d'inscription dimanche 25 juillet 2010 Statut Membre Dernière intervention 12 août 2010
28 juil. 2010 à 16:25
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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Seby63 Messages postés 8 Date d'inscription dimanche 25 juillet 2010 Statut Membre Dernière intervention 12 août 2010
28 juil. 2010 à 16:25
Ou strip_tags()...
0
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Derniè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

Le code pour appeler le moteur de recherche et

<form action="Moteur_de_Recherche/resultats.php" method="post">
0
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 6 octobre 2010
29 juil. 2010 à 08:35
je ne connait pas la balise strip_tags()... tu pourrais me donner un exemple
0
RaftY Messages postés 56 Date d'inscription mardi 5 mars 2002 Statut Membre Dernière intervention 12 août 2010
30 juil. 2010 à 17:57
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!
0
hantise_2004 Messages postés 8 Date d'inscription vendredi 1 octobre 2004 Statut Membre Dernière intervention 6 octobre 2010
5 août 2010 à 07:19
Merci a tous problème resolus
0
Rejoignez-nous