Cybersecurity
  • Mon Blog
    • 🏠Home
    • 📦Archives
      • 2024
      • 2023
      • 2022
    • 📂Catégories
    • 📧A propos de moi
  • Mes projets
    • Livres / publications
      • Sécurité des applications web - Stratégies offensives et défensives
    • MyExpense
    • XSS Exploitation Tool
  • Mes Articles
    • 2025
      • Mars
        • Comment les requêtes préparées (prepared statement) protègent-elles contre les injections SQL ?
      • Janvier
        • XSS Exploitation Tool v0.7.0
    • 2024
      • Décembre
        • XSS Exploitation Tool v0.6.0
      • Septembre
        • MyExpense v1.4
      • Aout
        • XSS Exploitation Tool v0.5.0
        • Exploitation des injections SQL au sein de la clause ORDER BY
      • Juin
        • Parution de mon livre, Sécurité des applications web - Stratégies offensives et défensives
      • Mai
        • Dompurify 3.0.10 bypass - Confusion nodeName and CDATA
        • Dompurify 3.0.9 bypass - Node type confusion
      • Avril
        • Bypass de validation d'URL et embedded credentials côté front
      • Mars
        • MyExpense v1.3
    • 2023
      • Mai
        • MyExpense v1.2
      • Mars
        • MyExpense v1.1
        • Fonctionnement de l'entête X-Content-Type-Options - Contournement de CSP
      • Février
        • Fonctionnement de l'entête HTTP Strict Transport Security Header (HSTS)
    • 2022
      • Décembre
        • Les injections CSS - Règle @import
        • Les injections CSS - Scroll-to-Text Fragment
      • Novembre
        • Les injections CSS - Attribute Selector
        • Les injections CSS - Règle @font-face et descripteur unicode
      • Octobre
        • XSS Exploitation Tool v0.4.0
      • Septembre
        • Cross-Site Scripting (XSS) et schéma d'URI javascript
      • Juillet
        • SAST - PHP CodeSniffer orienté sécurité dans Visual Studio (sous Windows)
        • SAST - PHP CodeSniffer orienté sécurité dans Visual Studio (sous Debian)
        • Est-il possible de contourner la fonction PHP htmlspecialchars() ?
  • Common Vulnerabilities and Exposures (CVE)
    • 2024
      • CVE-2024-29415
    • 2023
      • CVE-2023-42282
    • 2022
      • CVE-2022-33910
      • CVE-2022-32444
      • CVE-2022-32442
    • 2020
      • CVE-2020-26311
  • Livres
    • 2023
      • Attacking and Exploiting Modern Web Applications
      • DevSecOps - Développez et administrez vos services en toute sécurité
    • 2022
      • Hacking APIs - Breaking Web Application Programming Interfaces
    • 2018
      • Practical Web Penetration Testing
      • Web Hacking 101: How to Make Money Hacking Ethically
  • Walkthroughs
    • Capture The Flag
      • Hack.lu CTF 2019
        • Nucular Power Plant
      • TAMUctf 2019
        • 1337 Secur1ty
        • Bird Box Challenge
        • Science!
    • Deliberately Vulnerable
      • CORS vulnerable Lab
        • Application Trust Arbritrary Origin
        • Application has bad "regex" Implementation to check Trusted Origin
        • Application Trust "null" Origin
      • Damn Vulnerable Web Application (DVWA)
        • Brute Force
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Command Injection
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • CSRF
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • File Inclusion
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • File Upload
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Insecure CAPTCHA
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • SQL Injection
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • SQL Injection (Blind)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Weak Session IDs
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (DOM)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (Reflected)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • XSS (Stored)
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • CSP Bypass
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
        • Javascript
          • Niveau "Low"
          • Niveau "Medium"
          • Niveau "High"
      • Unescape() room
        • Level 1 (practice)
        • Level 2 (practice)
        • Level 3 (practice)
        • Level 4 (practice)
        • Level 5 (practice)
        • Level 6 (practice)
        • Level 7 (practice)
        • Level 8 (practice)
        • Level 9 (practice)
        • Level 10 (practice)
      • VulnHub
        • GoatseLinux: 1
        • Hackademic: RTB1
        • Hackademic: RTB2
        • Holynix: v1
        • Holynix: v2
        • Kioptrix: Level 1 (#1)
        • Kioptrix: Level 1.1 (#2)
        • Kioptrix: Level 1.2 (#3)
        • Kioptrix: Level 1.3 (#4)
        • LAMPSecurity: CTF4
        • LAMPSecurity: CTF5
        • LAMPSecurity: CTF6
        • Metasploitable: 1
        • pWnOS 1.0
        • pWnOS 2.0 (Pre-Release)
      • XSS Vulnerability Challenges
        • xss1
        • xss2
        • xss3
        • xss4
        • xss5
        • xxs6
        • xss7
        • xss8
Propulsé par GitBook
Sur cette page
  • Challenge #1
  • Description
  • Résolution
  • Challenge #2
  • Description
  • Résolution
  • Challenge #3
  • Description
  • Résolution
  • Challenge #4
  • Description
  • Résolution
  • Challenge #5
  • Description
  • Résolution
  • Challenge #6
  • Description
  • Résolution
  • Challenge #7
  • Description
  • Résolution
  1. Walkthroughs
  2. Deliberately Vulnerable
  3. Unescape() room

Level 6 (practice)

PrécédentLevel 5 (practice)SuivantLevel 7 (practice)

Dernière mise à jour il y a 2 ans

Challenge #1

Description

Appeler la fonction politeSuperHero() avec la chaîne de caractères "v1hiyw5" en argument :

Résolution

Un filtrage est effectué sur les caractères "e" et "u". Cela va empêcher l'utilisation de l'encodage unicode. Un filtre est aussi présent sur le caractère " " (espace) :

Difficile de pouvoir appeler la fonction politeSuperHero() sans pouvoir utiliser l'encodage unicode. Je tente de contourner cela en passant par un label <svg> et en ajoutant un "/" pour contourner le filtrage du caractère " " (espace) . L'utilisation des HTML entities permet de gérer le cas du "u" et du "e" :

Challenge #2

Description

Appeler la fonction prettyHuman() avec la chaîne de caractères "xdheb3s" en argument mais cette fois sur l'attribut src dans une balise <img /> :

Résolution

Je tente d'utiliser l'attribut onerror de la balise image afin d'exécuter la fonction javascript mais un mécanisme semble filtrer les occurrences "on" ainsi que le caractère "d" :

Je réussis à contourner le filtre sur l'occurrence "on" en le répétant une seconde fois. Le caractère "d" présent dans la chaîne de caractères passée en paramètre peut, par exemple, être représenté par son équivalent en base64 :

Challenge #3

Description

Appeler la fonction politeFunction() avec la chaîne de caractères "237chw3" en argument mais cette fois sur l'attribut href dans une balise <a> :

Résolution

Etant donné que l'injection est présente au sein d'un attribut href j'utilise la syntaxe javascript:code. Le filtre en place supprime le caractère "t" ainsi que le caractère spécial "'" (simple quote) :

Il est possible de contourner le premier filtre en utilisant la majuscule, soit "T". Pour les occurrences du caractère "t" présents dans le nom de la fonction il est possible d'utiliser l'encodage unicode, puis les HTML entities pour les deux "'" (simple quote) entourant la chaîne de caractère en argument :

Challenge #4

Description

Appeler la fonction tallSuperHero() avec la chaîne de caractères "rj7tfb1" en argument mais cette fois sur la valeur de la propriété background-color du sélecteur banner :

Résolution

L'objectif est ici de sortir de la balise <style></style> et d'injecter du javascript. Le mot clé "script" semble être filtré ici. De même pour le caractère "f" nécessaire dans la chaîne de caractères devant être passée en argument :

Je parviens à contourner le filtre sur la chaîne "script" en mélangeant les majuscule et les minuscules. Pour le caractère "f", j'utilise l'encodage base64 car le caractère "0" est en fait également filtré, ce qui empêche l'utilisation de l'encodage unicode :

Challenge #5

Description

Appeler la fonction kindHuman() avec la chaîne de caractères "lxu2w3b" en argument mais cette fois sur l'attribut value du tag <input/> :

Résolution

Celui-ci est relativement facile. J'utilise l'attribut onmouseover et tente de déclencher la payload via la vue DOM. Le seul caractère filtré est le "H" présent dans le nom de la fonction :

L'encodage unicode suffit à contourner cette limitation :

Challenge #6

Description

Appeler la fonction niceSuperHero() avec la chaîne de caractères "7451rf5p" en argument au sein de la valeur d'une variable Javascript :

Résolution

Une première tentative m'indique un filtrage sur les caractères """ (double quotes), ")" et "5":

Pour réussir ce challenge, j'ai mis fin à la balise <script> et démarrer une nouvelle balise <svg> me permettant d'utiliser les HTML entities pour le caractère ")". Pas de réelle difficulté sur le contournement du filtre du caractère """ (double quotes), il me suffit simplement d'utiliser la version simple "'" (simple quote) :

Challenge #7

Description

Appeler la fonction tallSuperHero() avec la chaîne de caractères "gt31knj" en argument mais cette fois en valeur d'une donnée JSON stockée dans la variable window.appData :

Résolution

Il me faut ici sortir de la payload JSON. Le plus simple est sans doute de fermer correctement le JSON puis la balise <script> et d'ouvrir de nouvelles balises. Cela fonctionne quasiment du premier coup puisque seul le caractère "g" présent dans la chaîne passée en argument est filtré :

Après un nouvel essai, il n'est pas possible d'utiliser l'encodage unicode car le caractère "0" est aussi filtré. L'encodage base64 vient à ma rescousse, mais en fait non ... Les simples quotes "'" sont également filtrées. Je décide alors de tenter ma change avec la fonction String.toLowerCase et d'utiliser le "G" au lieu du "g" :