CSRF, XSS i SQL Injection Attack prevention w JSF

Mam aplikację internetową zbudowaną na JSF z MySQL jako DB. Zaimplementowałem już kod, aby zapobiec CSRF w mojej aplikacji.

Skoro moim podstawowym frameworkiem jest JSF, to chyba nie muszę radzić sobie z atakiem XSS, ponieważ jest on już obsługiwany przez UIComponent. Nie używam żadnego JavaScript na żadnej ze stron widoku. Nawet jeśli używam, czy naprawdę muszę implementować kod, aby zapobiec atakom XSS?

Dla DB używamy gotowych instrukcji i procedur składowanych we wszystkich DB interakcje.

Czy jest coś jeszcze, czym trzeba się zająć, aby zapobiec tym 3 częstym atakom? Przejrzałem już stronę OWASP i ich ściągi .

Czy muszę zająć się innymi potencjalnymi wektorami ataku?
Author: Antti Haapala, 2011-10-11

2 answers

XSS

JSF został zaprojektowany tak, aby miał wbudowaną profilaktykę XSS. Możesz bezpiecznie ponownie odtworzyć wszystkie wejścia kontrolowane przez użytkownika (nagłówki żądań (w tym pliki cookie!), parametry żądania (również te, które są zapisywane w DB!) i organy żądań (przesłane pliki tekstowe, itp.)) przy użyciu dowolnego komponentu JSF.

<h:outputText value="#{user.name}" />
<h:outputText value="#{user.name}" escape="true" />
<h:inputText value="#{user.name}" />
etc...

Zauważ, że gdy używasz JSF 2.0 na Faceletach, możesz użyć EL w tekście szablonu w następujący sposób:

<p>Welcome, #{user.name}</p>

To również w domyśle zostanie usunięte. Ty nie koniecznie potrzebuję <h:outputText> tutaj.

Tylko gdy jawnie unescaping wejście kontrolowane przez Użytkownika za pomocą escape="false":

<h:outputText value="#{user.name}" escape="false" />

Więc masz potencjalną dziurę do ataku XSS!

Jeśli chcesz ponownie wyświetlić dane wejściowe sterowane przez użytkownika jako HTML, w którym chcesz zezwolić tylko na określony podzbiór znaczników HTML, takich jak <b>, <i>, <u>, itd., następnie należy wyczyścić dane wejściowe za pomocą białej listy. Parser HTML Jsoup jest bardzo pomocny w to.

itemLabelEscaped bug in Mojarra

Starsze wersje Mojarra przed 2.2.6 miały błąd, w którym <f:selectItems itemLabel> nieprawidłowo renderuje Etykietę bez znaku, gdy podano List<T> poprzez <f:selectItems var> zamiast List<SelectItem> lub SelectItem[]jako wartość ( wydanie 3143). Innymi słowy, jeśli zmieniasz dane kontrolowane przez użytkownika jako etykiety przedmiotów za pomocą List<T>, masz potencjalną dziurę w XSS. Jeśli aktualizacja do co najmniej Mojarra 2.2.6 nie jest opcją, musisz jawnie ustawić itemLabelEscaped atrybut true, aby temu zapobiec.

<f:selectItems value="#{bean.entities}" var="entity" itemValue="#{entity}"
    itemLabel="#{entity.someUserControlledProperty}" itemLabelEscaped="true" />

CSRF

JSF 2.x wbudował już zapobieganie CSRF w ukrytym polu javax.faces.ViewState w formularzu przy użyciu zapisywania stanu po stronie serwera. W JSF 1.x wartość ta była dość słaba i zbyt łatwa do przewidzenia (w rzeczywistości nigdy nie była przeznaczona jako zapobieganie CSRF). W JSF 2.0 zostało to poprawione przez użycie długiej i silnej wartości autogeneracyjnej zamiast dość przewidywalnej wartości sekwencji, dzięki czemu stał się solidnym CSRF profilaktyka.

W JSF 2.2 jest to jeszcze bardziej ulepszone, czyniąc go wymaganą częścią specyfikacji JSF, wraz z konfigurowalnym kluczem AES do szyfrowania stanu po stronie klienta, w przypadku, gdy włączone jest zapisywanie stanu po stronie klienta. Zobacz także JSF Spec issue 869 i ponowne użycie wartości ViewState w innej sesji (CSRF). Nowością w JSF 2.2 jest ochrona CSRF przy żądaniach GET przez <protected-views>.

Tylko wtedy, gdy używasz bezstanowych widoków jak w <f:view transient="true">, lub jest gdzieś dziura ataku XSS w aplikacji, to masz potencjalny dziura ataku CSRF.


SQL injection

To nie jest odpowiedzialność JSF. Jak temu zapobiec, zależy od używanego interfejsu API persistence (raw JDBC, modern JPA lub good old' Hibernate), ale wszystko sprowadza się do tego, że nie powinieneś nigdy łączyć kontrolowanych przez użytkownika danych wejściowych z łańcuchami SQL w taki sposób

String sql = "SELECT * FROM user WHERE username = '" + username + "' AND password = md5(" + password + ")";
String jpql = "SELECT u FROM User u WHERE u.username = '" + username + "' AND u.password = md5('" + password + "')";

Wyobraź sobie, co by się stało, gdyby użytkownik końcowy wybrał następujące nazwa:

x'; DROP TABLE user; --

Powinieneś zawsze używać parametryzowanych zapytań tam, gdzie ma to zastosowanie.

String sql = "SELECT * FROM user WHERE username = ? AND password = md5(?)";
String jpql = "SELECT u FROM User u WHERE u.username = ?1 AND u.password = md5(?2)";

W zwykłym JDBC musisz użyć PreparedStatement aby wypełnić wartości parametrów i w JPA (i Hibernate),Query obiekt oferuje również setery do tego celu.

 98
Author: BalusC,
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
2018-07-31 14:08:45

Nie używam żadnego JavaScript na żadnej ze stron widoku. Nawet jeśli używam czy naprawdę muszę zaimplementować kod, aby ominąć atak XSS.

Możesz być podatny na XSS, nawet jeśli nie używasz JavaScript na swoich stronach. XSS występuje, gdy zawartość kontrolowana przez atakującego nie jest poprawnie kodowana.

Kiedy tylko zrobisz coś takiego

response.write("<b>" + x + "</b>")

Jeśli atakujący może spowodować, że x zawiera HTML zawierający JavaScript, to jesteś podatny na XSS.

Rozwiązaniem zazwyczaj nie jest pisanie dużych ilości kodu. Zazwyczaj rozwiązaniem jest zakodowanie $x i wszelkich innych wartości kontrolowanych przez atakującego przed włączeniem ich do generowanego kodu HTML.

response.write("<b>" + escapePlainTextToHtml(x) + "</b>")

Filtrowanie lub odkażanie wejść może pomóc zapewnić dodatkową warstwę ochrony.

<shameless-plug>

Można również użyć języka szablonów, który koduje wyjście automatycznie w celu ochrony przed XSS.

Zamknięcie Szablon jest jedną z takich opcji dla Javy.

Autoescaping kontekstowy działa poprzez rozszerzenie szablonów zamknięcia, aby poprawnie zakodować każdą wartość dynamiczną w oparciu o kontekst, w którym się pojawia, chroniąc w ten sposób przed lukami XSS w wartościach kontrolowanych przez atakującego.

EDIT

Ponieważ używasz JSF powinieneś przeczytać na XSS w JSF :

Wyjście wyjścia tekst

<h:outputText/> oraz <h:outputLabel/> domyślnie ma ustawiony atrybut escape Na True. Używając tego znacznika do wyświetlania wyników, możesz złagodzić większość luk w zabezpieczeniach XSS.

SeamTextParser i <s:formattedText/>

Jeśli chcesz umożliwić użytkownikom korzystanie z niektórych podstawowych znaczników html do dostosowywania ich wejść, JBoss Seam udostępnia znacznik <s:formattedText/>, który pozwala na niektóre podstawowe znaczniki html i style określone przez użytkowników.

 8
Author: Mike Samuel,
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-10-11 08:23:49