Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion JWT/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Use an official Node runtime as a parent image
FROM node:12-buster
FROM node:16-slim

# Set the working directory in the container
WORKDIR /usr/src/app
Expand Down
2 changes: 1 addition & 1 deletion JWT/jwt-signature-apis-challenges/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ app.post('/jwt/none', (req, res) => { //None endpoint
} else if (jwt_b64_dec.header.alg == 'none') {
secret_key = '';
}
JWT.verify(jwt_token, secret_key, { algorithms: ['none', 'HS256'], complete: true, audience: 'https://127.0.0.1/jwt/none' }, (err, decoded_token) => {
JWT.verify(jwt_token, secret_key, { algorithms: ['HS256'], complete: true, audience: 'https://127.0.0.1/jwt/none' }, (err, decoded_token) => {
if (err) {
res.status(400).json(err);
} else {
Expand Down
1 change: 0 additions & 1 deletion JWT/jwt-signature-apis-challenges/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
"author": "OnSecRU",
"license": "ISC",
"dependencies": {
"@chilkat/ck-node12-linux64": "^9.50.83",
"child_process": "^1.0.2",
"crypto": "^1.0.1",
"express": "^4.17.1",
Expand Down
43 changes: 43 additions & 0 deletions PR.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
# Zadanie 1

Stworzono i wykonano testy dla modelu Book, dokonano odpowiedniej modyfikacji dockerfile. Znajdują się one w folderze tests/ w wersji pythonowej. Testy wykonują się przy buildzie, bądź gdy już zbuildowano, poprzez komendę:
```
wsl docker run --rm flask-book-library pytest tests/ -v
```

### Wyniki testów
![Wyniki testów (PASSED)](img/testy.png)


# Zadanie 2

Token składa się z kilku segmentów przedzielonych kropką. Rezultat dekodowania:
![Rezultat dekodowania](img/dekodowanie.png)

W headerze zmieniono "HS256" na "none", w payload account z "Bob" na "administrator". Token kończy się kropką, bo signature nie jest potrzebne.

![Wynikowy token](img/token.png)


Po wysłaniu powstałego tokena do odpowiedniego endpointu otrzymuję następujący rezultat:

![Odpowiedź dla tokena](img/rezultat.png)

## Poprawka podatności

Podatność została zidentyfikowana w pliku `JWT/jwt-signature-apis-challenges/app.js` w linii 34. Problem polegał na tym, że w metodzie `JWT.verify()` w tablicy `algorithms` znajdował się algorytm `'none'`, co pozwalało na weryfikację tokenów JWT bez podpisu. Poprawka polegała na usunięciu `'none'`.

```javascript
JWT.verify(jwt_token, secret_key, { algorithms: ['HS256'], complete: true, audience: 'https://127.0.0.1/jwt/none' }, ...)
```

### Efekt poprawki

Po wprowadzeniu poprawki, aplikacja akceptuje tylko tokeny podpisane algorytmem `HS256`. Próba użycia tokenu z algorytmem `'none'` zostanie odrzucona z błędem weryfikacji, co eliminuje możliwość ataku polegającego na modyfikacji tokenu bez podpisu.

Po wysłaniu tokena do endpointu po poprawce rezultat jest następujący:
![Odpowiedź dla tokena po poprawce](img/po_popr.png)

Poprawka zadziałała, token nie został przyjęty.


3 changes: 3 additions & 0 deletions Python/Flask_Book_Library/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ ENV PASSWORD=1qaz@WSX
# Instalujemy zależności
RUN pip install --no-cache-dir -r requirements.txt

# Uruchamiamy testy - jeśli testy się nie powiodą, build zakończy się niepowodzeniem
RUN pytest tests/ || exit 1

# Ustawiamy zmienną środowiskową, aby Flask wiedział, jak uruchomić aplikację
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
Expand Down
2 changes: 2 additions & 0 deletions Python/Flask_Book_Library/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ SQLAlchemy==2.0.21
typing_extensions==4.8.0
Werkzeug==2.3.7
WTForms==3.0.1
pytest==7.4.3
pytest-flask==1.3.0
2 changes: 2 additions & 0 deletions Python/Flask_Book_Library/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Tests package

25 changes: 25 additions & 0 deletions Python/Flask_Book_Library/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import pytest
import os
from project import app, db


@pytest.fixture(scope='function')
def test_app():
"""Create application for testing"""
# Use in-memory SQLite database for testing
app.config['TESTING'] = True
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['WTF_CSRF_ENABLED'] = False

with app.app_context():
db.create_all()
yield app
db.drop_all()


@pytest.fixture(scope='function')
def test_db(test_app):
"""Create database for testing"""
return db

Loading