Znaleziona i naprawiona podatność XSS - Adam Zientek #58
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
1. Podatność XSS
W aplikacji webowej Flask Book Library znalazłem występowanie podatności typu Persistent Cross Site Scripting w formularzach dodawania książek, klientów i wypożyczeń. Podatność pozwalała na wstrzyknięcie i wykonanie kodu javascript w pola name i author w przypadku książek lub name i city w przypadku klienta. Pochodnie udawało się też wykonać kod przy przypisaniu nazwy książki lub nazwy klienta do danego wypożyczenia. Kod wykonywał się za każdym razem po wyświetleniu strony zawierającej rekord z przykładowym skryptem javascript <script>alert(1)</script>.
Umieszczenie złośliwych skryptów podczas dodawania nowej książki:

Wykonanie skryptu js dla pola name:
Wykonanie skryptu js dla pola author:

Wygląd rekordu po jego dodaniu do bazy książek:
Umieszczenie złośliwych skryptów podczas dodawania nowego klienta:
Wykonanie skryptu js dla pola name:
Wykonanie skryptu js dla pola city:
Wygląd rekordu po jego dodaniu do bazy klientów:
2. Koncepcja naprawy
W plikach models.py dla books, customers i loans dodałem sprawdzanie, czy dane podatne pola zawierają znaki specjalne - powinno wykrywać także próby ataków SQLi. W tym celu została napisana funkcja contains_special_chars, która wykrywa znaki specjalne z pomocą biblioteki re. Jeśli pole zawiera string ze specjalnymi znakami, zawarty w nim tekst jest poddawany sanityzacji przy użyciu funkcji escape z biblioteki MarkupSafe, która koduje znaki specjalne w html, co powoduje, że są one wyświetlane poprawnie w rekordach, lecz nie są poprawnie interpretowane jako część skryptu javascript.