Bardzo dobrze jest korzystać z niektórych automatycznych narzędzi, jednak nie uzyskasz od nich żadnego wglądu ani doświadczenia.
Celem ataku XSS jest wykonanie javascript w oknie przeglądarki, które nie jest dostarczane przez witrynę. Najpierw musisz sprawdzić, w jakim kontekście dane użytkownika są drukowane na stronie internetowej; może znajdować się w obrębie bloku kodu <script></script>
, może znajdować się w obrębie bloku <style></style>
, może być używany jako atrybut elementu <input type="text" value="USER DATA" />
lub na przykład w <textarea>
.W zależności od tego zobaczysz, jakiej składni użyjesz, aby uciec od kontekstu (lub użyć go); na przykład jeśli jesteś w tagach <script>
, może być wystarczające zamknięcie paretki funkcji i zakończenie linii średnikiem, aby ostateczny zastrzyk wyglądał jak ); alert(555);
. Jeśli podane dane są używane jako atrybuty html, wtrysk może wyglądać jak " onclick="alert(1)"
, co spowoduje wykonanie js, jeśli klikniesz na element (ten obszar jest bogaty w grę, szczególnie w html5). Chodzi o to, że kontekst xss jest tak samo ważny jak wszelkie funkcje filtrowania/sanatyzacji, które mogą być na miejscu, i często mogą występować małe niuanse, których automatyczne narzędzie nie będzie przechwytywać. Jak widać powyżej, nawet bez cudzysłowów i znaczników html, w ograniczonej liczbie przypadków możesz być w stanie ominąć filtry i wykonać js.
Należy również rozważyć kodowanie przeglądarki, na przykład można obejść filtry, jeśli docelowa przeglądarka ma kodowanie UTF7 (i kodujecie w ten sposób swój zastrzyk). Filtrowanie uchylania się to zupełnie inna historia, jednak obecne funkcje PHP są dość kuloodporne, jeśli są używane poprawnie.
Również tutaj jest dość długa lista XSS vectors
jako ostatnią rzeczą, o to rzeczywisty przykład ciąg XSS, który został znaleziony na miejscu, a ja gwarantuję, że nie jeden skaner będzie już stwierdzono, że (były różne filtry i czarne listy haseł, strona wolno wkładać podstawowe formatowanie HTML, aby dostosować stronę profilu):
<a href="Boom"><font color=a"onmouseover=alert(document.cookie);"> XSS-Try ME</span></font>
Code luk wtryskowych, takich jak XSS lub SQL injection są zawsze wynikiem niewłaściwego użytkowania lub brak ucieczki danych. W PHP * musisz * używać 'htmlspecialchars()' on * everything *, które wyprowadzasz na stronę, która nie ma być znacznikiem. Aby zaoszczędzić trochę pisania możesz użyć funkcji 'h ($ s)' zwróć {return htmlspecialchars (s); } 'i używaj' h() 'wszędzie. – Tomalak
Jaki jest sens testowania luk XSS ** przed ** implementujesz 'htmlspecialchars()' (lub 'htmlentities()')? – Mike
Pamiętaj też o "poziomie kodu", w którym się znajdujesz: Na przykład: Pisząc dane generowane przez użytkownika do komentarza HTML, naprawdę nie musisz 'htmlspecialchars()' go, ale * musisz * pamiętać usuń wszelkie wystąpienia '->' z tych danych lub masz tam możliwą lukę XSS. – Tomalak