Lekcja 9: Właściwy encoding danych
Wprowadzenie
Encoding danych jest jednym z bardziej istotnych elementów bezpieczeństwa w aplikacjach internetowych. Błędy związane z brakiem encodingu lub jego niewłaściwym stosowaniem znalazły się na liście 2009 CWE/SANS Top 25 Most Dangerous Programming Errors na drugim miejscu: CWE-116: Improper Encoding or Escaping of Output.
Przykład
Encoding musi być odpowiedni, czyli właściwy dla kontekstu, w którym dane zostaną użyte. W przykładzie http://bootcamp.threats.pl/lesson09/ wykorzystane są przykładowe trzy sposoby encodingu danych:
- brak encodingu,
- encoding danych do użycia w HTML,
- encoding danych do użycia w atrybucie,
Dane przekazane przez użytkownika wypisywane są w kilku kontekstach:
- treść HTML,
- URL i treść odnośnika,
- atrybut w polu hidden,
- atrybut w tagu span,
- skrypt JavaScript,
Dla każdego z kontekstów można wskazać przykład danych powodujących Cross-Site Scripting. By przeciwdziałać tej podatności należy zastosować właściwy encoding. Można sprwadzić jak zastosowanie niewłaściwego encodingu powoduje, że podatność nadal istnieje.
Dobrym początkiem testów jest sprawdzenie zachowania poszczególnych funkcji dla ciągu '';!--"<XSS>=&{()}. Można zobaczyć jakie znaki są w poszczególnych przypadkach encodowane, co z kolei pozwoli na stwierdzenie, czy dla danego encodingu w danym kontekście możliwe jest wykonanie XSS.
Jako przykłady biblitek pozwalających na łatwą realizację właściwego dla kontekstu encodingu danych wyjściowych można wskazać:
- AntiXSS dla ASP.NET,
- Enterprise Security API dla większej ilości środowisk, jednak w większości dopiero w implementacji,
Warto zwrócić uwagę, że ESAPI, podobnie jak i AntiXSS, udostępnia szereg funkcji realizujących encoding odpowiedni dla różnych kontekstów użycia danych. Przykłady funkcji z biblioteki ESAPI:
- encodeForBase64
- encodeForCSS
- encodeForDN
- encodeForHTML
- encodeForHTMLAttribute
- encodeForJavaScript
- encodeForLDAP
- encodeForOS
- encodeForSQL
- encodeForURL
- encodeForVBScript
- encodeForXML
- encodeForXMLAttribute
- encodeForXPath
Co do zasady należy:
- zawsze stowować encoding danych, w szczególności gdy są kontrolowane przez użytkownika (patrz: Trust Boundary),
- stosowany encoding danych musi być właściwy dla kontekstu, w którym dane będą użyte,
- wykorzystywać dostępne biblioteki do realizacji właściwego encodingu,
Poza zamierzonymi przykładami XSS jest jeden "bonusowy", to tak w ramach prostego wyzwania.