mod_security LocationMatch

Apache, Lighttpd, nginx, Cherokee
cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

mod_security LocationMatch

Post by cirox »

Hallo,

irgendie ist mir folgendes unklar. Ich habe die gotroot Rules und möchte jetzt per "LocationMatch" für einen bestimmten vhost eine Regel, die zuvor angeschlagen hat ausschließen

Hier das Problem:

Code: Select all

==dd35fa36==============================
Request: example.com 91.0.88.xxx - - [18/Apr/2007:10:20:21 +0200] "POST /newreply.php?do=postreply&t=13 HTTP/1.1" 200 0 "http://example.com/newreply.php?do=postreply&t=13" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)" wd9NElUKxY8AACawUlMAAAAR "-"
Handler: fcgid-script
----------------------------------------
POST /newreply.php?do=postreply&t=13 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://example.com/newreply.php?do=postreply&t=13
Accept-Language: de
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.1.4322)
Host: example.com
Content-Length: 562
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: vblastvisit=1160640450; vblastactivity=0; vb3_lastvisit=1160767645; vb3_lastactivity=0; vb3_userid=6; vb3_password=cc30d26714e50394e85d332c20886f74; vb3_forumpwd=a554eff09b878fba91ab6e280c636d88a-4-%7Bi-164_s-32-.fc7d6804b3f6619af0cff8fa3ff8434e._i-78_s-32-.4f26f1ec7006aa0efdb59b319e41d761._i-39_s-32-.22a465c7c6146799a24324d4e28634e4._i-57_s-32-.f0026f0c01de9be64933ec949ccb1702._%7D; vb3_styleid=7; vb3_sessionhash=41d67a1ea19f183040ea8b1c1e1c3a6e
mod_security-message: Warning. Pattern match "!/imp/login\.php" at HEADER("Referer") [id "300018"] [rev "3"] [msg "Generic PHP code injection protection via ARGS"] [severity "CRITICAL"]

562
title=&message=habs mal weg editiert

HTTP/1.0 301
Cache-Control: private
Pragma: private
Location: http://example.com/showthread.php?p=55266#post55266
Connection: close
Content-Type: text/html; charset=ISO-8859-1
--dd35fa36--
Für mich heisst das die Regel "300018" schlägt an und das bei Aufruf folgender Location: http://example.com/newreply.php?do=postreply&t=13

Jetzt bau ich mir folgendes in die exclude.conf:

Code: Select all

<LocationMatch "/newreply.php?do=postreply&t=.*">
SecFilterRemove 300018
</LocationMatch>
Also hab ich ".*" gesetzt hintendran, damit ist ja wohl jedes beliebige Zeichen danach in egal welcher Länge gemeint ....


Trotzdem funktioniert das nicht so. Die Regel schlägt immer noch an. Jetzt ist "/newreply.php......" im vhost nicht unter halb von root, in dem Fall /html/ sondern unter /html/forum. Heisst das der akzeptiert jetzt den Pfad davor nicht? Also gehört da ein Punkt davor? Oder was könnte das Problem sein?

./newreply.php

gruß cirox

Roger Wilco
Administrator
Administrator
Posts: 5923
Joined: 2004-05-23 12:53

Re: mod_security LocationMatch

Post by Roger Wilco »

Die Parameter ("?do=postreply&t=.*") können in LocationMatch nicht verglichen werden.

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

ah ok thx, dann:

Code: Select all

<LocationMatch "/newreply.php.*">
SecFilterRemove 300018
</LocationMatch>

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

Roger Wilco wrote:Die Parameter ("?do=postreply&t=.*") können in LocationMatch nicht verglichen werden.
genau das ist aber mein Problem bei weiteren Excludes, die ich einbauen muss. Wo kann ich nachlesen etc. wann man bei LocationMatch nimmt:

Code: Select all

"index.php"

Code: Select all

"/index.php?name=PNphpBB2&file=posting&mode=reply.*"

Code: Select all

"/modules.php?op=modload&name=Downloads.*"
oder zum Beipiel:

Code: Select all

"/forum/posting.php?mode=.*"
nimmt. So sehr ich mich auch anstrenge, ich find dazu einfach nichts erklärt. Ich will vermeiden, dass ich zu Allgemeine Excludes erstelle. Also alles nach dem Schema:

Code: Select all

"index.php"
oder:

Code: Select all

"/typo3/"
Auch ist mir nicht richtig klar, bei den Excludes, wann ich den Pfad hinter "Get", hinter "Post" oder nach der Domain hinter "Referrer" nehmen soll.

Und vielleicht die wichtigste Frage:

Kann man einen Query String unter mod_sec mit der LocationMatch Direktive vergleichen? Sollte das nicht gehen und mir scheint es fast so, was ist dann das da? Nach dem "?" kommt ja wohl der Query String:

Code: Select all

"/index.php?name=PNphpBB2&file=posting&mode=reply.*"
gruß cirox

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Code: Select all

<Location /newreply.php>
    SecFilterInheritance Off
    # other filters here ...
    # SecFilterSelective "ARGS|!ARG_body" "!/imp/login\.php" "allow"
     SecFilterSelective ARG_authorised "!/imp/login\.php" 
</Location>
Bei mir sehen die Exclude Rules in etwa so aus. Dabei ist <Location / das Docroot Verzeichnis der Domains. Wildcards sind auch möglich. So lässt sich mit <Location /Verzeichnis/* ein Rule für ein Verzeichnis und dessen Unterverzeichnisse ausser Kraft setzen. Die Variante mit "allow" schreibt die Aktion ins Logfile.
Hinter GET oder POST ist der Querystring und der Pfad, welcher für die Rules relevant ist.
Last edited by danu on 2007-04-20 20:42, edited 1 time in total.

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

ok, du arbeitestest also ohne Query String. Also auch ganz Allgemein. Bloss wundert mich halt warum manchmal ein Query String funtioniert und manchmal nicht.

Bloss das Du Rules der 1. Phase denien lässt und nur der 2. Phase ausschaltest. Außerdem sagst Du QUERY_STRING + POST_PAYLOAD ist mit allen Zeichen erlaubt.

hm, auch nicht schlecht :) Jetzt fragt sich bloss was Phase 1 und Phase 2 Rules bei mod_sec 1.x sind und wenn dann müsste eigentlich meine Variante ja noch mehr Rules beinhalten die angefragt werden, also schützen, da ich ja versuche nur einzelne Rules zu deaktivieren.

Hier mal nen ganz akutes Problem:

Code: Select all

Request: www.example.com 88.130.118.xx - - [20/Apr/2007:20:32:02 +0200] "POST /index.php?option=logout HTTP/1.1" 403 1107 "http://www.www.example.com/index.php?option=com_frontpage&Itemid=1" "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3" - "-"
Handler: type-map
----------------------------------------
POST /index.php?option=logout HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
X-McProxyFilter: ************
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.www.example.com/index.php?option=com_frontpage&Itemid=1
Cookie: __utmz=162198565.1170864577.1.1.utmccn=(direct)|utmcsr=(direct)|utmcmd=(none); __utma=162198565.1366469709.1170864577.1177000657.1177093855.76; JATheme=ja_antares; ColorCSS=green; FontSize=3; ScreenType=wide; 5f0378bad9f60be2d21d3fc893e3ce11=62a7d4c8cc12503eccb8fa971b6b5d1d; __utmb=162198565; __utmc=162198565; web45_SID=t7jcd7occmc2rt2o0reaod3tl0
Content-Type: application/x-www-form-urlencoded
Content-Length: 151
mod_security-action: 403
mod_security-message: Access denied with code 403. Pattern match "!/imp/login\.php" at HEADER("Referer") [id "300018"] [rev "3"] [msg "Generic PHP code injection protection via ARGS"] [severity "CRITICAL"]

151
Submit=Abmelden&option=logout&op2=logout&lang=german&return=http%3A%2F%2Fwww.www.example.com%2Findex.php%3Foption%3Dcom_frontpage%26Itemid%3D1&message=0

HTTP/1.1 403 Forbidden
Vary: accept-language,accept-charset
Accept-Ranges: bytes
Keep-Alive: timeout=15, max=82
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1
Content-Language: de
--c3f87468--
Hab schon alles probiert. Da muss ich ja wohl jetzt die "index.php" nehmen und Rule 3000018, bloss damit schalt ich ja alles aus (index.php ?), egal ob nach deiner Methode oder die oben beschriebene.

Hast Du ne Idee?

Ungern möchte ich das vhost spezifisch machen. Bloss wird wohl doch das beste sein. Wahrscheinlich spinnt auch wieder der "SecFilterScanPOST"

Man man ist das schwierig ....

gruß cirox

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Code: Select all

<Location /index.php> 
    SecFilterInheritance Off 
    # other filters here ... 
    # SecFilterSelective "ARGS|!ARG_body" "!/imp/login\.php" "allow" 
     SecFilterSelective ARG_authorised "!/imp/login\.php" 
</Location>
Müsste doch jetzt so funktionieren ?
ok, du arbeitestest also ohne Query String.
Natürlich nicht.der Query String ist das ganze http://www ... mit alllem was daran hängt.
Last edited by danu on 2007-04-20 20:51, edited 1 time in total.

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

Ja ja aber ich setze damit den ganzen Filter für jegliche index.php ausser Kraft .....

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Ja ja aber ich setze damit den ganzen Filter für jegliche index.php ausser Kraft, oder ?
Nein, nur diese index.php bei welchen das Rule mit

Code: Select all

"!/imp/login\.php"
zutrifft.

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

ok,

also query string ist doch:

Code: Select all

?species=seagull
Ja dann nehm ich aber glaub ich doch die Variante mit dem vhost. Damit schütz ich jedenfalls die anderen index.php. Irgendwie hab ich bei ner Firewallkonfiguration immer die Gedanken, dass ich mir grosse Lücken reinhaue.

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Nee. Ein einfaches "http://www.google.com" ist ebenfalls ein Query String.

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

Nein, also das seh ich aber nicht so. Mir gings ja auch im LocationMatch -> und wird der Query String akzeptiert oder nicht ..... Aber mal was anderes :)

Mit Deiner Regel setzt Du durch:

Code: Select all

SecFilterInheritance Off 
doch alle Regeln vorher ausser Kraft. Kein Wunder, das das bei Dir dann immer funktioniert. Leider heisst es mal in der Doku nur Phase 1 Rules, anderswo heisst es alle Rules vorher ausser Kraft setzen und mit einem neuen Filtersatz anfangen.

Ich denke man müsste hier ganz anders ansetzen. Es handelt sich um folgendes Rule:

Code: Select all

#really broad furl_fopen attack sig
#tune this for your system
SecFilterSelective REQUEST_URI "!(/tiki-objectpermissions|aardvarkts/install/index|/do_command|banner_click|wp-login|tiki-view_cache|/horde/index|/horde/services/go|/goto|gallery2?/main|ad-?server/adjs)" "chain,id:300018,rev:3,severity:2,msg:'Generic PHP code injection protection via ARGS'"
SecFilterSelective REQUEST_URI ".php(3|4|5)?(?|&)" chain
SecFilterSelective ARGS "(ht|f)tps?:/"  chain
SecFilterSelective HTTP_Referer "!/imp/login.php"
SecFilterSelective REQUEST_URI "!(/tiki-objectpermissions|aardvarkts/install/index|/do_command|banner_click|wp-login|tiki-view_cache|/horde/index|/horde/services/go|/goto|gallery2?/main|ad-?server/adjs)" "chain,id:300040,rev:1,severity:2,msg:'Generic PHP code injection protection in URI'"
SecFilterSelective REQUEST_URI ".php(3|4|5)?(?|&).*=(ht|f)tps?:/"  chain
SecFilterSelective HTTP_Referer "!/imp/login.php"
Im Prinzip verhindert das wohl, das Einschleusen vom fremden Code über eine URL?
Da steht ja auch "tune this for your system". Wenn ich also für "index.php" das ausser Kraft setze ist das wohl doch nicht der richtige Weg. Man müsste hier also in folgender Zeile was ergänzen:

Code: Select all

SecFilterSelective REQUEST_URI "!(/tiki-objectpermissions|aardvarkts/install/index|/do_command|banner_click|wp-login|tiki-view_cache|/horde/index|/horde/services/go|/goto|gallery2?/main|ad-?server/adjs)"
Bloss wie man hier sieht gelten doch die Exeptions (!), oder ist das falsch?, nur für entsprechende Pfade. Ich hab es aber mit einem Aufruf zu tun, der direkt über eine index.php erfolgt. Demzufolge kann ich nichts pfadspezifisch setzen. Richtig? Also muss ich wohl oder übel doch wieder alles für index.php freischalten, was dieses Rule betrifft.

Man kann aber entsprechendes in der php.ini nicht erlauben und durch Suhosin ist man ja auch geschützt was folgendes betrifft, oder ?

Code: Select all

; Whether to allow the treatment of URLs (like http:// or ftp://) as files.
allow_url_fopen = On

; Whether to allow include/require to open URLs (like http:// or ftp://) as files.
allow_url_include = Off
Hier sowas verhindert diese Regel im Übrigen. Den Link brauch ich glaub ich nicht näher erklären :)

Code: Select all

//includes/kb_constants.php?module_root_path=http://black_mal_editiert.de/test/templates/hm_yaml_2_5/css/modifications/freeman.txt?
gruss cirox

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Ja langsam frage ich mich, ob wir hier nicht gewaltig aneinander vorbei reden. Bei mir läuft noch mod_security

Code: Select all

# ModSecurity Rules Project
# (http://www.modsecurity.org/projects/rules/)
#
# $Id: modsecurity-hardening.conf,v 1.1.1.1 2006/01/03 13:52:16 ivanr Exp $
#
# Copyright (C) 2005,2006 Thinking Stone (http://www.thinkingstone.com).
Dazu verwende ich ein massiv abgespecktes Ruleset aus oben eingeblendeter URL. Schliesslich wollte ich auch nicht den Apache mit allerhand nicht notwendigem auszubremsen. Bei mod_security sind verschiedene Ruleset -Architekturen möglich. Wenn ich mir die Dokus von mod_security2 durchlese, sehe ich, dass der Gestaltung eines Rulesets keine Grenzen gesetzt sind.
In Regex bin ich eine Niete, aber ich weiss, was mod_security machen muss.
Mein 2Phasen Prinzip läuft auf das hinaus: Zuerst "alles" verbieten und hinterher in einer 8kb Datei alle "exclude" Rules. Schliesslich checke ich täglich die Logfiles.
Auf Gästebücher kann zugegriffen, aber nicht zugespammt werden, Webseiten können nicht defaced werden, bösartige Scripts auf Webseiten konnten schon installiert, aber nicht ausgeführt werden :D , da waren aber fahrlässige Passwörter die Ursache.
mod_security ist wirklich eine gute Sache, aber schlussendlich ist es immer moch der Apache, der das Sagen hat.
Gruss, Danu

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

Also bei mir läuft mod-security_1.9.4-2_i386.deb

Klick


Nun gut wie dem auch sei, ich seh mod_security auch als Riesenvorteil. Selbst mit den got-root rules, und keiner blackips.conf läuft das Ganze recht gut mit ein paar excludes und wenige Regeln deaktiert. Vorher hatte ich glaub ich deine abgespeckten Regeln :)

Aber mir gehts wirklich um folgende Sache. Ich hab schon die ganze Doku durch und die Mailingliste + got-root Forum

Was kann in einer LocationMatch Direktive stehen?

Warum funktioniert nicht:

Code: Select all

<LocationMatch "/newreply.php?do=postreply&t=.*">
SecFilterRemove 300018
</LocationMatch>
aber:

Code: Select all

#PhpBB posting
<LocationMatch "/index.php?name=PNphpBB2&file=posting&mode=reply.*">
SecFilterRemove 300013
</LocationMatch>
Das war zwar richtig, danke:
Roger Wilco wrote:Die Parameter ("?do=postreply&t=.*") können in LocationMatch nicht verglichen werden.
Aber ich versteh leider den Sinn nicht. Und das Schlimme daran. Ich find auch keine Doku oder nen Ansatz, wie man sowas rausbekommt.

gruß cirox

cirox
Posts: 212
Joined: 2006-05-08 23:20
Location: Berlin

Re: mod_security LocationMatch

Post by cirox »

Du nimmst also die Core Rules .... . Ich überlege auch langsam, ob es nicht besser ist auf die Version 2 zu schwenken, die offiziellen Core Rules zu nehmen und sich im Allgemeinen an die offizielle Mailingliste zu wenden. Letzten Endes sind dort die Entwickler und die wissen wohl am besten was Phase ist. Zusätzlich ist die Mailingliste um einiges mehr frequentiert als die got-root Liste.

Allerdings müsste ich bei der Version 2 nochmal komplett von vorne anfangen mit den excludes und vorher als ungeschützt im Log Betrieb laufen lassen ....

Mit dem einem Rule was weiter oben gepostet ist hab ich eh nur Probleme. Habs in der Zwischenzeit völlig deaktiviert. Mit dem Ergebis, dass die Gästebücher wieder zugespamt werden. Leider kann ich auch keine excludes für dieses Rule machen, da im Produktivbetrieb ich mir solche vielen false postives nicht leisten kann. Auch nicht wenn ich einmal am Tag die Logs durchschaue. Mal davon abgesehen, dass ich immer noch keinen Plan über das richtige einsetzen der LocationMatch Direktive habe. Anscheinend können hier manche Parameter verglichen werden, manche nicht. Wie das für Verzeichnisse und einfache Datein funktioniert ist mir aber klar.

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Ja.Die Core Rules sind noch einigermassen übersichtlich und mit meiner Exclude Strategie bin ich bis jetzt gut gefahren. Es sprich auch nicht viel dagegen die Version 1.xx weiter zu benutzen und diese in den Griff zu kriegen.Für false positivs sind vorallem Anwendungen wie phpBB, Chats, Mambo, WordPress, Horde und dergleichen heikel. Aber da musste ich auch durch. Da reichte es nicht, die Logfiles (modsec_audit.log) 1x pro Tag durchzusehen. Da sass ich schon 1-2 Tage vor der Kiste und konnte dafür innert Minuten reagieren und allfälligen Reklamationen von Kunden zuvorkommen.

Anonymous

Re: mod_security LocationMatch

Post by Anonymous »

Hi,

wo speichert man die "exclude.conf" ab, damit die Regel nur eine bestimmte Domain betrifft?, denn wenn ich z.B.: die Regel:

Code: Select all

<LocationMatch "/">
SecFilterRemove 300018
</LocationMatch> 
zusammen mit anderen gotroot, oder modsecurity.org rules abspeichere, die bekanntlich für den ganzen Server gelten, setze ich für alle V-Hosts die Regel: "300018" aus, oder täusche ich mich da???

Sorry, sollte ich was missverstanden haben...

thx,
JamesG

danu
Posts: 263
Joined: 2005-02-02 11:15

Re: mod_security LocationMatch

Post by danu »

Das müsstest Du anhand des Logfiles herausfinden können. Aber ich denke, dass das nicht so funktioniert.

Code: Select all

<LocationMatch "/"> 
SecFilterRemove 300018 
</LocationMatch>
Aber so ganz bestimmt

Code: Select all

<LocationMatch "/irgendeinscript.php"> 
SecFilterRemove 300018 
</LocationMatch>
Dabei zeigt Dir das Logfile 1:1 "/irgendeinscript.php" an, was Du in <LocationMatch "/... eintragen musst, um ein "false positiv" zu eliminieren.
Du willst, dass für alle Domains die gleichen Rules gültig sind,aber entscheiden musst Du, welche Scripts/Requests Du zulassen willst.