Modsecurity: удаление пробелов не работает

У меня есть следующее правило:

 SecRule REQUEST_HEADERS:Client-IP "@ipMatchFromFile test.txt" 
"id:210487,t:none,t:urlDecodeUni,t:removeWhitespace,drop,msg:'IP-test'"

Но когда я запускаю его, я получаю ответ:

T (0) urlDecodeUni: "111.22.33.44 " // note the space before the "
T (0) removeWhitespace: "111.22.33.44"  // perfect! The space has been removed
Transformation completed in 4 usec.
Executing operator "ipMatchFromFile" with param "test.txt" against REQUEST_HEADERS:Client-IP.
Target value: "111.22.33.44"  // target value has no space, hooray!
IPmatchFromFile: Total tree entries: 8, ipv4 8 ipv6 0
IPmatch: bad IPv4 specification "111.22.33.44 ".  // why, oh why, is the space back!
Operator completed in 4 usec.
Operator error: IPmatch: bad IPv4 specification "111.22.33.44 ".  // that space again!
Rule returned -1.
Rule processing failed.
Rule failed, not chained -> mode NEXT_RULE.

Пожалуйста, легенды о переполнении стека; подскажите как исправить :-)


person Marcus    schedule 30.05.2017    source источник
comment
Есть ли место в списке в файле test.txt? Преобразование происходит только с аргументом в запросе, с которым сравниваются записи файла, а не с записями в файле.   -  person Barry Pollard    schedule 30.05.2017
comment
В test.txt нет пробелов, а Client-IP является эквивалентом X-Forwarded-For. Что-то вверх по течению добавляет пробел, который нам нужно удалить перед сравнением с test.txt..   -  person Marcus    schedule 30.05.2017


Ответы (1)


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

Поскольку на самом деле это не IP-адрес, вы можете переключиться на использование @pmFromFile, а не @ipMatchFromFile. Обратите внимание, что документация прямо предупреждает, что здесь необходимо правильно использовать границы :

Поскольку этот оператор не проверяет границы при сопоставлении, в некоторых случаях возможны ложные срабатывания. Например, если вы хотите использовать @pm для сопоставления IP-адресов, фраза 1.2.3.4 потенциально будет соответствовать более чем одному IP-адресу (например, она также будет соответствовать 1.2.3.40 или 1.2.3.41). Чтобы избежать ложных срабатываний, вы можете использовать свои собственные границы во фразах. Например, используйте /1.2.3.4/ вместо 1.2.3.4. Затем в своих правилах также добавьте границы, где это уместно. Полный пример вы найдете в примере:

# Prepare custom REMOTE_ADDR variable 
SecAction "phase:1,id:168,nolog,pass,setvar:tx.REMOTE_ADDR=/%{REMOTE_ADDR}/"

# Check if REMOTE_ADDR is blacklisted 
SecRule TX:REMOTE_ADDR "@pmFromFile blacklist.txt" "phase:1,id:169,deny,msg:'Blacklisted IP address'" 

Файл blacklist.txt может содержать:

# ip-blacklist.txt contents:
# NOTE: All IPs must be prefixed/suffixed with "/" as the rules
#   will add in this character as a boundary to ensure
#   the entire IP is matched.
# SecAction "phase:1,id:170,pass,nolog,setvar:tx.remote_addr='/%{REMOTE_ADDR}/'"
/1.2.3.4/ 
/5.6.7.8/
person Barry Pollard    schedule 30.05.2017
comment
Хороший подход. Попробую завтра утром. Спасибо BazzaDP! - person Marcus; 31.05.2017
comment
Спасибо! Это сработало с небольшой поправкой: SecRule TX:REMOTE_ADDR @pmFromFile blacklist.txt фаза:1,id:169,t:removeWhitespace,deny,msg:'IP-адрес из черного списка' - person Marcus; 31.05.2017