PHP SELF i XSS

Znalazłem artykuł twierdzący, że $_SERVER['PHP_SELF'] jest podatny na XSS.

Nie jestem pewien, czy dobrze to zrozumiałem, ale jestem prawie pewien, że to jest złe.

Jak to może być podatne na ataki XSS!?

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>
 27
Author: Danny Beckett, 2011-05-21

4 answers

Aby był bezpieczny w użyciu, musisz użyć htmlspecialchars().

<?php echo htmlspecialchars($_SERVER["PHP_SELF"], ENT_QUOTES, "utf-8"); ?>

Zobacz lukę XSS w prawie każdej formie PHP, jaką kiedykolwiek napisałem , aby dowiedzieć się, jak $_SERVER["PHP_SELF"] można zaatakować.

 32
Author: John Conde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-12 17:28:14

To rzeczywiście podatność na XSS. Rozumiem, że uważasz, że nie może to zaszkodzić twojej stronie, ale to nie znaczy, że nie jest prawdziwe.

Jeśli w to nie wierzysz, spróbuj:

Zakładamy, że masz stronę taką jak " rejestracja.php". Zakładamy, że masz formę, w której akcja jest:

<?php echo $_SERVER['PHP_SELF']; ?>

Jak to ująłeś:

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  <!-- form contents -->
</form>

Teraz wystarczy dodać napis poniżej

%27%22/%3E%3Cscript%3Ealert(1)%3C/script%3E

Nie jest to tak naprawdę trudne do zrozumienia, ponieważ PHP_SELF jest odbiciem z adresu URL, aplikacja będzie czytać cokolwiek umieścić w adresie URL i echo go. To proste.

Htmlspecialchars powinien zająć się sprawą, nie ma powodu do kwestionowania dowodów.

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>">
   <!-- form contents -->
</form>

Jednak nawet to jest pierwszy krok w steeling cookie, to nie jest tak, że odbywa się to automatycznie. Nawet jeśli wykonanie ataku jest dość łatwe (atakujący zarejestruje się na twojej stronie i zobaczy, jak wygląda plik cookie...itd.), szereg innych czynników musi być prawdziwe, aby dostać się do sens posiadania ciastka steeling sytuacji. Na przykład plik cookie nie może wygasnąć. To zależy od złożoności pliku cookie. Być może masz inne środki ostrożności w umieszczone na serwerze, to nie musi być wszystkie uwierzytelnianie oparte na obecności cookie!

Chociaż uważam, że jest to raczej trudne i naprawdę złe programowanie dla wszystkich warunków do spełnienia (nawet jeśli yahoo.mail na przykład miał taką lukę i jeśli spojrzysz na internet znajdziesz nawet exploita i dekoder cookie), XSS jest prawdziwy i kto wie, co może zrobić przebiegły atakujący, jeśli Twoja witryna ucierpi z tego powodu. Lekarstwo jest proste...

 24
Author: Florin Sima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-22 13:55:51

Sam artykuł, który podlinkowałeś daje:

http://www.example.com/form.php/%22%3E%3Cscript%3Ealert(‘xss attack’)%3C/script%3E%3Cbr%20class=%22irrelevant
Co jest niejasne?

Edit: jest to atak XSS, ponieważ mogę ukryć link z mojej strony do Twojej z jakimś JS dodane do adresu URL, który wysyła mi swoje pliki cookie, więc w momencie, gdy klikniesz ten link, jesteś pwnd.

 15
Author: chx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-21 10:13:52

Powinieneś używać filter_input () aby uzyskać dostęp do superglobali w PHP. Jeśli ustawisz filtr na FILTER_SANITIZE_FULL_SPECIAL_CHARS usunie niebezpieczne znaki zwykle używane w XSS. Podany przykład:

<form method="post" 
    action="<?php filter_input(INPUT_SERVER, 'PHP_SELF', FILTER_SANITIZE_FULL_SPECIAL_CHARS); ?>">
<!-- form contents -->
</form>
 2
Author: Adam Bowen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-25 15:36:55