Faille XSS pour pro :(

Signaler
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011
-
 Snowboarder69 -
Bonjour, en esperant trouver qq qui puise m'aider a combler ma faille XSS

voila la faille de type index.php ?>'><ScRiPt%20%0a%0d>alert(1687822802)%3B</ScRiPt>.

passe chez moi j ai essayer pas mal de truc mais rien a faire
j'apelle mes page comme ceci
index.php?page=login
index.php?page=vente
...
comment faire pour corriger cette faille
a saoir que elle passe de cette facon suivante dans l url:

index.php?lang=%3E'%3E%3CScRiPt%20%0a%0d%3Ealert(1687822802)%3B%3C/ScRiPt%3E

si le mot script est ecrit comme ceci script il ne se passe rien si il devientScRiPt
alors le script s'execute

j ai essayer differents methode sans succes:

htmlspecialchars(stripslashes($_POST));
htmlspecialchars(stripslashes($_GET));

$page = htmlspecialchars($page);
$page=str_replace("%3E","",$page);
htmlentities($host, ENT_QUOTES, 'UTF-8');
//
RemoveXSS($_POST);
RemoveXSS($_GET);
RemoveXSS($pageOK);

si vous avez une solution je prend :) la je suis bloquer et dans la M**

27 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Je comprends pas bien... c'est quoi le code de ta page pour que ce script s'exécute.. ?
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

[php]
<?php
function RemoveXSS(&$val) {
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
   // this prevents some character re-spacing such as <java\0script>
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
   $val = preg_replace('/([\x00-\x08][\x0b-\x0c][\x0e-\x20])/', '', $val);
  
   // straight replacements, the user should never need these since they're normal characters
   // this prevents like
   $search = 'abcdefghijklmnopqrstuvwxyz';
   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
   $search .= '1234567890!@#$%^&*()';
   $search .= '~`";:?+/={}[]-_|\'\\';
   for ($i = 0; $i < strlen($search); $i++) {
      // ;? matches the ;, which is optional
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars
  
      // &#x0040 @ search for the hex values
      $val = preg_replace('/(&#[x|X]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
      // &#00064 @ 0{0,7} matches '0' zero to seven times
      $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
   }
  
   // now the only remaining whitespace attacks are \t, \n, and \r
   $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base','ScRiPt');
   $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
   $ra = array_merge($ra1, $ra2);
  
   $found = true; // keep replacing as long as the previous round replaced something
   while ($found == true) {
      $val_before = $val;
      for ($i = 0; $i < sizeof($ra); $i++) {
         $pattern = '/';
         for ($j = 0; $j < strlen($ra[$i]); $j++) {
            if ($j > 0) {
               $pattern .= '(';
               $pattern .= '(&#[x|X]0{0,8}([9][a][b]);?)?';
               $pattern .= '|(&#0{0,8}([9][10][13]);?)?';
               $pattern .= ')?';
            }
            $pattern .= $ra[$i][$j];
         }
         $pattern .= '/i';
         $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
         if ($val_before == $val) {
            // no replacements were made, so exit the loop
            $found = false;
         }
      }
   }
   return $val;
}?>
/php

et pour afficher la page
$pageOK array('site'> 'site.php',
                  'mymenu'=>'mymenu.php',
                  'mydog'=>'mydog.php',
                  'club_v'=>'club_dr.php',
                  'check'=>'wait.php',
                  'support_clientel' => './cgi-bin/ttx/ttx.cgi');

  // On teste que le parametre d'url existe et qu'il est bien autorise
  // -----------------------------------------------------------------
 
$page = htmlspecialchars($page);
$page=str_replace("%3E","",$page);
htmlentities($host, ENT_QUOTES, 'UTF-8');
//
RemoveXSS($_POST);
RemoveXSS($_GET);
RemoveXSS($pageOK);

if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {
    //
   
    //
    if(!eregi("http://",'$pageOK')){ //si la page contient http
    RemoveXSS($_GET['page']);
      include($pageOK[$_GET['page']]);
    }

}else{
RemoveXSS($_GET['page']);
      include("chien1.php"); //si erreur retour a cette page
}
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

enfin voila tout mon site est sensible a la dite faille si vous avez une solution quelconque je suis preneur tout ce qui se situe apres le ? est sensible a la faille

?<ScRiPt%20%0a%0d>alert(2050041070)%3B</ScRiPt>.
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Re,

J'aimerais reproduire ta soit-disant "attaque" chez moi, mais je n'y arrive pas...
T'es sûr que c'est pas plutôt ton serveur qui est mal configuré ?

Tu peux me donner un script php et me dire comment l'appeler dans l'url pour reproduire cette "attaque" ?
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

oui mais bon ca ne m aide pas plus
j ai decouvert cette faille surement connue qui ne fonctionne que si script est ecrit comme ca ScRiPt

un example parmis plein d autres

http://www.supanight.com/page/accueil.php/%3E%22%3E%3C?phpinfo();?%3E

mais je n ai spas de soluce a ce jour si tu peut m aider
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Non mais d'accord, mais ton truc, ça exécute pas du PHP de toute façon. C'est comme si je bloquais les CSS, ça changerait bien l'affichage de la page, quoi.
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

non mais ca peut executer du code a toi de changer tu peut faire un alert donc injecter du java script la question est coment empecher ca !!!
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
=> URL Rewriting
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

oe mais ca regle pas le probleme de securite on doit pouvoir le faire sans url rewirting perso j essaie de trouver la soluce mais bon je retourne mes variables dans tous les sens je ne trouve pas
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Je vois pas où est le problème en fait.
Je te dis que j'arrive pas à reproduire ton "attaque" et toi tu me dis que ça règle pas ton problème... On peut pas avancer...
Prouve moi qu'il s'agit réellement d'une attaque...

Je n'ai pas réussi à exécuter de Javascript avec ton "truc".
Tout ce qu'on peut faire, c'est bloquer le chargement de la feuille CSS et d'images si elles sont appelées avec des URL relatives (puisque tu rajoutes un / dans l'url, pour le navigateur, le chemin n'est plus bon, d'où erreur de recherche des fichiers en question). La belle affaire.

Donne moi :
- un script PHP que tu utilises et qui est sensible à cette "faille" dont tu parles
- l'url que je dois utiliser pour "attaquer" ce script

Evidemment, si ton attaque n'exécute pas de PHP, cest pas une attaque. Si la seule personne pour qui un site est "défacé" est le "pirate", alors il me suffit de bloquer les CSS avec AdBlock+, ou de ne pas exécuter Javascript, ou autre...

J'ai vraiment du mal à comprendre en quoi ton machin est une faille...
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
21
Hello,

urldecode () puis strip_tags () sur ton bin's.
Ceci dit : on TESTE ce qui vient du client avant de s'en servir.
T'attends page=login, page=vente...etc, pas truc=bidule. Si t'as truc, ou bidule...ou plutôt, si t'as pas page ET login, ou page ET vente, etc...tu ne fais RIEN.
C'est la base de la sécurisation d'un code : on utilise que ce que l'on s'attend à utiliser, rien d'autre.
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
Salut,

Je n'ai pas tout compris, comme neigedhiver, et que je pas lu ton script (mal aux yeux avec les lignes de codes toutes noires...).

Mais si tu veux vraiment blinder tes scripts, la meilleur methode est celle dite de "la liste banche".

Explication :
Apparement la faille passe dans le paramêtre "lang" de ton script...
Des "lang" imaginables, il n'y en a pas 15 000 ! En gros, et selon ton site : fr, en, it, de, es, pl, cz, ...
Bref, tu listes toutes les possibilités : $langs = array('fr', 'en', 'it', 'de', 'es', 'pl', 'cz');
Et tu vérifies que le paramêtre "lang" en fait parti :

$lang = $langs[ (int) array_search($_GET['lang'], $langs) ];

Et voilà ! si le param n'est pas trouvé dans la liste, il sera par défaut le premier de ta liste [ (int)FALSE ===0 ].

Bien sûr, on ne peut pas toujours faire la liste complète des possibilités... Le peux-tu ?

A+
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

une soluce les gars ???
bon alors pour l interpretation des pages je vais essayer d etre explicite

la ou est le page ok c est dans l index et dans un div
perso j ai essayer pas mal de truc je sais que c es depuis l integration de l ajax
mais bon comment enlever cette faille ???

dans index.php
+----------------------------------------------------------------------+
| include top pour le head +
|///////////////////////////////////////////////////////////////////////
| | | |
| left | $pageOK array('site'> 'site.php',
'members' => 'members.php',
'admin' => 'admin.php',
'view_site' => "$builsite" ,
'ticketadm' => 'reponseadm.php',
'admin_cadeau'=>'admin_parrain_categories.php',
'admin_cadeau_add'=>'admin_cadeau_add.php',
'admin_race_add'=>'admin_race_add.php',
'admin_dog_categories'=>'admin_dog_categories.php',
'alldog_display'=>'alldog_cat.php',
'my_shell'=>'my_shell.php',
'v_vente_de_chien'=>'view_vente_chien.php',
'support_clientel' =>'./cgi-bin/ttx/ttx.cgi');

// On teste que le parametre d'url existe et qu'il est bien autorise
// -----------------------------------------------------------------

if ( (isset($_GET['page'])) && (isset($pageOK[$_GET['page']])) ) {

if(!eregi("http://",'$pageOK')){ //si la page contient http
include($pageOK[$_GET['page']]);
}
}else
{
include("chien1.php"); //si erreur retour a cette page
} | |
| | | |
| | | |
| | | |
+------------------------------------------------------------------------
+
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

au fait dans le forum comment syntasiser le code ?? c est [code] [php] ???
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
Pour la syntaxe, tu utilise la fonction 'highlight_file' de PHP via une de tes pages de test et tu copie/colle :

<?php
 $pageOK = array('site' => 'site.php',
                  'members' => 'members.php',
  'admin' => 'admin.php',
  'view_site' => "$builsite" ,
  'ticketadm' => 'reponseadm.php',
'admin_cadeau'=>'admin_parrain_categories.php',
  'admin_cadeau_add'=>'admin_cadeau_add.php',
  'admin_race_add'=>'admin_race_add.php',
'admin_dog_categories'=>'admin_dog_categories.php',
  'alldog_display'=>'alldog_cat.php',
  'my_shell'=>'my_shell.php',
  'v_vente_de_chien'=>'view_vente_chien.php',
  'support_clientel' =>'./cgi-bin/ttx/ttx.cgi');

  // On teste que le parametre d'url existe et qu'il est bien autorise
  // -----------------------------------------------------------------

if ( (isset($_GET['page'])) &amp;&amp; (isset($pageOK[$_GET['page']])) ) {

    if(!eregi("http://",'$pageOK')){ //si la page contient http
      include($pageOK[$_GET['page']]);
}
}else
{
      include("chien1.php"); //si erreur retour a cette page
}
?>

Concernant ta faille, tu ne nous as toujours pas donné le code fautif... Je t'aide, c'est par là :
<TD background="images/right_top.png" WIDTH=571 HEIGHT=181 ALT="">
<div class="Style9" style="padding-top:140px;padding-left:0px"><a href='index.php?&lang=>\'><ScRiPt

>alert(1736183224);</ScRiPt>'>.:ACCEUIL:.<a/> __ <a href="journal.php">.:JOURNAL:.<a/>
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
ET ben la colorisation syntaxique n'a pas marchée....
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

ben justement je le cherche ce code fautif je ne le trouve pas ...
ca fais la 3 jours que je cherche et impossible de mettre la main desus

en effet la coloration marche pas
donc d apres ce que tu me dit la faille vient du script pour la lang ?
je le mets ici
[php]
<?php

 if ($_GET['lang']=='fr') { // si la langue est 'fr' (français) on inclut le fichier fr-lang.php
  	 include('lang/fr-lang.php');
 $lang='fr';
 $flag="";
   	 } 
   	 
 else if ($_GET['lang']=='en') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
 include('lang/en-lang.php');
 $lang='en';
 $flag="";
} 
else if ($_GET['lang']=='nl') { // si la langue est 'en' (anglais) on inclut le fichier en-lang.php
 include('lang/nl-lang.php');
 $lang='nl';
 $flag="";
}
  	 
   	 else {// si aucune langue n'est déclarée on inclut le fichier fr-lang.php par défaut
   	 include('lang/fr-lang.php');
 $lang='fr';
 $flag="";
 	 }
 ?>
/php
Messages postés
172
Date d'inscription
samedi 11 août 2012
Statut
Membre
Dernière intervention
9 avril 2011

ok j ai essayer ca dal le script decid-lang.php
$carset = array("<", ")", "'");
$lang = str_replace($carset, "", $pageOK);
$_GET['lang']= str_replace($carset, "", $lang);

si vous voyez autre choses ?
Messages postés
1406
Date d'inscription
mercredi 17 août 2005
Statut
Membre
Dernière intervention
28 août 2007
7
Salut,

Toujours pas le bon endroit...

Recherche le terme "images/right_top.png" dans tout tes scripts... L'inclusion fautive est juste aprés.