xss hacking attack

Atak XSS przy użyciu stylu skryptu i obrazu

Dowiedz się, jak zainfekować stronę za pomocą ataku XSS przy użyciu tagów skryptu, stylu lub obrazu. Możesz zobaczyć, jak zastąpić zawartość strony swoją własną, nawet bez javascriptu.

Daniel Gustaw

Daniel Gustaw

4 min read

Atak XSS przy użyciu stylu skryptu i obrazu

Artykuł ten opisuje przykłady ataków XSS. Użycie znaczników skryptu jest prawdopodobnie najbardziej znanym przypadkiem, ale istnieją również inne możliwości. Możesz zmienić zawartość strony internetowej samodzielnie, używając znacznika obrazu lub czystego CSS.

To materiał edukacyjny i powinieneś pamiętać, że hakowanie jest nielegalne, jeśli zostaniesz przyłapany na gorącym uczynku. :)

Kod strony

Aby zaprezentować atak, tworzymy prostą stronę internetową opartą na PHP. Bardzo lubię oddzielać logikę od widoku w kodzie, ale dla uproszczenia i zminimalizowania liczby linii kodu połączyliśmy je, a cały kod strony znajduje się w pliku index.php. Aby uzyskać podatną stronę, musi ona być w stanie zapisywać tekst od użytkownika do bazy danych i wyświetlać go na ekranie bez jego filtrowania.

Ponownie, w celu uproszczenia i jasności, rezygnujemy z najlepszych praktyk i używamy pliku json zamiast baz danych. Pierwszym plikiem naszego projektu jest db.json

db.json

["First comment","Second one"]

Aby zapisać komentarze wysyłane za pomocą skryptu PHP, wykonaj następujące czynności:

index.php

<?php
$comments = json_decode(file_get_contents('db.json'));

if($_SERVER["REQUEST_METHOD"] === "POST") {
    $comments[] = $_POST["comment"];
    file_put_contents('db.json', json_encode($comments));
}

Niezależnie od metody zapytania skrypt przechodzi dalej i wyświetla formularz oraz listę komentarzy.

index.php

echo '<form action="" method="post">
    <input type="text" name="comment">
    <input type="submit" value="send">
</form>
<ul>';

foreach ($comments as $comment) {
    echo "<li>".$comment."</li>";
}
echo '</ul>';

Utworzona strona internetowa wygląda następująco

Jest w pełni funkcjonalny, pozwala na dodawanie komentarzy, zapisywanie ich w formacie json i wyświetlanie listy komentarzy. Jeśli użytkownicy chcą dodać tekst, a nie włamać się, może to być koniec naszej przygody. Ale powinniśmy założyć, że przynajmniej jeden użytkownik strony internetowej chce się włamać. :)

Jak to włamać?

Ten przepływ danych - zapisywanie na serwerze i wyświetlanie po stronie klienta - umożliwia atak XSS, jeśli tekst nie jest odpowiednio filtrowany. XSS oznacza Cross-site scripting i umożliwia atakującym wstrzykiwanie skryptów po stronie klienta do stron internetowych przeglądanych przez innych użytkowników.

Dodany kod wykonywalny jest interpretowany przez przeglądarkę, a nie serwer, więc nie możemy na nim zdobyć serwera, ale możemy wymienić zachowanie klienta. Przykładowe korzyści dla atakujących to:

Skrypt może być przechowywany na serwerze lub zawarty w linku. W naszym przypadku chcemy zapisać skrypt do pliku json, wpisując komentarze. Interesuje nas zmiana treści strony internetowej na “Hacked by Daniel”. W każdym przypadku przedstawionej poniżej metody ataku strona będzie wyglądać następująco:

Skrypt

Najprostszym sposobem jest dołączenie skryptu, który dynamicznie po załadowaniu strony zmienia jego zawartość na wymaganą. Spróbuj dodać komentarz:

<script>document.querySelector('html').innerHTML="Hacked By Daniel"</script>

Ten kod wybiera html - oznacza to całą stronę i zmienia jej zawartość za pomocą właściwości innerHTML.

Styl

Inna metoda działa nawet jeśli znaczniki javascript są usuwane, a javascript jest wyłączony w przeglądarce.

<style>html::before {content: "Hacked By Daniel";} body {display: none;}</style>

Zdefiniowaliśmy dwie zasady dotyczące stylizacji strony internetowej. Pierwsza mówi przeglądarce, aby dodała tekst Hacked By Daniel przed treściami strony. Druga mówi, aby nie wyświetlać ciała.

Obraz

Oczywiście, jeżeli zablokujemy tag script i tag style w naszych komentarzach, to nie wystarczy, ponieważ możemy uruchomić skrypt również w innych tagach.

<img src=undefined onerror='document.querySelector("html").innerHTML="Hacked By Daniel"'>

To jest przykład obrazu, który ma nieprawidłowy adres. Jeśli adres jest nieprawidłowy, przeglądarka uruchamia skrypt będący wartością atrybutu onerror.

Jak się bronić?

Aby bronić się przed tym atakiem, musimy filtrować komentarze naszych użytkowników i usuwać tagi HTML. Możemy to zrobić, zmieniając kod w index.php w następujący sposób

-      $comments[] = $_POST["comment"];
+      $comments[] = htmlspecialchars($_POST["comment"]);

Po zastosowaniu tego poprawionego tekstu, tekst napisany w formularzu zostanie wyświetlony w listach komentarzy dosłownie jako równy tekst wpisany przez użytkownika i nie będzie interpretowany jako tag HTML.

Podsumowanie

Pokazaliśmy proste przykłady ataków XSS. Jeśli używasz frameworka takiego jak Symfony, to framework ma wbudowany mechanizm bezpieczeństwa w swojej strukturze, ale powinieneś pamiętać o funkcji htmlspecialchars, jeśli piszesz w czystym PHP.

Other articles

You can find interesting also.