[FAILLE] XSS – CakePhp Coment Module

Lors d’un de nos projets de cours nous avions à créer un blog en utilisant le framework Cake Php.
Lors de la manipulation j’ai pu mettre en évidence une faille XSS dans le plugin coment de Graphikart, utilisé comme son nom l’indique pour proposer un module de commentaire.

Mise en évidence de la faille :

Pour mettre en évidence une XSS rien de plus simple, il suffit de tester les champs:
On recharge ensuite la page est si on obtient bien le résultat attendu c’est gagné :

 

Voila on a donc bien une XSS dans ce plugin.

Correction :

Trouver une faille c’est bien, savoir la patcher c’est encore mieux. Pour cela, il faut aller fouiller un peu dans le code de cakePhp et plus particulièrement du plugin en question.
La faille se trouve au niveau du Contrôleur du plugin commentaire.
Dans la fonction d’ajout on retrouve certains traitements comme :
// We add new datas
$this->request->data['Comment']['ip'] = $this->getIp();
$this->request->data['Comment']['user_id'] = $user_id ? $user_id : 0;
$this->request->data['Comment']['username'] = $user_pseudo;
$this->request->data['Comment']['mail'] = $user_mail;

Comme on peux le voir c’est ici que les variables qui composeront requête sql sont traités.
Cependant il n’y a aucun traitement sur le contenu des informations envoyés. Aisni il peut largement y avoir des injections de code javascript.

Il suffit donc d’ajouter un traitement des donnés envoyées par l’utilisateur :

//Clean the input
$this-&gt;request-&gt;data['Comment']['content'] = xss_clean($this-&gt;request-&gt;data['Comment']['content']);</pre>
&nbsp;
<pre>function xss_clean($data)
{
// Fix &entity\n;
$data = str_replace(array('&','<','>'), array('&amp;','&lt;','&gt;'), $data);
$data = preg_replace('/(&#*\w+)[\x00-\x20]+;/u', '$1;', $data);
$data = preg_replace('/(&#x*[0-9A-F]+);*/iu', '$1;', $data);
$data = html_entity_decode($data, ENT_COMPAT, 'UTF-8');
// Remove any attribute starting with "on" or xmlns
$data = preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu', '$1>', $data);
// Remove javascript: and vbscript: protocols
$data = preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2nojavascript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu', '$1=$2novbscript...', $data);
$data = preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u', '$1=$2nomozbinding...', $data);
// Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i', '$1>', $data);
$data = preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu', '$1>', $data);
// Remove namespaced elements (we do not need them)
$data = preg_replace('#</*\w+:\w[^>]*+>#i', '', $data);
do
{
// Remove really unwanted tags
$old_data = $data;
$data = preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i', '', $data);
}
while ($old_data !== $data);
// we are done...
return $data;
}

Si vous avez un site sous CakePhp et que vous voulez ajouter un plugin de commentaires faites attention à celui ci!

4 commentaires on "[FAILLE] XSS – CakePhp Coment Module"

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *