• Wer Zugriff auf einen root-Server hat, dem kann ich mod_security in Verbindung mit GotRoot-Rules sehr empfehlen. Dort sind sehr viele sinnvolle Regeln enthalten, die man dann entsprechend für sich nutzen kann.

    und? wird der Schrott jetzt besser?

    PHP
    $request_uri = $_SERVER['REQUEST_URI'];
    $query_string = $_SERVER['QUERY_STRING'];
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    Man vertraut einfach mal den Inhalten von $_SERVER und nimmt diese an.

    PHP
    // request uri
    if (	//strlen($request_uri) > 255 || 
    	stripos($request_uri, 'eval(') ||

    und verwendet die Funktion stripos

    http://uk1.php.net/manual/de/function.stripos.php

    Diese Funktion kann sowohl das boolsche FALSE zurückliefern, als auch einen nicht-boolschen Wert, welcher zu FALSE ausgewertet wird.
    Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.

    Mit offenen Augen träumen

    • Anzeige

    Hallo!

    Wenn du gerade an deiner Website arbeitest oder dein aktuelles Hosting überdenkst: Wir betreiben mit NetzLiving eine Hosting-Plattform, die speziell auf Performance, Sicherheit und einfache Verwaltung ausgelegt ist.

    • ✔️ Schnelle Ladezeiten (optimiert für WordPress & Co.)
    • ✔️ Deutsche Server & DSGVO-konform
    • ✔️ Persönlicher Support (kein 0815-Ticket-System)

    Mehr erfahren

  • Ja das mit stripos ist schon grob fahrlässig.
    Gibt es denn eine alternative zu $_SERVER ?

    Einmal editiert, zuletzt von g3h (13. März 2014 um 16:14)

  • der Apache wird lahm.

    muss nicht, je nachdem, wie viele Regeln man verwendet.

    und? wird der Schrott jetzt besser?

    Welcher Schrott?

    PHP
    $request_uri = $_SERVER['REQUEST_URI'];
    $query_string = $_SERVER['QUERY_STRING'];
    $user_agent = $_SERVER['HTTP_USER_AGENT'];

    Man vertraut einfach mal den Inhalten von $_SERVER und nimmt diese an.

    PHP
    // request uri
    if (    //strlen($request_uri) > 255 || 
        stripos($request_uri, 'eval(') ||

    und verwendet die Funktion stripos

    Galt das jetzt meinem Post?

  • Nein das galt meinem Link, muss falsch zitiert sein.
    Die bessere alternative zu den PHP-Filtern wäre wohl über die htaccess zu gehen ? So wie hier https://secure.rivalhost.com/knowledgebase/…ther-hacks.html ?

    hast du einen osCommerce Shop?

    Code
    [FONT=verdana]RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]

    oder warum möchtest du auf cPath=http:// prüfen... und bist du dir sicher, dass dir ein Angreifer auch kein https:// unterhubelt, wenn du cPath so annimst?

    Dein Vorschlag mit[/FONT] .htaccess ist genauso efektiv wie der von Hille mit dem ModSecurity

    Dabei hat das Apache Modul selbst auch *erhebliche* Probleme

    http://www.golem.de/news/modsecuri…309-101670.html


    [FONT=verdana]


    [/FONT]

    Mit offenen Augen träumen

  • Nein ich habe keinen Shop. Bei dem Beispiel ging es eher um das Prinzip, Urls über die htaccess zu filtern.

    Wenn es also nicht über die htaccess und nicht mit $_SERVER über PHP laufen soll, wie machst du das dann ?

    Einmal editiert, zuletzt von g3h (14. März 2014 um 10:33)

  • Habe ich eigentlich nicht so verstanden. Habe zwar auch noch nicht viel gemacht, doch zum Beispiel genauso wie mit einer rekursiven Funktion die Verzeichnisse durchlaufen werden, um eine XML Sitemap für "normale" HTML-Seiten zu erzeugen, könntest Du bei der Gelegenheit gleich noch nach filemtime sortieren.

    Langsam wird die Angelegenheit erst, wenn dabei viele Dateien noch geöffnet werden sollen, um den Inhalt zu kontrollieren. Da kommen pro 100 Dateien schon einige Sekunden an Laufzeit zusammen. Nur könnte das ja beschränkt werden auf die Dateien, bei denen filetime neuer als die letzte Kontrolle ist.

  • Nein ich habe keinen Shop. Bei dem Beispiel ging es eher um das Prinzip, Urls über die htaccess zu filtern.


    Dann sehen wir uns mal das *Prinzip* an :(

    Apache Configuration
    [FONT=verdana]RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC][/FONT]
    
    
     [FONT=verdana]RewriteRule ^(.*)$ - [F,L][/FONT]
    
    
     [FONT=verdana]

    und ohne Handbuch ist eine Bewertung schwer - aber PUT würde mir hier fehlen. Des weiteren mag ich PHP und in PHP kann ich festlegen, was ich in PHP annehmen möchte. Ein Blick in die PHP.ini hilft da immer.


    [/FONT]
    [FONT=verdana]

    Apache Configuration
    [/FONT]
    
    
     [FONT=verdana]# Block WP timthumb hack[/FONT]
     [FONT=verdana]RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC][/FONT]
     [FONT=verdana]RewriteRule . - [S=1][/FONT]
     [FONT=verdana]

    [/FONT]

    [size=10]Ich verwende timthumb - warum sollte ich es generell verbieten? [/SIZE]


    [FONT=verdana]

    ja - ok ... das Prinzip kann ich verstehen ... würde ich vermutlich in ähnlicher form auch verwenden.[/FONT]
    [FONT=verdana]

    Dieses hat in einem Query-String nichts verloren - dies ist richtig - ABER - der Angriff erfolgt selten über den QueryString. Bzw. in einer Worpdress Umgebung habe ich an den unterschiedlichsten Stellen den Angriff und sehr selten im [/FONT][FONT=verdana]{QUERY_STRING}[/FONT]



    Wenn es also nicht über die htaccess und nicht mit $_SERVER über PHP laufen soll, wie machst du das dann ?

    Selbstverständlich verwende ich .htaccess und $_SERVER.

    da ich eine Git Umgebung habe verwende ich zum Beispiel
    # Block access to "hidden" directories whose names begin with a period. This
    # includes directories used by version control systems such as Subversion or Git.
    <IfModule mod_rewrite.c>
    RewriteRule "(^|/)\." - [F]
    </IfModule>

    Bringt dir jetzt vermutlich wenig.

    Du könntest dir ja die .htacess und die *auskommentierten* Bereiche einmal ansehen.
    https://github.com/h5bp/html5-boi…aster/.htaccess

    Die Entwickler beschäftigen sich zum Beispiel mit dem Thema
    Clickjacking
    http://de.wikipedia.org/wiki/Clickjacking

    Und selbstverständlich nehme ich $_SERVER an und untersuche diese... Aber dies fehlte in deinem Script komplett.

    Ich verwende für die Untersuchung preg_match in PHP. Und wenn ich etwas im Script untersuche, frage ich mich, nach dem Zweck...

    Ich verwende auch Server Erweiterungen für Apache und PHP.

    Mit offenen Augen träumen

  • Hey danke für die lange ausführliche Antwort. Das man .htaccess Files, wenn man zugriff auf die httpd.conf hat vermeiden soll, wusste ich noch nicht. Auch wenn das ja eher selten der Fall ist. Das mit dem Clickjacking werde ich mir auch mal noch genauer anschauen.
    Du sagst du verwendest preg_match, was ja mittels regulären Ausdrücken einen String überprüft. Gut bei komplexen Suchen kann man darauf nur schwer verzichten, aber ist das nicht sehr viel unperformanter als einfache Stringoperationen wie stripos. Oder verwendust du das nur für die komplexeren Untersuchungen ?

  • Apache Configuration
    [FONT=verdana]RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC][/FONT]
    
    
     [FONT=verdana]RewriteRule ^(.*)$ - [F,L][/FONT]


    Ich vergesse bei den Request-Methoden den Namen PROPFIND immer wieder und musste erst wieder suchen. Da kamen vor Jahren tausende Aufrufe einzelner Images über PROPFIND im Sekundentakt. Die erreichten zwar nicht viel, versauten mir aber die Statistiken. Seither habe ich es so.

    Apache Configuration
    RewriteCond %{REQUEST_METHOD} !^(GET|POST|HEAD)$ [NC]
    RewriteRule .* - [F,NS,L]
    
    
    RewriteCond %{HTTP_USER_AGENT} ^$
    RewriteCond %{REQUEST_URI} !^/favicon\.ico
    RewriteCond %{REQUEST_URI} !^.*?/feed/
    RewriteRule .* - [F,NS,L]

    Wenn für Favicon keine Ausnahme, wurde es nicht in G WMT in der Übersicht angezeigt. Meine ersten Feed-Reader sendeten noch keinen User Agent, PHP sendet von sich aus keinen mit, selbst als ich bei einem Plugin mit wp_remote_get einen als Option angab, suchte ich nach einem Fehler, bis ich mitbekam, dass ich für getimagesize noch zusätzlich einen mit ini_set(), setzen musste.

    Ohne NS konnte ich mal einen Feed von Verzeichnis A nicht im Verzeichnis B laden. Sollte ich wohl noch einmal überdenken, wo wirklich erforderlich, ebenso bei HEAD, braucht man wohl eigentlich auch kaum.

  • Hatte mal gestern einen Anfang gemacht, wie ich mir das vorstellen könnte. Gebe das Listing jetzt ohne PHP-Code-Tag ein, damit die Zeilen nicht umgebrochen werden. Statt in zwei nach filetime und filesize sortierte Listen auszugeben, könnte ich mir vorstellen, dass so in einer Tabelle in die DB einzulesen. Dann ein zweites Script um festzustellen, bei welchen Dateien ein Unterschied bei filetime und/oder filesize. Diese dann näher betrachten.

    Wenn die Datei im Plugin-Verzeichnis liegt, erhält man zwar mit Dirname den Pfad bis Plugin, aber nicht den Pfad bis Root, der müsste ja irgendwie eingekürzt werden, damit der Durchlauf ab Root erfolgt. Habe den hier nur manuelle eingefügt, wäre für ein Plugin kein Zustand. Wenn Datei im Root liegt, genügt hingegen ein "." Punkt, statt "C:/xampp/htdocs/wordpress".

    Einmal editiert, zuletzt von Melewo (15. März 2014 um 07:06)


  • Wenn die Datei im Plugin-Verzeichnis liegt, erhält man zwar mit Dirname den Pfad bis Plugin, aber nicht den Pfad bis Root, der müsste ja irgendwie eingekürzt werden, damit der Durchlauf ab Root erfolgt. Habe den hier nur manuelle eingefügt, wäre für ein Plugin kein Zustand. Wenn Datei im Root liegt, genügt hingegen ein "." Punkt, statt "C:/xampp/htdocs/wordpress".


    hth

    Ralf

    Mit offenen Augen träumen

    Einmal editiert, zuletzt von r23 (15. März 2014 um 15:31)

  • Ja, hat geholfen. Habe 'site_root' in die Suche eingegeben, bin dann zwar nicht direkt bei WP fündig geworden, doch bei Stack Overflow. Das letzte Beispiel auf der Seite liefert site_root, egal wo die Datei liegt, Hauptsache unterhalb von wp- im Beispiel:

    Wordpress - Get root directory?

    Da es jedoch eigentlich ins Plugin-Verzeichnis sollte, habe ich es etwas für einen Test geändert:


  • Da es jedoch eigentlich ins Plugin-Verzeichnis sollte, habe ich es etwas für einen Test geändert:

    beispiel aus der wp-config.php

    PHP
    /** Absolute path to the WordPress directory. */
    if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');


    wenn man nur das Plugin Verzeichnis scannen möchte - kann man 'wp-content/plugins/' anhängen.

    anstelle [COLOR=#000000][COLOR=#0000BB]getcwd[/COLOR][/COLOR] verwende ich eigentlich

    PHP
    dirname( realpath( __FILE__ ) ) . DIRECTORY_SEPARATOR;


    Mit offenen Augen träumen

  • Es ging mir eigentlich darum, hier liegt das Script bei den Tests,

    C:\xampp\htdocs\example\wordpress\wp-content\plugins\neuer-ordner
    C:\xampp\htdocs\wordpress\wp-content\plugins\test-verzeichnis

    und der Durchlauf sollte hier beginnen (beginnt da nun augenblicklich auch):

    C:\xampp\htdocs\example\wordpress
    C:\xampp\htdocs\wordpress

    Weil das den Root von den beiden entspricht:

    "http://example.localhost"
    "http://localhost/wordpress/"

    Rufe die Datei jetzt aber noch so auf, sind ja nur Tests bislang. Überlege noch, wie ich das mit den Hooks mache. Wenn zu sehr an WP gekoppelt, würde es ja im Ernstfall zusammen mit WP den Dienst quittieren. Liefert nun erst einmal die Dateien als Liste, die in den letzten 24 Stunden bearbeitet wurden.

    Dirname hatte ich in anderen Scripts auch oft verwendet, wüsste jetzt nicht welche Variante oder Funktion die bessere wäre.

    Einmal editiert, zuletzt von Melewo (15. März 2014 um 20:49)

  • beispiel aus der wp-config.php


    Eigentlich hast Du wohl damit recht:

    PHP
    echo ABSPATH;   // liefert C:\xampp\htdocs\worddreiacht/

    Sollte genügen, wenn der letzte / entfernt wird. Nur was ist, wenn WP nur noch eine weiße Seite hat, dann wird ABSPATH wohl auch nichts mehr liefern. Im Augenblick meldet sich das Script, obwohl nicht eingebunden, was auch ungesund ist. Nun gut, das wird wohl noch einige Wochen oder länger dauern.

    Könnte mir das bislang etwa so vorstellen, dass da zwar eine Seite im Dashboard zugehört, wo dann ein paar Optionen gesetzt werden können, doch wenn die WP Funktionen auf Grund widriger Umstände nicht zur Verfügung stehen, dass das Script dennoch abrufbar bleibt oder so. Dann jedoch nur über einen anderen Schutz, damit es nicht jeder von außen aufrufen kann.

    Für den Privatgebrauch würde es auch genügen, wenn eine "Ohne WP Version" abrufbar auf dem Rechner verbleibt, die nur schnell hochgeladen zu werden braucht. Doch ein Plugin, bei dem die Hälfte auf dem Rechner für den Notfall eingemottet wird, hört sich auch nicht so gut an.


  • Sollte genügen, wenn der letzte / entfernt wird. Nur was ist, wenn WP nur noch eine weiße Seite hat, dann wird ABSPATH wohl auch nichts mehr liefern. Im Augenblick meldet sich das Script, obwohl nicht eingebunden, was auch ungesund ist. Nun gut, das wird wohl noch einige Wochen oder länger dauern.

    Wenn ABSPATH nicht zur Verfügung steht - wurde in der Regel ein Header gesendet.
    http://www.php.net/manual/de/function.headers-sent.php

    Ich trage in die option bei meinem Plugin den Wert ein

    PHP
    'site_root' => realpath( ABSPATH ),

    hatte ich vergessen, dass ich dies mache :(

    du verwendest hier filemtime als Basis - dies ist nicht sicher


    man vergleicht eingentlich den MD5-Code einer Datei
    http://www.faqs.org/rfcs/rfc1321.html

    in PHP steht dir dafür md5-file zur Verfügung
    http://www.php.net/manual/de/function.md5-file.php

    man könnte auch die Datei-Größe verwende
    http://www.php.net/manual/de/function.filesize.php

    Könnte mir das bislang etwa so vorstellen, dass da zwar eine Seite im Dashboard zugehört, wo dann ein paar Optionen gesetzt werden können, doch wenn die WP Funktionen auf Grund widriger Umstände nicht zur Verfügung stehen, dass das Script dennoch abrufbar bleibt oder so. Dann jedoch nur über einen anderen Schutz, damit es nicht jeder von außen aufrufen kann.

    vor deisem Hintergrund speichere ich das Ergebnis nicht in der Datenbank sondern lege "eine" Datei an. Da mir wp-cron in der Vergangeheit schon x-fach den Server abgeschossen hat
    http://toscho.de/2010/wordpress-wp-cron-begrenzen/

    gehe ich per se den Weg von "aussen". ich sende einen Sicherheits-token mit

    PHP
    if( ! isset( $_GET['...] ) || ! isset( $_GET['...'] ) || 1 != $_GET['...'] || $options['security_key'] != $_GET['xxxx_key'] )
                    return;

    den ich mit dem Wert in der Datenbank vergleiche... wenn die Datenbank nicht mehr erreichbar ist - kann ich mir den Scan in eine andere Datei legen...

    Mit offenen Augen träumen

  • in PHP steht dir dafür md5-file zur Verfügung
    http://www.php.net/manual/de/function.md5-file.php

    man könnte auch die Datei-Größe verwende
    http://www.php.net/manual/de/function.filesize.php


    Habe gerade ein paar kleinere Tests gemacht, weil ich eigentlich bei einem Vergleich auf filesize aus war. Doch wie ich festellte, filesize ist bestechlich, wenn die hinzugefügte Anzahl an Bytes zum Ausgleich zum Beispiel aus Kommentaren entfernt werden würde. md5_file scheint da dann doch die bessere Wahl zu sein, weil da ein verändertes Zeichen im Code genügt, um einen anderen Wert auszuspucken.


    Und beim Rest, werde mal sehen wie es weitergeht, ein Anfang ist ja erst einmal da. Dann halt mit Fallunterscheidungen, sind jetzt wieder nur erste Tests, mehr noch nicht.


    Schreibe gerade noch an einem Plugin, welches ich zuerst fertigstellen wollte. Danach weiß ich noch nicht so genau, was das Leben mit sich bringt, soll heißen, wie es mit der Zeit bestellt sein wird.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!