Level 2/3: Danger Script

Reflected XSS

Opdracht:

  1. Download de gewijzigde guestbook applicatie.
  2. Type een valide stukje JavaScript in het tekstveld Probeer dit bijvoorbeeld met een simpele
  3. Als de vorige stap is gelukt, schrijf dan een script in de input waarmee de achtergrond kleur van de pagina naar rood te veranderd wordt.
  4. Maak screenshot met je script code er in.
  5. Maak een screenshot dat de achtergrond daarna echt rood wordt.

Uitwerking:

Persistent XSS

Opdracht:

  1. Pak je code van de laatste exercise van Level 1 er weer bij.
  2. Schrijf weer een script dat de achtergrondkleur verandert en submit dit.
  3. Open een nieuw tabblad in je browser en zie dat de script code daar ook aanwezig is. Probeer dit ook met een andere browser op je computer. Je ontkomt niet aan je ‘kwaadwillende’ script.
  4. Bewaar hier een screenshot van om in te leveren.
  5. Pas je code aan zodat het script niet meer uitgevoerd wordt maar gewoon getoond wordt aan de gebruiker.
  6. Controleer dat je scriptcode van eerder niet meer werkt.

Uitwerking:


<body>
    <div class="body-container">
        <h1 class="heading">Gastenboek 'De lekkage'</h1>
        <form action="guestbook.php" method="post">
            Email: <input type="email" name="email"><br />
            Bericht: <textarea name="text" minlength="4"></textarea><br />
            <?php if (userIsAdmin($conn)) {
                echo '<input type="color" value="red" name="color">';
            } ?>
            <input type="hidden" name="token" value="<?php echo $token; ?>">
            <input type="submit">
        </form>
        <hr />
        <?php
        if ($_SERVER['REQUEST_METHOD'] === 'POST') {
            $email = htmlspecialchars($_POST['email']);

            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                $text = htmlspecialchars($_POST['text']);
                $admin = 0;
                $color = 'red';
                if (userIsAdmin($conn)) {
                    $admin = 1;
                    $color = $_POST['color'] ?? 'red';
                }
                $conn->query(
                    "INSERT INTO `entries`(`email`, `color`, `admin`, `text`) 
                                        VALUES ('$email', '$color', '$admin', '$text');"
                );
            } else {
                echo "geen valide email";
            }
        }

        $result = $conn->query("SELECT `email`, `text`, `color`, `admin` FROM `entries`");
        foreach ($result as $row) {
            print "<div style=\"color: " . $row['color'] . "\">Email: " . $row['email'];
            if ($row['admin']) {
                print '&#9812;';
            }
            print ": " . $row['text'] . "</div><br/>";
        }

        function userIsAdmin($conn)
        {
            if (isset($_COOKIE['admin'])) {
                $adminCookie = $_COOKIE['admin'];

                $result = $conn->query("SELECT cookie FROM `admin_cookies`");

                foreach ($result as $row) {
                    if ($adminCookie === $row['cookie']) {
                        return true;
                    }
                }
            }

            return false;
        }

        ?>
        <hr />
        <div class="disclosure-notice">
            <p>
                Hierbij krijgt iedereen expliciete toestemming om dit Gastenboek zelf te gebruiken voor welke doeleinden dan
                ook
            </p>
            <p>
                Onthoud dat je voor andere websites altijd je aan de principes van
                <a href="https://en.wikipedia.org/wiki/Responsible_disclosure" target="_blank" style="color: lightgray;">
                    Responsible Disclosure
                </a> wilt houden.
            </p>
        </div>
    </div>
</body>

CSRF

Opdracht: 1. Voeg het fake-form.html toe aan de map van je guestbook.php 2. Vul het formulier in en kijk wat er gebeurt 3. Pas guestbook.php aan zodat fake-form.html geen berichten meer kan posten via guestbook.php gebruik hiervoor de token die al in het formulier zit en wat we van de gebruiker bewaren in de session 4. Valideer dat het fake-form niet meer in staat is om nog meer in het guestbook te zetten.

Uitwerking:

<html> 
<head> 
<body>