Как защитить Formit от Curl

Всем доброго времени суток.
На новый год начали атаковать сайт спамом, опытным путем выяснили, что атака идет примерно таким скриптом:
curl -X POST -F 'name=linuxize22' -F 'phone=%2B7+(111)+111-1111' -F 'af_action=b410d612437cea16aebde937ffa79a3b' -F 'pageId=1' \
-H «X-Requested-With: XMLHttpRequest» \
--cookie «PHPSESSID=e12556e3b7093e9f82411af39f471e9f» \
адрес.сайта/assets/components/ajaxform/action.php

Капча не спасает от такой атаки (или может я коряво ее настроил?), но в личном кабинете капчи никаких плохих сессий она на замечает. А я вот спокойно таким скриптом шлю письма, когда она работает, таким же образом (как мне кажется) шлет письма и недоброжелатель.

Есть ли возможность защититься от такой атаки и интегрировать капчу на уровне самого formit, а не на уровне отдельной формы? Или может .htaccess спасет? Спам прекращается только когда ломаю formit добавляя в начале скрипта return;
Максим
11 января 2024, 12:56
modx.pro
466
0

Комментарии: 17

Наумов Алексей
11 января 2024, 13:11
0
Покажите вызовы сниппета AjaxForm на вашем сайте. Отправить форму с сайта без заполнения капчи точно невозможно?
    Максим
    11 января 2024, 13:16
    0
    [[!AjaxForm?
    &snippet=`FormIt`
    &form=`tplCallbackForm`
    &emailTpl=`tplCallbackMessage`
    &hooks=`spam,email,recaptchav3`
    &emailSubject=`Заказ обратного звонка с сайта [[++site_url]]`
    &emailTo=`[[++ms2_email_manager]]`
    &validate=`name:required,phone:required,email:blank`
    &validationErrorMessage=`В форме содержатся ошибки!`
    &successMessage=`Сообщение успешно отправлено!`
    ]]
      Наумов Алексей
      11 января 2024, 13:18
      0
      хуки вызываются в порядке их указания:
      &hooks=`spam,email,recaptchav3`
      у вас значит проверка spam (не знаю, что там), далее отправляется письмо, далее проверка рекапчи… только смысл то её проверять, письмо уже отправлено.
        Максим
        11 января 2024, 13:24
        0
        Поменял местами, поставил хук капчи первым. С сайта форма отправляется (пишет все ок), на почту не приходят, в логах ошибка — httpdocs/core/cache/includes/elements/modsnippet/94.include.cache.php: 84) Failed to load Recaptcha class. Но скриптом через курл письма отлично приходят))) Капча не помогает защищаться от курла(
          Наумов Алексей
          11 января 2024, 14:13
          0
          ну смотри…
          AjaxForm лишь прокидывает данные на FormIt.
          Для того, чтобы это все работало — при рендере формы в сессию записываются $scriptPtoperties с которыми вызывался AjaxForm, эти данные записаны в сессии с ключем, который передается в af_action.

          Получается, что в сессии эти данные есть по крайней мере она не пуста)

          Потом FormIt вызывает хуки по очереди:
          spam он там как-то email проверяет, у тебя в форме я каких-либо email не вижу, думаю что в итоге этот хук вообще ничего не делает у тебя;
          — далее правильно вызывать recaptchav3, судя по логам он с ошибкой работает. Если посмотрим в код, то сообщение в логе «Failed to load Recaptcha class» означает и то, что хук вернет false. Все, FormIt должен прекратить обработку, до хука email, который отправит письмо, дело не дойдет.
            Максим
            11 января 2024, 14:47
            0
            Это все понятно, но поломанный ajaxform не мешает отправлять злоумышленнику отправлять курлом письма. Тут вопрос не в том, как пресекать действия с помощью рекапчи, а как запретить курлом отправлять письма напрямую через formit?
              Максим
              11 января 2024, 19:08
              0
              Капчу поставил другую, на морде все отрабатывает отлично, без прохождения капчи форма не уходит, а через курл как шли письма — так и идут. Куда еще можно копать? Почему капча не работает на системном уровне? Где то может я какую то настройку упускаю?
        Максим
        11 января 2024, 13:17
        0
        Капча не появляется, так как скрипт не определяет, что визит подозрительный. Я если не вызываю сниппет на страницы, отправить курлом письмо все равно получается. Получается даже в том случае, когда на сайте не остается ни одной формы.
        Артур Шевченко
        11 января 2024, 19:14
        0
        Поменяй AjaxForm на SendIt
          Максим
          11 января 2024, 19:23
          0
          А без смены нет решений? Это сам по себе AjaxForm дырявый?
            Артур Шевченко
            11 января 2024, 19:34
            0
            Можно попробовать эту строку заменить на такую
            $hash = $_SESSION['afhash'] = md5(http_build_query($scriptProperties));
            А на этой строке добавить проверку
            if(!$_SESSION['afhash'] || !$_REQUEST['af_action'] || $_REQUEST['af_action'] !== $_SESSION['afhash']){
             echo $AjaxForm->error('af_err_action_ns');
            }
            И не забудь рассказать помогло или нет, интересно же)))
              Максим
              11 января 2024, 19:55
              0
              Не помогло)
                Артур Шевченко
                11 января 2024, 20:51
                0
                Это потому что сниппет вызывается. А вообще идея в том, чтобы генерировать токен, записывать его в сессию и передавать на фронт. А при отправке формы передавать обратно на сервер и а файле action.php проверять равен ли переданный токен записанному в сессию и вообще есть ли этот токен. Генерировать можно в плагине на событие OnHandleRequest. Передавать на фронт через $_COOKIE. Вставлять форму JS.
                  Максим
                  11 января 2024, 20:53
                  0
                  Я пока победил атаки только сменой AjaxForm на другую обертку Formit. Курл работать перестал, жду пока новых атак)
          Константин Ильин
          13 января 2024, 12:00
          0
          Тоже столкнулся с такой проблемой, не понимал откуда спам. Стоял AjaxForm, поменял на FetchIt один фиг через день началось.
          Как вариант конечно создать дубликат action.php, назвать аля fsdfjsfjsoidfjsofsdofsd.php, заменить везде обращения action.php на новый файл. в оригинальном action.php return можно какую то ошибку все время возвращать для правдоподобности.

          Но если прям всерьез взялись за атаку, то и этот файл быстро найдут, посмотрят куда отправляются запросы.
            Максим
            13 января 2024, 12:12
            0
            AjaxForm перестали поддерживать уже, переходи на другую обертку Formit, там более защищено все
              Артур Шевченко
              13 января 2024, 19:10
              +1
              SendIt с версии 1.1.2 защищён от подобных атак.
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              17