Pracowałem nad aplikacją asp.net, która przeszła audyt bezpieczeństwa prowadzony przez wiodącą firmę ochroniarską i nauczyłem się tej prostej sztuczki, aby zapobiec mniej znanej, ale ważnej luce w zabezpieczeniach.
Poniższe wyjaśnienie pochodzi z:
http://www.guidanceshare.com/wiki/ASP.NET_2.0_Security_Guidelines_-_Parameter_Manipulation#Consider_Using_Page.ViewStateUserKey_to_Counter_One-Click_Attacks
Rozważ użycie Page.ViewStateUserKey do przeciwdziałania atakom za pomocą jednego kliknięcia. Jeśli uwierzytelniasz osoby dzwoniące i używasz ViewState, ustaw właściwość Page.ViewStateUserKey w module obsługi zdarzeń Page_Init, aby zapobiec atakom za pomocą jednego kliknięcia.
void Page_Init (object sender, EventArgs e) {
ViewStateUserKey = Session.SessionID;
}
Ustaw właściwość na wartość, o której wiesz, że jest unikalna dla każdego użytkownika, na przykład identyfikator sesji, nazwę użytkownika lub identyfikator użytkownika.
Atak jednym kliknięciem ma miejsce, gdy osoba atakująca utworzy stronę internetową (.htm lub .aspx) zawierającą ukryte pole formularza o nazwie __VIEWSTATE, które jest już wypełnione danymi ViewState. ViewState można wygenerować ze strony wcześniej utworzonej przez atakującego, takiej jak strona koszyka na zakupy zawierająca 100 elementów. Atakujący zwabia niczego niepodejrzewającego użytkownika do przeglądania strony, a następnie atakujący powoduje wysłanie strony na serwer, na którym poprawne jest ViewState. Serwer nie może wiedzieć, że ViewState pochodzi od atakującego. Sprawdzanie poprawności ViewState i HMAC nie przeciwdziałają temu atakowi, ponieważ ViewState jest prawidłowy, a strona jest wykonywana w kontekście bezpieczeństwa użytkownika.
Ustawiając właściwość ViewStateUserKey, gdy osoba atakująca przejdzie do strony w celu utworzenia ViewState, właściwość jest inicjowana na swoje imię. Gdy uprawniony użytkownik prześle stronę na serwer, zostaje ona zainicjowana nazwą atakującego. W rezultacie sprawdzenie ViewMate HMAC kończy się niepowodzeniem i generowany jest wyjątek.