Змея / Говнокод #28618 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
def auth_2FA(request):
    mail = request.POST.get('mail')
    user = User.objects.get(email=mail)
    code2FA = request.POST.get('code2FA')
    if pyotp.TOTP(user.secret).verify(code2FA):
        auth.login(request, user)
        return redirect(settings.HOME_PAGE)
    else:
        ...

# Безопасность
Django, двухфакторка.
Защиты от перебора нет, пароль не проверяется. Зная только mail можно залогиниться перебрав код из 6 цифр

Запостил: Doorman5302 Doorman5302, (Updated )

Комментарии (12) RSS

    • Чтобы код не протухал, надо пересыпать строки негашеной известью.
      Ответить
      • def auth_2FA(request):
        # CaO
            mail = request.POST.get('mail')
        # CaO
            user = User.objects.get(email=mail)
        # CaO
            code2FA = request.POST.get('code2FA')
        # CaO
            if pyotp.TOTP(user.secret).verify(code2FA):
        # CaO
                auth.login(request, user)
        # CaO
                return redirect(settings.HOME_PAGE)
        # CaO
            else:
        # CaO
         ...

        так?
        Ответить
        • мне кажется, что негашёнкой надо обсыпать автора кода, а лучше - вколоть ему ее внутримышечно
          Ответить
  • > Защиты от перебора нет

    Лезем в код

    def verify(self, otp: str, for_time: Optional[datetime.datetime] = None, valid_window: int = 0) -> bool:
            ...
            if for_time is None:
                for_time = datetime.datetime.now()
            ...
            return utils.strings_equal(str(otp), str(self.at(for_time)))


    Чтобы его перебрать, надо остановить часы (или успеть переебать все варианты в течение окна), чтобы его подгадать, нужно знать пользовательский секрет. По-хорошему действительно уже на второй-третьей попытке надо блокировать вход в течение окна, но джанга же всё равно столько рпс не выдержит, чтобы подобрать.

    > пароль не проверяется.

    А как он блядь должен проверяться, если это отдельный запрос? Различные факторы в том числе должны быть изолированы друг от друга, чтобы подглядев один хуемышленник не подглядел сразу всё. Подозреваю, что до этого кода просто не дойдет, если не стоит сессия, созданная в результате ввода пароля.
    Ответить
    • хорошою, перебрать не получится.
      Но выходит, что не надо знать пароль. Достаточно знать mail и код двуфакторки и отправить post запрос
      Ответить
      • А ты уверен, что auth_2FA можно вызвать без сессии, полученной в результате ввода пароля?
        Ответить
    • > или успеть переебать все варианты в течение окна

      Или просто начать новое окно когда старое протухнет...

      В общем-то за миллион-другой попыток что с окном что без окна что-нибудь подберётся чисто по теории вероятностей. Тлен и безысходность если попытки не троттлить.
      Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8