Problem mit Apache 2.2 und mod_rewrite

Mario

Registered User
Hallo SSF Gemeinde

Ich habe ein Problem mit mod_rewrite, sehe aber vermutlich den Wald vor lauter Bäumen nicht. ;) Leider habe ich auch noch nichts hier im Forum bzw. in der Apache Dokumentation zum meinem Problem finden können.

Ursprüngliches Problem:
Ich hatte vor fast 2 Monaten festgestellt, das immer wieder (Sinnlos-)Requests mit derselben Session ID von recht ominösen IP Adressen gegen ein von mir mit betreutes Forum abgesetzt werden. Die IP Adressen stufe ich deshalb als ominös ein, da es ich um Adressen aus Russland, China, Niederlanden und diversen anderen Ländern handelt, wo ich persönlich SPAM Netzwerke dahinter vermute. Außerdem wurden die ca. 20000+ Requests (allein in einem Monat) alle mit denselben Parametern abgesetzt. Unter anderem wurde auch immer dieselbe Session ID verwendet. Und das war mein Ansatz. Anstatt jede der IP Adressen einzeln per mod_rewrite oder auch per Deny zu blocken, habe ich eine Rewrite Regel in die .htaccess Datei eingefügt, die auf diese Session ID im QUERY_STRING prüft und bei vorhandensein einfach ein Forbidden zurückgibt. Das Funktionieren dieser Regel habe ich auch sehr schön im Access Log des Apachen verfolgen können, da die Requests alle mit einem 403 Status beantwortet wurden. Das funktioniert auch nach wir vor. Diverse Tests mit wget waren ebenso erfolgreich.

Neues Problem:
Waren es ursprünglich ausschließlich GET Requests, kommen mittlerweile von einigen der bereits bekannten IP Adressen POST Requests, wieder mit denselben Parametern. Erstmal eigentlich nichts schlimmes. Leider musste ich jetzt feststellen, das die POST Requests aber nicht abgeblockt werden, sondern brav mit einem 200 Status beantwortet werden. Leider kann ich das RewriteLog nicht einschalten, da das Forum auf Webspace liegt, ich also nicht an die vhost Definition ran komme wo ich das Logging einschalten könnte.

Seht ihr einen Fehler in der angewandten Regel (s.u.)?
Werden GET und POST Request von mod_rewrite unterschiedlich behandelt?

Umgebung:
Debian 5
Apache 2.2.x

.htaccess Datei:
Code:
RewriteEngine ON
#force use of www.
RewriteCond %{HTTP_HOST}	!^www\.irgendeinforum\.com [NC]
RewriteRule ^(.*)         	http://www.irgendeinforum.com/$1 [R=301]
#block bad requests
RewriteCond %{QUERY_STRING} .*sid=138ba379397ca680ba72c0b54f59da27.* [NC]
RewriteRule ^.* - [F,L]

Ausschnitt Logdatei, Wirksamkeit der Regel bei GET:
Code:
...
89.xxx.xxx.xxx - - [01/Nov/2009:01:27:47 +0100] "GET /irgendeine.php?action=kommentar_abgeben&id=17&sid=138ba379397ca680ba72c0b54f59da27 HTTP/1.1" 403 214 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
...

Ausschnitt Logdatei, Unwirksamkeit der Regel bei POST:
Code:
...
94.xxx.xxx.xxx - - [12/Oct/2009:01:37:15 +0200] "POST /irgendeine.php HTTP/1.1" 200 13082 "http://www.irgendeinforum.com/irgendeine.php?action=kommentar_abgeben&id=17&sid=138ba379397ca680ba72c0b54f59da27" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
...

Sollten noch wichtige Informationen Informationen fehlen, bitte sagen.
Danke für eure Anregungen/Tips. :)
 
Moin,
schau doch mal, ob du eine Rewrite-Condition zusätzlich unterbringst.

Code:
#block bad requests
RewriteCond %{QUERY_STRING} .*sid=138ba379397ca680ba72c0b54f59da27.* [NC]
[B]RewriteCond %{REQUEST_METHOD} ^POST$[/B]
RewriteRule ^.* - [F,L]

Ansonsten kann man auch leicht ganze Netze aussperren.

Code:
SetEnvIf Remote_Addr "192\.1[6-8]\.[0-9]+\.[0-9]+"  isspamhost=yes
order deny,allow
deny from env=isspamhost
Dazu braucht der Apache2 allerdings das mod_setenvif.

Besten Gruss! :)
 
Dass bei der HTTP-Methode POST die Variable sid nicht im QUERY_STRING sondern im Body der Anfrage steht, ist euch klar, oder? Das sieht man u. a. auch schön an den Logausschnitten. Vergleicht einfach mal den Logeintrag von einer Anfrage via GET und einer Anfrage via POST.

Code:
SetEnvIf Remote_Addr "192\.1[6-8]\.[0-9]+\.[0-9]+"  isspamhost=yes
order deny,allow
deny from env=isspamhost
Dazu braucht der Apache2 allerdings das mod_setenvif.
Mein Apache httpd™ kann das auch ohne mod_setenvif:
Code:
Order Deny,Allow
Deny from 192.168.0.0/16
 
Frei nach dem Motto "Probieren geht über studieren".
Das da was nicht passt hab ich mir schon gedacht - vielleicht war es doch schon zu spät. :cool:
Darum auch die Alternative das Netz auszusperren.
Mit mod_setenvif hat man die Möglichkeit regular expressions anzuwenden.

Was würde hier dann noch helfen? Im Grunde könnnte man mit mod_security den payload des POST-Requests auswerten.
Bleibt die Frage ob das mod_security am Host aktiviert wurde.
 
Mit mod_setenvif hat man die Möglichkeit regular expressions anzuwenden.
Das ist bei Matches gegen den UserAgent-String vielleicht ganz sinnvoll, aber bei Prüfungen von IP-Adressen bzw. Subnetzen ist die Prüfung gegen einen RegEx unnötiger Overhead. Zumal ich solche Aktionen wenn möglich in einem dem System vorgeschalteten Paketfilter durchführen würde.
 
Danke für eure Anregungen.

Das mit den IP Adressen sperren per Allow/Deny bzw. SetEnvIf ist mir schon klar. Wären es nur ein paar IP Adressen, wäre das sicherlich eine Möglichkeit die ich nutzen würde. Da es aber mehrere sind, aktuell 25+ (auch aus verschiedenen Netzen), ist die Rewrite Variante natürlich effizienter, zumal die Requests immer mit derselben URL und dazugehörigen Parametern daher kommen.

Den Hinweis den ich gebraucht habe ist der, das bei POST Requests die Parameter für den Request nicht im QUERY_STRING stehen, hab ich nicht wirklich dran gedacht ... Danke. :)

Dann wäre wohl für die POST Requests THE_REQUEST die richtige Wahl, denn eine andere Servervariable gibt es in der Apache Doku (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html) nicht, die in diese Richtung geht.
 
Last edited by a moderator:
Das ist schade, wird mir wohl doch nur das Sperren der IP Adressen per mod_rewrite bzw allow/deny bleiben. Zumindest die, die mit nem POST Request kommen. Danke nochmal für eure Hinweise. :)
 
Back
Top