내부 재작성(index.php, app.php 등)이 아닌 원래 브라우저 URL을 기반으로 하는 ModSecurity SecRule

내부 재작성(index.php, app.php 등)이 아닌 원래 브라우저 URL을 기반으로 하는 ModSecurity SecRule

저는 Symfony 2 사이트에서 작업 중이며 특정 브라우저 URL과 일치하는 ModSecurity 규칙을 생성하려고 합니다. IE example.com/results

Symfony 2는 .htaccess의 규칙을 사용하여 app.php에 대한 모든 요청을 내부적으로 다시 작성하므로 ModSecurity 규칙에서 REQUEST_URI를 확인하면 app.php로 설정됩니다. 관련된 것으로 보이는 다른 서버 매개변수를 시도했지만 모두 app.php이거나 비어 있습니다.

내부 재작성 결과가 아닌 브라우저에서 요청한 URL을 기반으로 구성 파일에 ModSecurity 규칙을 생성할 수 있는 방법이 있습니까?

wordpress와 같은 CMS에도 동일한 문제가 존재하는 것 같습니다. 모든 것이 index.php에 다시 작성되므로 특정 경로에 modsec 규칙을 적용할 방법을 찾을 수 없습니다. (WP는 너무 흔해서 거기에서 같은 문제를 검색하면 답을 찾을 수 있을 거라고 생각했습니다.)

답변1

THE_REQUEST이 답변에 따라 서버 변수를 사용할 수 있는 것 같습니다 .https://stackoverflow.com/a/27968463/160565

:

나는 mod_rewrite를 사용하여 THE_REQUESTmod_security 규칙 바로 위의 환경 변수에 덤프한 다음 일치시킵니다.

언급한 대로 THE_REQUESTmod_security 변수가 아닌 mod_rewrite에서 사용하는 Apache 서버 변수입니다. mod_security에서 직접적으로 동등한 변수는 입니다 REQUEST_LINE. 요청의 첫 번째 줄. 이는 다음과 같은 문자열 형식을 취합니다.

GET /foo/bar HTTP/1.1

THE_REQUEST(mod_rewrite) 변수는 URL이 다시 작성될 때 변경되지 않지만 REQUEST_URI(mod_rewrite)는 변경됩니다.

그러나 (mod_security) 변수가 다시 작성된 URL을 반환한다는 사실에 조금 놀랐습니다. REQUEST_URI(아마도 이는 지시문의 순서 또는 mod_security 사용과 관련이 있을 수 있습니다.임베디드REQUEST_URI?), mod_security 규칙에서 실제로 (mod_rewrite) 변수(이를 env var?에 할당)를 사용하지 않는 한 원래 요청한 URL 대신 ?

mod_security 규칙 바로 위...

mod_security 규칙은 파일 상단(아직은 아니더라도 mod_rewrite 지시어 앞)에 있어야 합니다. (순서가 정말 중요한지는 잘 모르겠습니다.)

(mod_security) 변수 는 이름이 동일함에도 불구하고 (mod_rewrite) 변수 REQUEST_URI와 동일하지 않습니다 . REQUEST_URI특히 REQUEST_URI(mod_security)에는 쿼리 문자열이 포함되어 있지만 REQUEST_URI(mod_rewrite)에는 포함되어 있지 않습니다.

참조:


업데이트:

... REQUEST_URI(mod_security) 변수는 다시 작성된 URL을 반환합니다.

요청에서 mod_security 규칙을 너무 늦게 실행했을 수 있습니다. 잘못됐어 phase? 처리하려면요청됨REQUEST_URI두 가지 중 하나에서 비교해야 하는 URL단계1 또는 2(요청). 이후 단계(예: 3 - 5)에서는 요청한 URL이 아닌 다시 작성된 URL이 표시되는 이유를 설명할 수 있는 응답을 처리합니다.

phase는 에 설정되어 있습니다 .행동인수 또는 SetDefaultAction지시어. 예를 들어:

SecDefaultAction "log,pass,phase:2,id:4"
SecRule REQUEST_URI "attack" "phase:1,id:52,t:none,t:urlDecode,t:lowercase,t:normalizePath"

5단계는 다음과 같습니다.

  1. 요청 헤더(REQUEST_HEADERS)
  2. 요청 본문(REQUEST_BODY)
  3. 응답 헤더(RESPONSE_HEADERS)
  4. 응답 본문(RESPONSE_BODY)
  5. 로깅(LOGGING)

ModSecurity 버전 v2.7부터 일부 단계 번호에 대한 별칭이 있습니다.

2 - 요청
4 - 응답
5 - 로깅

예:

SecRule REQUEST_HEADERS:User-Agent "Test" "phase:request,log,deny,id:127"

참조:

답변2

이 답변에 따라 서버 변수 THE_REQUEST를 사용할 수 있는 것 같습니다.https://stackoverflow.com/a/27968463/160565

관련 정보