1. Python / Говнокод #28618

    −1

    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, 01 Марта 2023

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

    • где код, Doorman5302? Я вижу только ссаное говно.
      Ответить
    • Если, конечно, успеешь, пока код не протухнет
      Ответить
      • Чтобы код не протухал, надо пересыпать строки негашеной известью.
        Ответить
        • 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 можно вызвать без сессии, полученной в результате ввода пароля?
          Ответить
          • В том виде, как это было в проекте - можно было. проверял
            Ответить
      • > или успеть переебать все варианты в течение окна

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

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

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