2016-08-03 9 views
0

알 수없는 이름의 인수에 대해 값과 일치하는 ModSecurity 허용 목록을 설정하려고합니다. 예를 들어 타임 스탬프 인 모든 매개 변수 (예 : timestamp=2016-01-01 00:00:00)를 허용하고 싶습니다. 현재이 규칙이 실행됩니다 981173 (Restricted SQL Character Anomaly Detection Alert - Total # of special characters exceeded)ModSecurity : 값으로 화이트리스트 인수

다음은 작동하지만 적어도 하나가 일치하면 모든 매개 변수에 대한 검사를 건너 뛰므로 매개 변수를 https://www.example.com/?timestamp=2016-01-01+00:00:00&badvalue=2016-01-01+00:00:00:00에 포착하지 않습니다.

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \ 
    "id:'99001', phase:1, nolog, pass, t:none, \ 
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;ARGS" 

다음은 매개 변수 이름을 하드 코딩하면 작동합니다.

SecRule ARGS:timestamp "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \ 
    "id:'99001', phase:1, nolog, pass, t:none, \ 
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;ARGS:timestamp" 

나는 다음을 시도했지만 효과가 없습니다.

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \ 
    "id:'99001', phase:1, nolog, pass, t:none, \ 
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;/%{MATCHED_VAR_NAME}/" 

SecRule ARGS "@rx ^2[0-9]{3}-[0-1][0-9]-[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$" \ 
    "id:'99001', phase:1, nolog, pass, t:none, \ 
    ctl:ruleRemoveTargetByTag=OWASP_CRS/WEB_ATTACK/SQL_INJECTION;MATCHED_VAR_NAME" 

ModSecurity를 ​​사용하면 가능합니까? 이 사용 케이스를 위해서 MATCHED_VAR_NAME를 사용할 방법이 있습니까? 타임 스탬프를 포함 할 수있는 모든 인수 이름에 대해 규칙을 추가하지 않아도됩니다.

답변

0

현재 불행히도 ctl 작업 인수 내에서 매크로 확장을 사용할 수 없습니다.

증거는 다음 예를 고려으로 :

SecRule ARGS "@contains bob" "id:1,t:none,pass,ctl:ruleRemoveTargetById=2;ARGS:x" 
SecRule ARGS "@contains hello" "id:2,deny,status:403" 

다음과 같은 요청을 제공하는 'http://localhost/?x=bobhello은'우리가 두 번째 규칙을 평가할 때 디버그 로그에 다음 볼을

[04/8 월 2016 : 00 : 44 : 07 - 0400] [로컬 호스트/시드 # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [4] Recipe : 호출 규칙 55e47ab14638; [파일 "/etc/httpd/modsecurity.d/includeOWASP.conf"] [행 "12"] [id "2"].[localhost/sid # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [5] 규칙 55e47ab14638 : SecRule "ARGS" "@contains hello" "단계 : 2, 로그, 감사 로그, ID : 2, 거부, 상태 : 403 " [04/Aug/2016 : 00 : 44 : 07 - 0400] [localhost/sid # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [4 ] 변환은 0 usec로 완료되었습니다. [localhost/sid # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [9] fetch_target_exception : 발견 된 예외 대상 목록 [ARGS : x] 규칙의 경우 id 2 [04/Aug/2016 : 00 : 44 : 07 - 0400] [localhost/sid # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [9] fetch_target_exception : 대상 ARGS : x는 처리되지 않습니다.[lochost/sid # 55e47aa583e0] [rid # 55e47ad7cb10] [/] [4] 실행중인 연산자가 ARGS에 대해 param "hello"를 포함하고 "contains": x skipped . [/ 8월/2016 04 : 00 : 44 : 07 --0400] [로컬 호스트/SID # 55e47aa583e0] 우리가 제공 할 때 [제거 # 55e47ad7cb10은] [/] [4] 규칙, 0

그러나 반환 (다음과 같이) 동일한 요청 ('http://localhost/?x=bobhello') 동안 우리의 CTL 액션 내에서 매크로 확장을 다음과 같이

SecRule ARGS "@contains bob" "id:1,t:none,pass,ctl:ruleRemoveTargetById=2;%{MATCHED_VAR_NAME}" 
SecRule ARGS "@contains hello" "id:2,deny,status:403" 

우리의 디버그 로그가 나타납니다

[04/8월/2016 : 00 : 44 : 41 - 0400] [로컬 호스트/시드 # 559f82a0b3e0] [제거 # 559f82d2fb50] [/] [5] 규칙 559f82ac76e8 : SecRule "ARGS" "@ "2 단계, 로그, 감사 로그, ID : 2, 거부, 상태 : 403"[04/Aug/2016 : 00 : 44 : 41 - 0400] [localhost/sid # 559f82a0b3e0] [rid # 559f82d2fb50] ] [/] [4] 변환은 0 usec로 완료되었습니다. [localhost/sid # 559f82a0b3e0] [제거] [fetch_target_exception : ] 예외 대상 목록 [% {MATCHED_VAR_NAME}]이 (가) 인 경우 : [04/Aug/2016 : 00 : 44 : 41- ARGS에 대해 param "hello"와 함께 연산자 "contains"를 포함하고 있습니다. [#] [] [] [] [] [] [] [] :엑스. [localhost/sid # 559f82a0b3e0] [rid # 559f82d2fb50] [/] [9] 대상 값 : "bobhello" [04/Aug/2016 : 00] [04/Aug/2016 : 00 : 44 : 41-0400] : 44 : 41 - 0400] [localhost/sid # 559f82a0b3e0] [rid # 559f82d2fb50] [/] [4] 운영자가 2 마이크로 초 안에 완료되었습니다. [/ 8월/2016 04 : 00 : 44 : 41 --0400] [로컬 호스트/SID # 559f82a0b3e0] [제거 # 559f82d2fb50은] [/] [4] 규칙 1.

내가 생각할 수 없다 반환 과도한 오버 헤드없이이 목표를 달성하는 방법. 이 시점에서 가장 좋은 해결책은 문제가되는 각 인수를 수동으로 허용 목록으로 만드는 것입니다.

+0

감사합니다. 나는 단지 각각의 주장을 덧붙였다. –

관련 문제