Voici quelques solutions (liste non exhaustive) pour la catégorie “Reflected XSS” de Damn Vulnerable Web App, DVWA

Si vous n’avez pas encore installé DVWA, consultez: Installer DVWA

0x00 - XSS réfléchi

Une vulnérabilité Reflected XSS apparaît lorsque des données fournies par un client web sont utilisées telles quelles par les scripts du serveur pour produire une page de résultats. Ces données non vérifiées peuvent être utilisées pour injecter du code dans la page dynamique reçue par le navigateur client. [1][2]

0x01 - Security level: Low

Code source:

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

Il n’y a aucune mesure de sécurité.

Payload:

<script>alert('xss');</script>

Red Team: 1 - Blue Team: 0

0x02 - Security level: medium

Code source:

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = str_replace( '<script>', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 

Mesure de sécurité mise en place: effacer la balise script

$name = str_replace( '<script>', '', $_GET[ 'name' ] );

Solution: utiliser un autre type de balise que script ou modifier son format

Payload:

#1
<sc<script>ript>alert('xss');</script>
#2
<sCriPt>alert('xss');</sCriPt>

Red Team: 1 - Blue Team: 0

0x03 - Security level: High

Code source:

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Get input
    $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

?> 

Mesure de sécurité mise en oeuvre: effacer tout contenu ou le mot script apparait

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

Solution: utiliser une autre forme de balise

Payload:

#1
<button onmouseover="alert('xss');">xss</button>
#2
<button onclick="alert('xss');">xss</button>

Red Team: 1 - Blue Team: 0

0x04 - Security level: impossible

Code source:

<?php

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $name = htmlspecialchars( $_GET[ 'name' ] );

    // Feedback for end user
    echo "<pre>Hello ${name}</pre>";
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

Mesure de sécurité mise en oeuvre: utilisation de htmlspecialchars

$name = htmlspecialchars( $_GET[ 'name' ] );

A priori, pas de solution possible. Le site est sécurisé.

Red Team: 0 - Blue Team: 1

Continuez à tester vos connaissances des failles XSS avec: XSS Game - Solutions

Références:

[1] Cross-site scripting, https://fr.wikipedia.org/wiki/Cross-site_scripting#XSS_r%C3%A9fl%C3%A9chi_(ou_non_permanent)

[2] OWASP, Cross-site Scripting (XSS), https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)

[3] OWASP, XSS Filter Evasion Cheat Sheet, https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet

CC-BY

This work is licensed under a Creative Commons Attribution 4.0 International License.