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
• 4 min read
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));
}
- Odczytaj zawartość pliku
db.json
i przekształć ją na tablicę PHP. - Sprawdź, czy użytkownik wysyła zapytanie metodą POST - oznacza to, że wysyła formularz.
- Jeśli tak
- Dodaj komentarz przesłany przez użytkownika do tablicy.
- Nadpisz plik
db.json
, kodując tablicę z nowym komentarzem w formacie JSON.
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:
- kradzież ciasteczek (sesyjnych) - przejęcie kontroli nad (zalogowaną) sesją ofiary
- dynamiczna zmiana treści strony internetowej
- włączenie key loggera w przeglądarce
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.
Instalacja odnawialnego certyfikatu TLS (certbot + apache na Ubuntu)
Jest wiele metod uzyskiwania certyfikatu pozwalającego szyfrować ruch http. Jedną z nich jest instalacja certbota i użycie go w zestawieniu z serwerem apache.
Daniel Gustaw
• 2 min read
Logowanie danych w MySql, Ajax i Behat
Napiszemy prostą aplikację webową - kalkulator. Na jego przykładzie pokażemy jak skonfigurować selenium z behatem i wykonać na nim testy automatyczne.
Daniel Gustaw
• 15 min read
Bot Telegramowy w Typescript
Dowiedz się jak stworzyć bota na telegramie, dodać w nim nasłuch na komendy oraz skonfigurować wysyłanie powiadomień.
Daniel Gustaw
• 3 min read