WIKI

Notes

View on GitHub

Type of XSS :


Types of Cross-Site Scripting :

XSS Server Client
Stored Stored Server XSS Stored Client XSS
Reflected Reflected Server XSS Reflected Client XSS

Examples :

Reflected client XSS :

<!DOCTYPE html>
<html>
<body>
    <h2>Recherche (Reflected Client XSS)</h2>
    <div id="result"></div>

    <script>
        // Obtenir la requête de recherche depuis l'URL et l'afficher
        var searchTerm = new URLSearchParams(window.location.search).get('search');
        if (searchTerm) {
            document.getElementById('result').innerHTML = 'Résultats pour : ' + searchTerm;
        }
    </script>
</body>
</html>

Reflected server XSS :

<?php
// reflected_xss.php
?>
<!DOCTYPE html>
<html>
<body>
    <h2>Recherche (Reflected Server XSS)</h2>
    <form method="get" action="">
        <input type="text" name="search" placeholder="Recherche...">
        <input type="submit" value="Rechercher">
    </form>

    <?php
    if (isset($_GET['search'])) {
        echo "Résultats de recherche pour: " . $_GET['search'];
    }
    ?>
</body>
</html>

Stored client XSS :

<!DOCTYPE html>
<html>
<body>
    <h2>Notes personnelles (Stored Client XSS)</h2>
    <input type="text" id="noteInput" placeholder="Écrivez votre note ici">
    <button onclick="saveNote()">Sauvegarder</button>
    <div id="notes"></div>

    <script>
        // Fonction pour sauvegarder une note dans localStorage
        function saveNote() {
            var note = document.getElementById('noteInput').value;
            localStorage.setItem('note', note);
            showNotes();
        }
        // Fonction pour afficher les notes
        function showNotes() {
            var note = localStorage.getItem('note');
            if (note) {
                document.getElementById('notes').innerHTML = note;
            }
        }
        // Afficher les notes au chargement de la page
        showNotes();
    </script>
</body>
</html>

Stored server XSS :

<?php
// stored_xss.php
session_start();

$messageFile = 'messages.txt';

// Ajouter un message au fichier
if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['message'])) {
    file_put_contents($messageFile, $_POST['message'] . "\n", FILE_APPEND);
}

// Lire les messages existants
$messages = file_exists($messageFile) ? file($messageFile, FILE_IGNORE_NEW_LINES) : [];
?>
<!DOCTYPE html>
<html>
<body>
    <h2>Livre d'or</h2>
    <form method="post" action="">
        <textarea name="message"></textarea>
        <input type="submit" value="Envoyer">
    </form>

    <h3>Messages:</h3>
    <div>
        <?php foreach ($messages as $message): ?>
            <p><?php echo $message; ?></p>
        <?php endforeach; ?>
    </div>
</body>
</html>

Defenses :

Server XSS is caused by including untrusted data in an HTML response. The easiest and strongest defense against server XSS :

Client XSS is caused when untrusted data is used to update the DOM with an unsafe JS call.

How to mitigate XSS :