Nie jestem purystą, ale... czyli spot the bug

Tym razem nie chodzi o żaden przykład z bootcamp. Błąd, który trzeba zauważyć jest co prawda związany z bezpieczeństwem, jest(?) to podatność, ale ryzyko z nią związane jest nikłe. Błąd jest dość oczywisty, fragment kodu:

Tak, dokładnie. To jest aż tak oczywiste. Co się stanie, gdy $shorttitle będzie zawierać znak ' ? Przykład ten dedykuję tym, którzy żyją w przeświadczeniu, że użycie systemu szablonów chroni przed podatnościami typu cross-site scripting. Nie, nie chroni. Przynajmniej do czasu, gdy nie zostanie stworzony system szablonów, który domyślnie koduje wszystkie wypisywane i pochodzące od użytkownika dane w sposób odpowiedni do kontekstu, w jakim są użyte. Oczywiście nawet wówczas będzie można sobie strzelić z łuku w kolano, ale będzie to wymagało nieco wysiłku.

W tym konkretnym przypadku warto zastanowić się nad ewentualnym scenariuszem wykorzystania tego błędu. Wartość $shorttitle to skrócony do pewnej długości tytuł wpisu. Teoretycznie można to uznać za okoliczność łagodzącą , jednak w tym przypadku długość $shorttitle jest na tyle duża, że bez problemu można osadzić własny kod (w szczególności jakiś JavaScript Loader). Tylko po co ktoś miałby to robić? Osoba, która może tworzyć/modyfikować wpisy (bo taka może ustawić tytuł wpisu) już ma możliwość wstawienia dowolnego kodu. Po prostu. We wpisie. I nie jest to błąd, tylko działanie zgodne z założeniami. Jaki jest więc cel stworzenia takiego tytułu wiadomości, który spowoduje wykorzystanie podatności zawartej we wskazanym fragmencie kodu? Ja nie potrafię się go doszukać.

Prezentowany fragment kodu pochodzi z szablonu, z którego korzysta mój blog. Znalazłem go zupełnie przypadkiem, poprzez wpis There's more than one way to skin a cat, w tytule którego znalazł się nieszczęsny znak '. Żeby było jasne – nie testowałem dokładnie bezpieczeństwa Serendipity. Rzuciłem okiem tu i ówdzie, nie do końca mi się pewne rzeczy podobają, (...), jakoś specjalnie na tym temacie skupiać się nie zamierzam. Nie chce mi się, nie mam na to czasu, nie widzę w tym celu. Opieram się za to na dostępnych informacjach, na przykład na bazach błędów, które dla Serendipity są akurat dość łaskawe. Na paru innych rzeczach też się opieram, ale w tej chwili nie są one specjalnie istotne :)

Pora wrócić do fragmentu o byciu purystą. Michał kiedyś napisał Walidacja HTML – tylko dla masochistów, w którym z kolei odwoływał się do HTML Validation: Does It Matter. Staram się trzymać standardów, choć nie za wszelką cenę. Nie zmienia to faktu, że mam zainstalowanych kilka różnych narzędzi, które taką walidację realizują. Jednym z nich jest Html Validator, dzięki któremu właśnie zauważyłem ten błąd. No i oczywiście dzięki temu, że staram się, by moje strony były czyste i w trakcie walidacji jednak nie było (zbyt dużo) błędów.

Podobne “sztuczki” przydają się w trakcie testów. Na przykład takie:

Proste, łatwe i przyjemne sprawdzenie jak zmiana parametru na wejściu przekłada się na zmianę generowanej strony. W tym przypadku można podejrzewać, że przekazywany parametr jest wypisywany następnie w kontekście JavaScript, co skłania do pewnego eksperymentu...

...który to eksperyment kończy się sukcesem...

...i znajduje potwierdzenie w kolejnym porównaniu kodu strony.

Prawda, że proste? I dlatego choć nie jestem purystą, to z różnych walidatorów korzystam i zwracam uwagę na to, co do mnie mówią.

Oryginał tego wpisu dostępny jest pod adresem Nie jestem purystą, ale... czyli spot the bug

Autor: Paweł Goleń