Провожу некоторое тестирование на сайте, над которым я работаю (без имени / домена в настоящее время, который подлежит уточнению). Я могу нормально обрабатывать ресурсы HTTP GET, хотя ModSecurity выдает предупреждения о том, что мое имя хоста запроса было только IP-адресом (сейчас это нормально для меня) в его журналах. Однако, когда я отправляю POST в один из своих API, вызов отклоняется с ошибкой 403.
Вот журналы из GET, который проходит нормально:
---Pbu5LkoC---A-- [27/Feb/2020:13:42:43 -0500] 158282896311.830075 666.777.888.999 50044 127.0.1.1 80
---Pbu5LkoC---B-- GET /search/index.php HTTP/1.1 Host: 111.222.333.444 Connection: keep-alive DNT: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36 Cookie: PHPSESSID=rh6d0bj6anskfs8r36nvhraugj Upgrade-Insecure-Requests: 1 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.9
---Pbu5LkoC---D--
---Pbu5LkoC---F-- HTTP/1.1 200 Expires: Thu, 19 Nov 1981 08:52:00 GMT Expires: Thu, 19 Nov 1981 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate Cache-Control: no-store, no-cache, must-revalidate Pragma: no-cache Pragma: no-cache Vary: Accept-Encoding Content-Encoding: gzip
---Pbu5LkoC---H-- ModSecurity: Warning. Matched "Operator `Rx' with parameter `^[\d.:]+$' against variable `REQUEST_HEADERS:Host' (Value: `111.222.333.444' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "689"] [id "920350"] [rev ""] [msg "Host header is a numeric IP address"] [data "111.222.333.444"] [severity "4"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [hostname "127.0.1.1"] [uri "/search/index.php"] [unique_id "158282896311.830075"] [ref "o0,14v39,14"]
---Pbu5LkoC---I--
---Pbu5LkoC---J--
---Pbu5LkoC---Z--
Вот журналы HTTP POST, который получил 403:
---68BxZr28---A--
[27/Feb/2020:13:42:45 -0500] 158282896539.858421 666.777.888.999 50044 127.0.1.1 80
---68BxZr28---B--
POST /search/api/api_login.php HTTP/1.1
Referer: http://111.222.333.444/search/index.php
Origin: http://111.222.333.444
DNT: 1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36
Accept: application/json, text/javascript, */*; q=0.01
Content-Length: 31
Connection: keep-alive
Host: 111.222.333.444
Accept-Encoding: gzip, deflate
Cookie: PHPSESSID=rh6d0bj6anskfs8r36nvhraugj
Accept-Language: en-US,en;q=0.9
---68BxZr28---D--
---68BxZr28---F--
HTTP/1.1 403
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
---68BxZr28---H--
ModSecurity: Warning. Matched "Operator `Rx' with parameter `^[\d.:]+$' against variable `REQUEST_HEADERS:Host' (Value: `111.222.333.444' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "689"] [id "920350"] [rev ""] [msg "Host header is a numeric IP address"] [data "111.222.333.444"] [severity "4"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [hostname "127.0.1.1"] [uri "/search/api/api_login.php"] [unique_id "158282896539.858421"] [ref "o0,14v48,14"]
ModSecurity: Warning. Matched "Operator `Rx' with parameter `^[\d.:]+$' against variable `REQUEST_HEADERS:Host' (Value: `111.222.333.444' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-920-PROTOCOL-ENFORCEMENT.conf"] [line "689"] [id "920350"] [rev ""] [msg "Host header is a numeric IP address"] [data "111.222.333.444"] [severity "4"] [ver "OWASP_CRS/3.2.0"] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-protocol"] [tag "paranoia-level/1"] [tag "OWASP_CRS"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/IP_HOST"] [tag "WASCTC/WASC-21"] [tag "OWASP_TOP_10/A7"] [tag "PCI/6.5.10"] [hostname "127.0.1.1"] [uri "/search/api/api_login.php"] [unique_id "158282896539.858421"] [ref "o0,14v48,14"]
ModSecurity: Access denied with code 403 (phase 2). Matched "Operator `Ge' with parameter `5' against variable `TX:ANOMALY_SCORE' (Value: `9' ) [file "/etc/apache2/modsecurity.d/owasp-crs/rules/REQUEST-949-BLOCKING-EVALUATION.conf"] [line "79"] [id "949110"] [rev ""] [msg "Inbound Anomaly Score Exceeded (Total Score: 9)"] [data ""] [severity "2"] [ver ""] [maturity "0"] [accuracy "0"] [tag "application-multi"] [tag "language-multi"] [tag "platform-multi"] [tag "attack-generic"] [hostname "127.0.1.1"] [uri "/search/api/api_login.php"] [unique_id "158282896539.858421"] [ref ""]
---68BxZr28---I--
---68BxZr28---J--
---68BxZr28---Z--
Вы можете видеть, что POST попадает с тем же правилом 2 раза. Я предполагаю, что оценка накапливается против «обоих» этих попаданий и поднимает его выше некоторого порога, который превращает его в 403.
Есть идеи, почему GET и POST обрабатываются по-разному? Здесь нет никаких 301-х или чего-то еще.
Очевидно, это не будет проблемой, когда я перейду к производству с FQDNS, но я бы предпочел понять, почему это проблема и как работает ModSecurity (или если у меня есть ошибка конфигурации), если другие проблемы всплывают в тем временем.
Спасибо!