OWASP WebGoat:LAB Cross Site Scripting

From aldeid
Jump to navigation Jump to search

LAB Cross Site Scripting

Stage 1: Stored XSS

L'objectif de cette première étape est de vous montrer comment la saisie de code dans un champ et son enregistrement en base peuvent impacter les autres utilisateurs de l'application.

Pour ce faire, s'authentifier sous le profil de Tom Cat (mot de passe "tom"), sélectionner son profil puis cliquer sur "View Profile". Pour accéder au formulaire de modification du profil, ciquez sur "Edit Profile". Visiblement, le champ "Street" n'est pas protégé. Reportez-y le code suivant :

<script>alert('You\'ve been hacked by Tom');</script>

Cliquez ensuite sur "Update Profile". La fiche repassant en lecture, le champ "Street" est interprété par le navigateur et vous affiche le message souhaité. Cliquez sur "Logout" puis connectez-vous sous le profil de Jerry Mouse (mot de passe "jerry"). Sélectionnez le profil de Tom Cat (employee), puis cliquez sur "ViewProfile".

Voici ce que vous obtenez alors :

Stage 2: Block Stored XSS using Input Validation

Note
La manipulation qui suit ne peut être effectuée qu'avec la version Developer de WebGoat

Il est demandé à cette étape de mettre en place un patch de sécurité afin de combler la lacune vue à l'étape 1. Pour ce faire, éditez le fichier CrossSiteScripting comme suit :

# cd ~/WebGoat-5.2/tomcat/webapps/WebGoat/JavaSource/org/owasp/webgoat/lessons/CrossSiteScripting/
# vim UpdateProfile.java

Puis reportez la modification suivante :

String regex = "[\\s\\w-,]*";
String stringToValidate = firstName+lastName+ssn+title+phone+address1+address2+
startDate+ccn+disciplinaryActionDate+
disciplinaryActionNotes+personalDescription;
Pattern pattern = Pattern.compile(regex);
validate(stringToValidate, pattern);

Cela a pour but de ne permettre que :

  • \s = les espaces (\t\n\x0B\f\r)
  • \w = les lettres de "a" à "z" et "A" à "Z" ainsi que les chiffres de "0" à "9"
  • Les caractères "-" et ","

Tout autre caractère génère une exception.

Stage 3: Stored XSS Revisited

A cette étape, il est demandé de constater que le profil de "Bruce Mc Guirre" est "pré-chargé" avec une attaque de type XSS. Pour s'en rendre compte, connectez-vous sous le profil de "David Giambi" (mot de passe "david"), sélectionnez le profil de "Bruce McGuirre", puis cliquez sur "View Profile".

Comme nous pouvons le constater, le formulaire a été corrompu par le pré-chargement d'un javascript (javascript:alert(document.cookie)) qui affiche le cookie de session JSESSIONID.

Stage 4: Block Stored XSS using Output Encoding

Note
Pour réaliser cette étape, vous devez posséder la version Developer de WebGoat.

L'objectif est ici de patcher la faille étudiée au stage 3. Il est nécessaire d'utiliser une méthode qui encodera tous les caractères spéciaux. Cette méthode, appelée encode(String s1) est présente dans le fichier ~/WebGoat-5.2/tomcat/webapps/WebGoat/JavaSource/org/owasp/webgoat/util/HtmlEncoder.java dont voici l'extrait :

/**
 * Turns funky characters into HTML entity equivalents
 * 
 * e.g. "bread" & "butter" => &quot;bread&quot; &amp;
 *  &quot;butter&quot; .
 * Update: supports nearly all HTML entities, including funky accents. See the source code for
 * more detail. Adapted from http://www.purpletech.com/code/src/com/purpletech/util/Utils.java.
 * 
 * @param s1
 *            Description of the Parameter
 * @return Description of the Return Value
 */
 public static String encode(String s1)
 {
   StringBuffer buf = new StringBuffer();
   
   int i;
   for (i = 0; i < s1.length(); ++i)
   {
     char ch = s1.charAt(i);
     
     String entity = i2e.get(new Integer((int) ch));
     
     if (entity == null)
     {
       if (((int) ch) > 128)
       {
         buf.append("&#" + ((int) ch) + ";");
       }
       else
       {
         buf.append(ch);
       }
     }
     else
     {
       buf.append("&" + entity + ";");
     }
   }
   return buf.toString();
 }

Il est donc nécessaire d'appeler cette méthode dans le fichier incriminé :

# cd ~WebGoat-5.2/tomcat/webapps/WebGoat/JavaSource/org/owasp/webgoat/lessons/CrossSiteScripting/
# vim ViewProfile.java

Dans la méthode getEmployeeProfile(WebSession s, int userId, int subjectUserId) :

Remplacer tous les 
  answer_results.getString(...)
par
  HtmlEncoder.encode(answer_results.getString(...))

Stage 5: Reflected XSS

L'objectif de cet exercice est d'exploiter une faille du champ de recherche d'un employé pour en démontrer sa vulnérabilité.

Pour ce faire, se connecter avec le profil Larry Stooge (mot de passe "larry"), cliquez sur le bouton "SearchStaff" pour accéder au formulaire de recherche, puis entrez la chaîne suivante :

<script>alert('vulnerable form');</script>

Validez la recherche en cliquant sur le bouton "FindProfile".

Stage 6: Block Reflected XSS

Note
Pour réaliser cette étape, vous ddevez posséder la version Developer de WebGoat.

Cette étape a pour objectif de patcher la faille précédemment étudiée. Pour ce faire,

# cd ~WebGoat-5.2/tomcat/webapps/WebGoat/JavaSource/org/owasp/webgoat/lessons/CrossSiteScripting/
# vim FindProfile.java

Puis modifiez le méthode getRequestParameter :

Remplacer :

  protected String getRequestParameter(WebSession s, String name) throws ParameterNotFoundException,
    ValidationException
  {
    return s.getParser().getRawParameter(name);
  }

Par :

  protected String getRequestParameter(WebSession s, String name) throws ParameterNotFoundException,
    ValidationException
  {
    String regex = "[\\s\\w-,]*";
    String parameter = s.getParser().getRawParameter(name);
    Pattern pattern = Pattern.compile(regex);
    validate(parameter, pattern);		
    return parameter;
  }