Оповещение Modsecurity CSRF при использовании $_GET

Когда клиент посещает мой PHP-сайт, размещенный на моем личном сервере, и включает переменную в URL-адрес (пример https://www.example.com/test.php?t=somevalue), modsecurity отображает сообщение об ошибке в файле error.log.

Характеристики:

Server OS:   Linux server 3.2.0-4-486 #1 Debian 3.2.57-3 i686
Apache:      version 2.2.22
PHP:         version 5.4.4-14+deb7u9
Modsecurity: version 2.8.0

Сообщение об ошибке:

ModSecurity: Warning. Match of "eq 1" against "&ARGS:CSRF_TOKEN" required. [file "/usr/share/modsecurity-crs/optional_rules/modsecurity_crs_43_csrf_protection.conf"] [line "31"] [id "981143"] [msg "CSRF Attack Detected - Missing CSRF Token."]

Этот вопрос SO похож на мой, за исключением того, что я получаю сообщение об ошибке только тогда, когда браузер клиента добавляет переменную.

Modsecurity настраивается с помощью OWASP base_rules и optional_rules. Я не использую символические ссылки для них.

Единственное, что необычно в конфигурации моего сервера, это то, что он использует самозаверяющий SSL-сертификат, но я не думаю, что это имеет какое-то отношение к проблеме.

Ошибка отображается независимо от того, что содержит файл PHP, и не возникает с файлами HTML.

Что вызывает эту ошибку и как ее устранить?

Если это отсутствие токена CSRF, как мне его добавить?


person HelpingHand    schedule 06.06.2014    source источник
comment
что у вас есть в /etc/modsecurity/rules/ ?   -  person mamdouh alramadan    schedule 06.06.2014
comment
OWASP base_rules и optional_rules. Я добавляю это к моему вопросу...   -  person HelpingHand    schedule 06.06.2014
comment
каково содержание modsecurity_crs_43_csrf_protection.conf   -  person mamdouh alramadan    schedule 06.06.2014
comment
AW, я бы рекомендовал не использовать правило защиты csrf и реализовать свое. потому что у него есть ограничение на ajax. Ограничения - эта реализация в настоящее время не работает с AJAX.   -  person mamdouh alramadan    schedule 06.06.2014
comment
Я не изменил его содержание. Это содержимое: github.com/SpiderLabs/owasp -modsecurity-crs/blob/мастер/   -  person HelpingHand    schedule 06.06.2014
comment
Да... но я не использую Ajax. Если мне понадобится в будущем, я могу реализовать что-то еще.   -  person HelpingHand    schedule 06.06.2014
comment
Токены CSRF не должны применяться к строкам запроса, но с этим правилом они применяются. вы действительно ничего не можете с этим поделать, если не хотите изменить содержимое этого правила   -  person mamdouh alramadan    schedule 06.06.2014
comment
Есть ли пример этого правила, измененного так, чтобы я мог использовать переменные $_GET?   -  person HelpingHand    schedule 06.06.2014
comment
Извините, но какой у вас вопрос? Токен CSRF явно отсутствует, но ожидается по вашим правилам. Настройте в соответствии с вашими потребностями, это означает, что вы принимаете предложенные примеры OWASP. Здесь нет ничего из ряда вон выходящего.   -  person hakre    schedule 06.06.2014
comment
Какая функция в файле защиты CSRF вызывает эту ошибку. У меня нет опыта работы с modsecurity.   -  person HelpingHand    schedule 06.06.2014
comment
Не нужно быть очень опытным, чтобы прочитать номер строки из сообщения об ошибке: [line "31"] - файл тоже назван. С этой строкой и заданным правилом обратитесь к документации mod_security, а также к проекту/документам OWASP, которые касаются этого (если есть). Я предполагаю, что кто-то придумал что-то, чтобы вставить туда правило, и вы, возможно, больше всего выиграете, узнав об этом.   -  person hakre    schedule 06.06.2014


Ответы (3)


Извините, что констатирую очевидное:

Что вызывает эту ошибку и как ее устранить?

Ошибка вызвана указанным правилом. Вы можете устранить его, либо предоставив токен CSRF, либо отключив это правило.

person hakre    schedule 06.06.2014
comment
даже констатируя очевидное, +1 просто необходим. :) - person mamdouh alramadan; 06.06.2014
comment
Правило использует файл modsecurity_crs_16_session_hijacking.conf для защиты от CSRF-атак, если я прав... Значит, проблема с переменными $_GET заключается в чем-то другом... верно? - person HelpingHand; 06.06.2014
comment
Может ли удаление строки 31, как вы сказали, сделать modsecurity бесполезным для защиты от CSRF? - person HelpingHand; 06.06.2014
comment
@hakre Как мне provide the CSRF token? - person HelpingHand; 06.06.2014
comment
@HelpingHand: Через коллекцию SESSION действие append в этом SecRule перемещает его (если я вижу тот же код, что и вы). См. secure.jwall.org/blog/2009/01/08/1231374852674. .html как связать данные сеанса с PHP (и других языков). - person hakre; 06.06.2014

Поскольку вы упомянули, что это ваш личный сервер, я предполагаю, что на нем не размещается критическое для бизнеса приложение. Поэтому я предполагаю, что вы не беспокоитесь о подделке межсайтовых запросов.

Если это так, вы можете просто не включать (извлекать) файл конфигурации «modsecurity_crs_43_csrf_protection.conf» в свой файл конфигурации Apache.

person Ronald    schedule 09.06.2014

Правило (идентификатор 981143 в modsecurity_crs_43_csrf_protection.conf) представляет собой связанное правило. сначала он проверяет, есть ли в запросе какие-либо ARGUMENTS (ваш параметр t в URL-адресе получения), а затем проверяет, совпадают ли значения CSRF запроса.

Поскольку конфиденциальные данные моего приложения всегда передаются в POST, я изменил правило, чтобы оно учитывало только POST-запрос.

в вышеуказанном файле изменить:

SecRule &ARGS "@ge 1" "chain,phase:2,id:'981143'

to:

SecRule &ARGS_POST "@ge 1" "chain,phase:2,id:'981143'

Или создайте заново как пользовательское правило, чтобы не потерять эти изменения обновления.

person maozx    schedule 12.09.2017