OWASP WebGoat:LAB Cross Site Scripting
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
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
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" => "bread" & * "butter" . * 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
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; }