Beiträge von codestyling

    Wenn das wirklich so dasteht, und register_globals angeschaltet ist auf deinem Server, dann kann jeder auf diese Weise irgendeine Seite aus timbuktu bei dir ausführen lassen!
    Das ist ein Sicherheitsrisiko hoch 3, Nutzereingaben direkt ausführen zu lassen. Ich hoffe für dich, das die Variablen

    Code
    [COLOR=#000000][COLOR=#CC0000]$sec
    $subsec
    $content
    [/COLOR][/COLOR]


    alle vorher abgesichert und geprüft und nicht 1:1 benutzt werden, wie sie reinkommen! Wenn doch, solltest du schleunigst was dran ändern bzw. ändern lassen, sonst wird deine Domain leichte Beute! Da du das hier jetzt veröffentlicht hast, ist deine Domain in Gefahr!

    PHP
    <?php
    require_once( dirname(__FILE__) . '/wp-config.php');
    wp();
    wp_loginout();
    ?>

    Der Pfad müsste noch ggf. angepasst werden. Da ich annehme, dass dein Blog im Unterverzeichnis läuft, könnte es sein, das es den Cookie auch nur für dieses ausstellt. Wenn also der o.g. Code kein Abmelden anzeigt (was ich mit puren nicht zu WP gehörenden Seiten getestet hab, die im gleichen Pfad wie WP liegen), dann müsste man noch was an der Ausstellung der Cookies machen.
    Ansonsten zeigt das im eingeloggten Zustand in meiner Test.php den Abmelden Link.

    Nur für diejenigen, die hier mitlesen und Hilfe suchen. Ein Patch ist in Kooperationsarbeit mit infected im Test und wird veröffentlicht, wenn er so funktioniert, wie er soll. Dann ist der Speed immer wie im Originalzustand nur der Fehler tritt dann nicht mehr auf.
    Sobald das durchgetestet ist und Bestand hat, werde ich das veröffentlichen und bei WordPress einen Patch einreichen.
    Anmerkung: Der Fehler ist nicht die Schuld von WordPress , so wie es derzeit aussieht, ist das ein PHP/Apache Fehler.

    So kommst du da dran:

    PHP
    <?php
    preg_match_all('/^(\d{4})(\d{2})(\d{2})/', $_GET['m'], $hits);
    echo 'alle Termine für den: '.$hits[3][0].'.'.$hits[2][0].'.'.$hits[1][0];
    ?>

    Die regular expression ermittelt aus dem Übergabeparameter ein Array, dass eigentlich so aussieht:

    Das wolltest du doch so ?

    Einfach aber wirkungsvoll, Plugin- und Cacheverzeichnis umbenennen und diese in der wp-config.php definieren:

    PHP
    define('PLUGINDIR', 'wp-content/s634trwe'); 
    define('CACHE_PATH', dirname(__FILE__).'/wp-content/re536reb/');

    Gruß
    Ingo


    Ich hab ja kein Problem damit, weil ich den Cache nicht aktiviert hab. Nur leider sind die Bots klüger geworden und ein Test mit dem PLUGINDIR zeigt, das sie erst eine Seite abholen, darin nach bekannten Plugins per RegExp suchen und wieder den passenden Plugin Pfad haben und dann mit diesem erneut ankommen. Für den Cache könnte es helfen, für die Plugins zunehmend nicht mehr. Im Moment sind nur wenig "intelligentere" Bots aktiv aber das wird zunehmen.

    Mit dem bisherigen Log und einem deny in der .htaccess konnte ich durchaus bereits einen großen Teil ausfindig machen. Ich wollte mir einfach den ständigen Eingriff in die .htaccess und das Auswerten der Logs etwas vereinfachen, indem ich den Großteil über ein Plugin abfange.

    Es sollte auf keinen Fall zu einer der müßigen Debatten über den Sinn und Unsinn von Antispam-Maßnahmen bei Blogs ausarten... :)

    Mir ist klar, das du das vereinfachen willst. Die Lösungen, die ich auf meiner TODO Liste liegen hab, sehen etwa so aus:

    1. Absolut alle Zugriffe werden durch eine PHP geleitet, selbst für die auf Platte befindlichen echten Dateien (Bilder etc.)
    2. Die Standard .htaccess lässt dann keinen direkten Zugriff auf irgendeine Datei mehr zu sondern nur der Controller entscheidet, ob er das per Filetyp ausgibt (Bilder/Javascripts etc.)
    3. Bei Installation dieses Wächter-Plugins wird eine whitelist der Files erstellt, die per require reingenommen werden dürfen (falls eine PHP direkt angefragt wurde).
    4. Die Plugin Installationsseite wird erweitert und bekommt einen Wächter, der die whitelist anpasst, wenn man ein neues Plugin installiert oder eines deinstalliert wird.
    5. Die Themeseite wird erweitert und bekommt ein Wächter, der Themes überwacht.

    So in etwa (Prosa) stelle ich mir das vor. Das ist ne Menge Arbeit aber machbar. Einzig die Zeit dazu fehlt mir. Alles andere ist virtuelle Sicherheit.

    PS: Seit heute morgen 9:00 läuft wieder eine Angriffswelle auf /wp-content/cache/ und eine PHP soll nachgeladen werden, die den Domain Account und den freien Plattenplatz zurückmelden soll. Falls zu finden auch noch den WP Benutzernamen und Passwort, falls der Cache kompromitiert werden kann.
    Die Aufrufe kommen immer mit ständig wechselnder IP von Australien, Niederlanden, UK usw. Diesmal scheint ein verteiltes Netz beteiligt zu sein. Bei so was hast du zu tun, das zu sperren.

    Das Plugin soll SO FRÜH WIE MÖGLICH (also via "init" Hook) die Zugriffe auf das Blog loggen. So kann ich erkennen, ob z.B. auf die wp-pass.php zugegriffen wurde, um einen Exploit auzunutzen.


    Ok, verstanden. Dann drück ich es auch mal simpel aus:

    Code
    www. domain . de/wp-content/plugins/google-sitemap-generator/sitemap.php

    Wenn ich das direkt aufrufen lasse (geht bei jedem Plugin), dann wird die ganze WP init Show umgangen, denn wenn die direkt angesprochene PHP Datei die wp-config.php bzw. wp-settings.php nicht selbst lädt (warum auch), dann kannst du das auch so nicht monitoren!
    Und Exploits richten sich nur teilweise gegen den normalen Aufrufsweg, es gibt viele, die direkte PHP Aufrufe ausnutzen. Diese bekommst du gar nicht mit!

    Was du versuchst, kann bestenfalls einen Bruchteil der Zugriffe abweisen, 100% bekommst du nur mit .htaccess und Auswertung der Apache Logs hin.

    Ich verstehe das Problem nicht. Wenn du öffentliche Blog Url's monitoren und sperren willst, geht das doch einfach:

    PHP
    add_action('template_redirect', 'my_template_redirect');
    
    
    function my_template_redirect() {
        global $post;
        if(is_single() && ($post->comment_status == 'open')) {
            //... hier werden die Kommentarscripts bei mir vorbereitet, im Beispiel mit prototype.js
            wp_enqueue_script('prototype');    
        }
    }

    Du brauchts doch nur den Zugriff auf den bereits ermittelten Post. Ich weise WP hier an, für Einzelseiten, auf denen Kommentare erlaubt sind, zusätzliche Javascripts mit auszuliefern.
    Genauso kannst du an dieser Stelle die $post->post_ID besorgen und anhand der IP machen, was du willst. Für Bilder, die direkt ausgeliefert werden, hast du so keine Chance und im Admin Bereich gibts keine post ID.

    Ich selbst benutze FileZilla 3.0.11 (Windows), habe aber über Transfer->Transfertyp immer binär eingeschaltet.
    Die Anmeldedaten verlierst du nicht nur solltest du die Datenbankeinstellungen, die ja schon in der wp-config.php stehen auch wieder so wie sie jetzt sind in der hochzuladenden Datei stehen haben.

    Nette Grafik, nur ist mir immer noch nicht klar, was die mit 2000% besagen will.
    Ich bin der Meinung, ein Server kann mit maximal 100% ausgelastet werden, sei es nun CPU, Speicher oder sonstwas. Mehr gibt die Hardware halt nicht her.
    Es geht aber nicht um die bei Dir unten verlinkte Seite, oder?

    Gruß
    Ingo


    Na ja, 20 fache Belastung kann man sich errechnen, wenn man ein 32 Prozessoren System hat, auf dem 20 Prozessoren Volllast laufen. Aber wie du schon sagst, ist das eine Sache des Standpunkts und wie das allinkl handhabt, weis ich auch nicht.

    Und die verlinkte Seite ist mir auch schon "negativ" aufgefallen, da muß es ja zu Überlast kommen bei diesen Keywords.


    Die Strings sind nicht vorne abgeschnitten und hinten verlängert, sondern vorne verlängert und hinten abgeschnitten, daher kann es sein (nicht nachgeguckt), dass eine 0 am Ende des vorherigen Strings dem Nachfolgestring gleich ein Ende macht.


    Musst du mir mit deinen Daten mal erklären:

    Code
    DE 12 04 95 [COLOR=Red]00[/COLOR] [COLOR=Blue]00 00 00 5E[/COLOR] 08 00 00 1C 00 00 00 
    -1794895138    FFFFFFFF950412DE
    1577058304  [COLOR=Blue]5E000000[/COLOR]
    469762056   1C000008
    201326592   0C000000
    687865923   29000043

    Mit diesem 1 Byte Offset auf Strings bezogen, fehlt leider das 1. Zeichen, weil er ja den String um 1 Byte zu weit hinten anfängt zu interpretieren.
    ... wollt ich nur mal gesagt haben. :)

    Hallo!

    WAS IST DAS?? XSS?? Bahnhof??

    "According to the advisory, the attacker does require authentication and access to the following URL:http://[host]/[directory]/wp-admin/admin.php?page=nggallery-manage-gallery"

    Was bedeutet: "the attacker does require authentication and access to the following" ?

    Heute war auf einmal meine deutsche Sprachdatei vom Server verschwunden und ich hatte einen smiley in meinem blog im footer, den ich dort nicht eingebaut habe !?????

    Grüsse von solveig:)

    XSS ist Cross Site Scripting Wikipedia Cross-Site Scripting – Wikipedia .
    Wenn jemand die Berechtigung in deinem Blog hat, die Nextgen Gallery zu benutzen, dann kann dieser jemand ein Javascript als Beschreibungstext eingeben, der beim Anklicken des Bildes ausgeführt wird.

    Wenn später mal ein angemeldeter Admin auf das Bild draufdrückt, weil er/sie es sich dann im eingeloggten Zustand ansehen will, dann übernimmt das Script die Kontrolle und trägt u.U. einen neuer User als Admin ein oder räumt dem Verursacher Admin Rechte ein. Dann kann dieser jemand deine Seite nach Belieben ändern.

    Hast du einen Link zu Blog, so das man mal schauen kann, was genau evtl. schon in der Seite versaut sein könnte ?

    Noch eine Ergänzung: Der Smily unter dem Footer kommt von WP Stats und zeigt, das deine Statistik funktioniert.

    Ja manchmal trat der Fehler auch im Frontend auf. Genau wie Du sagst, erschien dann nur eine weiße Seite mit der besagten Fehlermeldung. Wir können mal folgendes machen: Ich könnte Dir nen FTP Account einrichten und dann kannst Du Deine Test auf meinem Testblog fortführen, quasi am lebenden Objekt.


    Ich hab da noch einen Vorschlag: Wir "müllen" das Thema hier erstmal nicht weiter zu als unser persönlichen Chat :mrgreen: sondern ich schickt dir meine E-Mail Adresse und Skype Kontakt, sofern du Skype hast, das geht einfacher.

    Und ich würde eine Protokollfunktion in der gettext.php erstmal einbauen, die den Fehler erkennt und in dem Falle ein Logfile (Text) schreibt mit Zeitstempel, Serverauslastung und Fehlerstelle. Dann kann man das auch mal mit den Logs vergleichen und schauen, was in diesem Moment passiert ist.

    Da ich nicht testen kann, warum das 1. Zeichen verschoben ist, würde aus
    "Artikel schreiben" -> "rtikel schreibenA"
    Der 1. weg, dafür von folgenden "Artikel löschen" das A hinten dran.

    Passiert der Fehler auch im Frontend ? Dann müssten doch nur Fehlermeldung ausgeliefert werden oder ?

    Mit Thai hast du dir eine harte Nuss ausgesucht. Die th.mo Dateien sind bestenfalls Alpha Status (schätze mal max. 40% übersetzt) und hier zum Download: Revision 4534: /th/trunk/messages
    Für Plugins oder Themes wird's vermutlich noch schwerer werden, was zu finden.

    Ich beschäftige mich seit einigen Wochen (soweit es meine spärliche Freizeit zulässt) mit dem Thema Lokalisierung/Internationalisierung. Eine Patentlösung dafür hab ich noch nicht gefunden, deswegen schreib ich gerade an einer eigenen Lösung für WP.
    Auf dem "Markt" sind Lösungen, die wie du schon sagtest, welche entweder die DB's umschalten und auf eine andere Subdomain leiten oder die andere Sorte, die in einem Post alle Sprachen per Sektionen unterbringen.

    Mir gefällt der Sektionsansatz nicht, denn wenn ich das Plugin außer Kraft setze (setzen muß wegen Sicherheitspatch), sehe ich nur noch eine Sprache und komme an den Rest nicht mehr ran oder alles auf einmal.
    2 Datenbanken sind schon eher was, aber da hapert es dann mit der sprachübergreifenden Suche oder Umschaltung in die andere Sprache.

    Alles in Allem ein zu lange sträflich missachtetes Thema ohne wirkliche Patentlösungen.

    Ich muss zugeben, dass ich von euren letzten Postings nicht viel verstanden habe, dazu fehlt mir einfach das Fachwissen. Daher weiss ich auch nicht in wie weit eure Überlegungen fortgeschritten sind.

    Trotzdem möchte ich mich jetzt schonmal für eure super Hilfe danken! Ist ja auch nicht gerade selbstverständlich...


    Nicht jeder muss alles können, nur wissen, wohin man sich wenden kann :)

    Ich hab noch einen, gerade im Labortest: Da es ja offensichtlich die Index Adressierung zu den Strings zermüllert (manchmal jedenfalls), wäre es eine Option, einen korrekten Index (ohne Absturz und ohne substr) zu haben, auch wenn dann die Beschriftungen evtl. um 1 Zeichen verschoben sind (1. fehlt, dafür 1. von nächsten hinten dran) und der Speed dem von vorher entspricht?

    Ist zwar auch eine Krücke aber besser als keine Seite ausliefern. Und im Frontend sollte es deutlich weniger auffallen und wenn dann beim nächsten Reload ggf. weg sein.

    Da ich den Fehler ja nicht nachstellen kann, bin ich da limitiert, aber es gibt noch diese Umgehung. Wenn ich in Netz die Reports zum gleichen Thema lese, dann ist meist PHP 5.2.6 und Apache 2.x beteiligt. Auf Apache 1.x bzw PHP 4 scheint das nicht aufzutreten.

    Codestyling, ich glaube, du hast wenig Chancen den Fehler bei dir zu finden, wenn das Problem bei dir nicht auftritt.


    Sehr gut möglich. Aber evtl. könntest du ein var_dump für die ersten 10 Einträge hier reinbauen (gettext.php):


    und das Ergebnis im Fehlerfall bereitstellen ?


    Noch was: Bei mir war es so, dass der Versatz erst beim Auslesen der .mo-Revision aufgetaucht ist. Wenn das zuverlässig sein sollte, könnte man bei $revision != 0 statt substr() my_substr() aufrufen. Sehr sehr unschön, aber eine Möglichkeit.

    Das schau ich mir mal an. Hier nur Ablauf, rekonstruiert, wie er bei Infected auftritt:
    Original Fehlerbild von Infected:

    Code
    Warning: unpack() [function.unpack]: Type V: not enough input, need 4, have 0 in /www/htdocs/xxx/test2/wp-includes/gettext.php on line 91
    Warning: unpack() [function.unpack]: Type V: not enough input, need 4, have 0 in /www/htdocs/xxx/test2/wp-includes/gettext.php on line 91
    Fatal error: Maximum execution time of 30 seconds exceeded in /www/htdocs/xxx/test2/wp-includes/gettext.php on line 166

    Mo-File einlesen:
    1. streams.php fread() ganzer Fileinhalt

    2. gettext.php Zeile: 122
    $magic = $this->readint();
    Byteorder ermitteln

    3. gettext.php Zeile: 133
    $revision = $this->readint();
    Revision lesen

    4. gettext.php Zeile: 135 - 137
    $this->total = $this->readint();
    $this->originals = $this->readint();
    $this->translations = $this->readint();
    Anzahl totaler Einträge lesen (int)
    Anzahl der originale Lesen (int)
    Anzahl der Übersetzungen lesen (int)

    5. gettext.php Zeile: 257
    $this->load_tables();
    erster Aufruf lädt die Tabellen

    6. gettext.php Zeile: 154 - 157
    $this->STREAM->seekto($this->originals);
    $this->table_originals = $this->readintarray($this->total * 2);
    $this->STREAM->seekto($this->translations);
    $this->table_translations = $this->readintarray($this->total * 2);
    Original und Übersetzungtabellen arrays laden

    7. gettext.php Zeile: 166
    $translation = $this->STREAM->read($this->table_translations[$i * 2 + 1]);
    Translation Eintrag lesen

    Da er in gettext.php Zeile 166 nach 30 Sekunden hart beendet wurde, muß die Schleife, deren Zähler in 4.)
    gelesen wurde, noch immer laufen, weil die Anzahl Einträge massiv groß ist, Zeile: 162
    for ($i = 0; $i < $this->total; $i++) {

    Nachtrag: Mofile Anfang:
    DE 12 04 95 00 00 00 00 5E 08 00 00 1C 00 00 00
    0C 43 00 00 29 0B 00 00 FC 85 00 00 00 00 00 00

    $magic = 0x950412DE
    $revision = 0x00000000
    $this->total = 0x0000085E (Anzahl: 2142, ok)
    $this->originals = 0x0000001C (Offset: 28 Bytes)
    $this->translations = 0x0000430C (Offset: 17164 Bytes)

    16164 - 28 Bytes = 17136 Byte / 2142 Einträge = 8 Bytes Breite = 4 Byte Offset + 4 Byte Länge