flashnfantasy: 'kleinen' Denial of Service abfangen in PHP

Das Thema 'Denial of Service' in einer speziellen Variante.

Ich vermute mal nicht einen bösartigen Angriff, sondern einfach nur ein Crawler oder ein sonstiges Programm, daß innerhalb einer Sekunde meine Website etwa 500mal aufruft, und das über mehrere Sekunden.

Dabei stolpert er auch über mehrere öffentliche Chaträume, Galerieen mit Kommentaren, Profile etc. die ich alle dynamisch erstelle und auch Nicht-Mitglieder anzeige (um zu zeigen, was sie auf meinen Seiten erwartet).

Das Problem dabei ist, daß der Datenbank-Server ziemlich schnell komplett ausgelastet ist und für mehrere Minuten ein DOS vorliegt.

Jetzt meine Frage:
Wie kann ich diesen DOS abfangen - und zwar gehe ich davon aus, daß ich in PHP ohne Nutzung der Datenbank den Angriff erkennen will.
Das ich zB die Herkunftsadresse der Abfragen analysiere und auf diese Weise erkenne, ob jemand in extrem kurzer Zeit sehr viele Abfragen macht.

Ich habe mal irgendwann gehört, daß man sowas Flooding nennt und das es da eine Möglichkeit gibt, solche Massenanfragen in PHP vor dem Datenbank-Connect zu verhindern.
Nur wie ?

Gruß,
Flash

  1. Hi Flash,

    Wenn du gewisse Teile deiner Webseite für Suchmaschienen Sperren willst, kannst du diese recht einfach mit einer Robots.txt siehe http://de.selfhtml.org/diverses/robots.htm
    Ich meine wozu müssen Chats im Suchmascheinenindex sein?

    Gruß,
    Rekire

    1. Hi,

      Wenn du gewisse Teile deiner Webseite für Suchmaschienen Sperren willst, kannst du diese recht einfach mit einer Robots.txt siehe http://de.selfhtml.org/diverses/robots.htm

      Ist aber nicht unbedingt gesagt, dass sich der Bot auch daran hält ;-).
      Hat der Bot denn immer den selben User Agent? Dann würde ich den einfach via htaccess aussperren.

      Grüße aus dem schönstem Bundesland der Welt!

      Alex

      1. Hi Alex,

        Wenn du gewisse Teile deiner Webseite für Suchmaschienen Sperren willst, kannst du diese recht einfach mit einer Robots.txt siehe http://de.selfhtml.org/diverses/robots.htm

        Ist aber nicht unbedingt gesagt, dass sich der Bot auch daran hält ;-).

        Meistens steht im Agent doch eine Webadresse einfach da beschweren?

        Hat der Bot denn immer den selben User Agent? Dann würde ich den einfach via htaccess aussperren.

        Gute Idee, nur wenn htaccess nicht verfürbar ist? Ich hatte mal das Problem

        1. Hi Rekire,

          Meistens steht im Agent doch eine Webadresse einfach da beschweren?

          Wenn das der Fall seinen sollte, dann wäre eine Mail an den Bot-Betreiber sicherlich nicht verkehrt. Wenn es sich wirklich nur um ein technisches Problem handelt, so kann der Betreiber sicherlich Flashs Seite rausnehmen.

          Gute Idee, nur wenn htaccess nicht verfürbar ist? Ich hatte mal das Problem

          Dann machste es via PHP ;-). Den Agent abfragen und wenn es der gesuchte Bot ist, gibst du mit header(); nen 403 zurück und fertig.
          Ich gehe aber in diesem Fall, bei der Größe der Seite, davon aus, dass htaccess möglich ist.

          Grüße aus dem schönstem Bundesland der Welt!

          Alex

  2. Servus!

    Dabei stolpert er auch über mehrere öffentliche Chaträume...

    Der vermeintliche Bot kann sogar Deine Chats loggen?
    Wenn das ein selbst erstellter Chat ist, dann hat es der Vater dieses Bots aber ernst gemeint! ;~)

    Wie kann ich diesen DOS abfangen

    Was der DoS ist, und wie man ihn "bearbeitet", kannst Du vorerst meinem Artikel zum Thema entnehmen.

    und zwar gehe ich davon aus, daß ich in PHP ohne Nutzung der Datenbank den Angriff erkennen will.
    Das ich zB die Herkunftsadresse der Abfragen analysiere und auf diese Weise erkenne, ob jemand in extrem kurzer Zeit sehr viele Abfragen macht.

    Das ist durchaus möglich, wenn es sich tatsächlich um eine Fehlfunktion des Bots handelt, wie Du es vermutest. Wenn das jedoch ein ernsthaft ausgelegter Angriff ist, so wird der Angreifer zumindest seine Spuren verwischen, angefangen bei seiner IP-Adresse. Diese wird gefälscht (gespooft, siehe IP-Spoofing). Insofern ist der Ansatz über das Skript wieder wertlos. Ich vermute Du kommst nicht um eine ordentliche Rekonfiguration Deines Webservers herum.

    Ich habe mal irgendwann gehört, daß man sowas Flooding nennt und das es da eine Möglichkeit gibt, solche Massenanfragen in PHP vor dem Datenbank-Connect zu verhindern.

    Falls Dein einziges Problem nur der träge Aufbau von Skript zur Datenbank ist, dann könnte mysql_pconnect() interessant für Dich sein.

    Das Thema 'Denial of Service' in einer speziellen Variante.

    Hört sich für mich nach einer ganz normalen Ressourcensättigung an.
    Speziell ist DDoS oder DRDoS.

    Freundliche Grüße
    Stefano Albrecht

    --
    Sancta Simplicitas!
    1. Moin!

      Wie kann ich diesen DOS abfangen

      Was der DoS ist, und wie man ihn "bearbeitet", kannst Du vorerst meinem Artikel zum Thema entnehmen.

      Nicht wirklich. Dein Artikel ist a) veraltet, b) in technischen Details inkorrekt und c) an zentralen Stellen sachlich falsch.

      Das ich zB die Herkunftsadresse der Abfragen analysiere und auf diese Weise erkenne, ob jemand in extrem kurzer Zeit sehr viele Abfragen macht.

      Das ist durchaus möglich, wenn es sich tatsächlich um eine Fehlfunktion des Bots handelt, wie Du es vermutest. Wenn das jedoch ein ernsthaft ausgelegter Angriff ist, so wird der Angreifer zumindest seine Spuren verwischen, angefangen bei seiner IP-Adresse. Diese wird gefälscht (gespooft, siehe IP-Spoofing).

      Das allerallerletzte, was ein DoS-Angreifer, der PHP-Skripte überlasten will, tun wird, ist das Spoofing seiner IP-Adresse. Denn das PHP-Skript wird ja nie gestartet, wenn der Webserver keine komplette TCP-Verbindung aufbauen kann, um überhaupt mal den HTTP-Request vom Angreifer entgegenzunehmen, sobald dieser eine falsche IP angibt.

      Insofern ist der Ansatz über das Skript wieder wertlos. Ich vermute Du kommst nicht um eine ordentliche Rekonfiguration Deines Webservers herum.

      Allgemeinplatzalarm!

      Ich habe mal irgendwann gehört, daß man sowas Flooding nennt und das es da eine Möglichkeit gibt, solche Massenanfragen in PHP vor dem Datenbank-Connect zu verhindern.

      Das muß PHP dann selbst regeln. Man könnte den aktuellen Load des Systems ermitteln und in Abhängigkeit vom Ergebnis aufwendige, aber im Grunde nur dekorative Datenbankabfragen weglassen.

      Da es allerdings nicht viel hilft, wenn ein überlastetes System zur Feststellung der Überlastung erstmal aufwendig und belastend Skripte parsen muß, gerät man so doch wieder in eine Abwärtsspirale. Schlauer sind schnelle Mechanismen wie z.B. mod_loadavg.

      Falls Dein einziges Problem nur der träge Aufbau von Skript zur Datenbank ist, dann könnte mysql_pconnect() interessant für Dich sein.

      Das hilft nur in ganz speziellen Fällen (PHP als Modul) und verursacht seinerseits das Potential, dass die Datenbank massenhaft mit persistenten Connections zugemüllt wird - sozusagen ein sekundärer DoS. Ob sich da andere Nutzer der Datenbank freuen? Man sollte jedenfalls wissen, was man tut, wenn man pconnect einsetzt. Es einfach nur so einzusetzen ist keine schlaue Taktik.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. Servus Sven,

        Nicht wirklich. Dein Artikel ist a) veraltet, b) in technischen Details inkorrekt und c) an zentralen Stellen sachlich falsch.

        könntest Du mir Verbesserungsvorschläge geben?

        a) Siehe Erstellungsdatum des Artikels. Vielleicht sollte ich den Leser noch darauf aufmerksam machen.
        b) Wie äußert sich das?
        c) Und wie äußert sich das?

        Ich nehme Deine kostbare Zeit nur ungern für so etwas in Kauf, aber wenn man sich schon dermaßen äußert, dann sollten gleich Erläuterungen folgen. Achte jedoch auf das "Zielgruppe: Fortgeschrittene". Ich wäre Dir sehr verbunden für die Hilfestellung :~)

        Das allerallerletzte, was ein DoS-Angreifer, der PHP-Skripte überlasten will, tun wird, ist das Spoofing seiner IP-Adresse.

        Stimmt.

        Freundliche Grüße
        Stefano Albrecht

        --
        Sancta Simplicitas!
        1. Moin!

          Nicht wirklich. Dein Artikel ist a) veraltet, b) in technischen Details inkorrekt und c) an zentralen Stellen sachlich falsch.

          könntest Du mir Verbesserungsvorschläge geben?

          Aber sicher.

          a) Siehe Erstellungsdatum des Artikels. Vielleicht sollte ich den Leser noch darauf aufmerksam machen.

          Der Artikel ist ein Jahr alt. Dennoch liest er sich so, als wäre er aus dem letzten Jahrhundert, zumindest in einigen Passagen.

          b) Wie äußert sich das?
          c) Und wie äußert sich das?

          Ich gehe mal von oben nach unten durch.

          "Die Weiterentwicklung der Netzwerktechnologie führt automatisch zu Sicherheitslücken in den Systemen und Protokollen."

          Ist das so? Allgemeinplatzalarm!

          "Leider werden diese Lücken gerne von bösartig gesinnten "Benutzern" genutzt, um großflächigen Schaden anzurichten."

          Es braucht keine Lücke irgendwo, um einen DoS-Angriff zu erleiden.

          "Leider sind bestimmte DoS-Attacken, wie z.B. die SYN-Flood, auf welche wir weiter unten eingehen werden, nahezu unbezwingbar bzw. man kann sich nicht vor ihnen schützen."

          SYN-Flood sollte jedem aktuellen IP-Stack lediglich ein müdes Lächeln abringen. Dieser Angriff ist heutzutage (und das auch bereits seit 1996, also bereits seit zehn Jahren) mit absolut simplen Mitteln problemlos abwehrbar (Stichwort: SYN-Cookies). An Sätzen wie diesem demonstrierst du deine Uninformiertheit und gibst veraltete und inkorrekte Information wider.

          Natürlich gibt es DoS-Angriffe, gegen die man sich nicht so einfach wehren kann - aber SYN-Flooding ist ein ganz schlechtes Beispiel an dieser Stelle, weil es für das Gegenteil steht.

          "Jeder Router kann nur eine endliche Datenmenge gleichzeitig bewältigen. Dies hängt von Equipment und Produktivität des Geräts ab."

          Den zweiten Satz bitte streichen. Was ist denn bitte das "Equipment des Geräts"? Und die "Produktivität des Geräts"? Wenn schon, dann bitte von "Ausstattung und Leistungsfähigkeit" sprechen.

          "Die Bandbreitenkapazitäten eines Netzwerks beginnen bei einer normalen LAN-Topologie bei dem 10BASE-T-Standard und gehen bis zum 100BASE-T-Standard (10Mbit/s und 100Mbit/s)."

          Deine zwei genannten Standards sind bei weitem nicht die einzigen für LAN. Erstens gibts neben diesen zwei Twisted-Pair-Standards auch noch 10Base-2 mit ebenfalls 10MBit/s, zweitens heißt der schnellere Standard 100Base-Tx (es gibt auch noch Abarten wie 100Base-T4 und die Glasfaserstandards 100Base-Fx und -Sx), drittens gibt es mittlerweile auch Gigabit-Ethernet, und viertens läßt du das ganze Thema WLAN komplett außen vor, obwohl es selbstverständlich auch in das Obergebiet "LAN" gehört.

          "Ein DoS wird hier herbeigeführt, indem das angreifende Programm die komplette Bandbreitenkapazität in Anspruch nimmt, dabei nutzt es Fehlkonfigurationen der Soft- und Hardware aus. Solange dieses Programm läuft, kann der Router keine weiteren Verbindungen mehr akzeptieren und friert demnach ein. Ein Systemadministrator kann diesen Vorgang durch Korrektur der jeweiligen Konfiguration beheben."

          Dieser Abschnitt ist komplett falsch. Belegt wird die komplette Bandbreite einer Netzwerkverbindung oder einer Kollisionsdomain. Hierbei kommen natürlich "angreifende Programme" zum Einsatz (was ich aber so nicht formulieren würde), diese nutzen aber lediglich die ganz normale Netzwerkkonnektivität des Hosts, und KEINERLEI Fehlkonfigurationen von Soft- oder Hardware.

          Betroffen ist von so einer Attacke auch nicht der Router, sondern eine oder mehrere der am Router angeschlossenen Netzwerkverbindungen, die den entstehenden Datenverkehr nicht schnell genug transportieren kann. Der Router friert NICHT ein, er ist lediglich gezwungen, Datenpakete unverarbeitet zu löschen und nach Möglichkeit den Sender darüber zu informieren.

          Ein Systemadministrator kann gegen Bandbreitenflutung ohne Analyse des Angriffs NICHTS tun, er muß den Router oder eine vorgeschaltete Firewall so konfigurieren, dass alle Datenpakete, die dem Angriff zugeordnet werden können, unverarbeitet gelöscht werden, damit alle anderen Datenpakete, die dem regulären Betrieb zuzuordnen sind, wieder ohne Stau passieren können.

          "Die Ressourcensättigung funktioniert auf ähnliche Weise, ist jedoch die beliebtere Methode und kommt häufiger zum Einsatz."

          Das sehe ich anders. Bandbreitenflutung benötigt lediglich eine hinreichend große Zahl an Bots, die man auf das Ziel ansetzen kann, ohne dass man in irgendeiner Weise weitergehende Informationen über das Ziel besitzen muß. Typische Angriffsformen wären beispielsweise auch Distributed Reflected DoS.

          Um per Ressourcensättigung erfolgreich anzugreifen, ist eine intensivere Analyse des Ziels notwendig. Der angesprochene SYN-Flood beispielsweise würde heute nur noch bei anfälligen Hosts zum Erfolg führen - und die sind selten. Und auch das Auffinden von CPU-lastigen oder speicherhungrigen Skripten auf dem Webserver ist keine simple Aufgabe, sondern erfordert Beschäftigung mit dem Ziel.

          Der "Lohn" ist dann andererseits, dass ein Angriff vermutlich mit viel weniger Bot-Einsatz viel größeren Effekt auslösen kann (ohne Bots geht's so oder so nicht, wenn man nicht zurückverfolgt werden will).

          "Die am simpelsten zu realisierende DoS-Attacke ist die Herbeiführung von System- und Anwendungsabstürzen. Bei diesen werden allseits bekannte Programmierfehler der Hard- und Software ausgenutzt, um so z.B. eine Endlosschleife im Programm auszulösen."

          Wenn man weiß, dass das Zielsystem anfällig ist, stimmt diese Aussage. Das Problem ist nur, in einem ersten Schritt das System hinreichend exakt zu identifizieren und im zweiten Schritt passende Programmfehler aufzuspüren, um sie dann im dritten (und in der Tat nach diesen ganzen Vorarbeiten recht simplen) Schritt auszunutzen.

          "Leider liegt dem Erfolg einer DoS-Attacke immer ein fehlerhaft konfiguriertes System zugrunde."

          Wie ich oben schon ausführte: Diese Aussage ist falsch.

          "Die einzige Möglichkeit, sich gegen eine solche Attacke zu schützen ist folglich, die Konfiguration der Geräte und Software kontinuierlich zu überwachen und mit aktuellen Patches der Anbieter zu aktualisieren."

          Es ist sicher keine schlechte Idee, Updates einzuspielen. Hilft aber nicht gegen DoS.

          "Wenn Sie wissen, dass ein Programm fehlerhaft programmiert wurde, können Sie dieses schlecht umprogrammieren, allerdings können Sie dies dem Entwickler mitteilen, damit sich dieser darum kümmern kann und das Problem mit dem nächsten Patch behoben wird."

          Allgemeinplatzalarm! Wie soll man bitte wissen, dass ein Programm fehlerhaft programmiert wurde, um es dem Entwickler mitzuteilen? Das erfordert hohe Sachkenntnis, insbesondere bei der Analyse des Angriffs, und in der Regel auch das Vorliegen des Quelltextes des Programms, bzw. zumindest von dekompiliertem Objektcode. Wer das analysieren kann, kann das Programm dann wahrscheinlich auch selbst patchen oder umprogrammieren.

          "Sie selbst können lediglich die Priorität der Prozesse verwalten. Dies können Sie sich zunutze machen, indem Sie die Priorität des Programms so niedrig stellen, dass es bei einem Absturz oder einer Endlosschleife nicht die Ressourcen aller anderen Prozesse in Anspruch nimmt."

          Ein Programm, dass 200% des installierten virtuellen Speichers anfordert, wird für Speicherknappheit sorgen, egal mit welcher geringen Priorität es ausgeführt wird. Ein Programm, welches komplexe DB-Abfragen mit geringer Priorität ausführt - sowohl für den Angreifer, als auch für den legitimen Rest der Welt - ist de facto unerreichbar und daher geDoSt.

          Überhaupt konzentrierst du dich in deinem Artikel viel zu sehr auf die These "DoS wird durch Programmfehler ermöglicht" - das ist durch die Praxis nicht gestützt.

          "Die beste Erfahrung erhalten Sie zweifelsohne, wenn Sie selbst solche Angriffe programmieren, denn dann kennen Sie auch alle Tricks der Hacker und wissen um die Schwachstellen."

          Allgemeinplatzalarm! Die Witwe Bolte, die es satt hat, dass Max und Moritz ihr ihre Hühner durch den Schornstein klauen, wird nicht dadurch besser in der Abwehr von Max und Moritz, indem sie selbst dem Lehrer Hempel seine Hühner klaut.

          Und logischerweise lernt man auch nicht alle Tricks der Hacker kennen, indem man selbst mal etwas hackt. Alle Tricks lernt man kennen, indem man sich mit anderen Hackern austauscht, also "in der Szene" verkehrt. Oder eben generell gute Fachkenntnisse hat und reale Angriffe analysiert. Beides erfordert einen hohen Zeitaufwand und gutes, spezialisiertes Fachwissen - also etwas, was der gewöhnliche Systemadministrator in der Regel nicht hat.

          "Stellen Sie jedoch niemals das System ab, denn dann hat der Hacker genau das, was er wollte - den vollständigen Absturz. Auch ein Neustart wird Sie nicht vor dem Hacker schützen."

          Schon wieder so ein sinnloser und falscher Ratschlag. Wenn der DoS-Angriff Erfolg hat, dann IST der Server offline. Wenn man immerhin viel Traffic sparen kann, indem man den Server temporär vom Netz nimmt, weil er sowieso unerreichbar ist, und erforderliche fachkundige Hilfe in absehbarer Zeit nicht verfügbar ist, dann ist das lediglich eine simple und jederzeit durchführbare Maßnahme, die man auf jeden Fall ergreifen sollte.

          Und selbstverständlich kann auch ein Neustart des Servers die Situation bereinigen helfen, mindestens für eine gewisse Zeit - das ist abhängig von der Art und Hartnäckigkeit des Angriffs.

          Was man auf jeden Fall konstatieren muß: Wer Opfer eines DoS-Angriffs wird, sollte in jedem Fall darauf eingestellt sein, dass er der Gewalt weichen muß. Einen Kampf gegen möglicherweise sehr hohe Bandbreiten kann man nur gewinnen, indem man noch mehr Bandbreite (und passend konfigurierte Filter) aufbieten kann - für Geld ist alles zu kriegen, aber es ist die Sache möglicherweise nicht wert.

          "Viele Hacker erstellen so genannte „Mutationen“ aus vorhandenen Programmen und ändern oft lediglich die Signatur oder das Ziel-Betriebssystem des Programms, und erhalten so ein völlig neues DoS-Programm, wogegen sich anschließend alle Systemadministratoren neu einrichten müssen."

          DoS-Attacken gegen Programmfehler lassen sich nicht modifizieren, wie Viren oder Würmer. In diesem Sinnzusammenhang (insbesondere in der Einleitung zu den diversen Programmfehler-Angriffen wie SYN-Flooding) ist diese Aussage schlichtweg falsch. Zumal eine "Signatur" eines Angriffsprogramms bedeutungslos ist, entscheidend ist der übertragene Datenverkehr im Netzwerk, denn nur der richtet den Schaden an. Und dieser kann nicht beliebig modifiziert werden, sondern muß exakt auf die Lücke passen.

          Ich nehme Deine kostbare Zeit nur ungern für so etwas in Kauf, aber wenn man sich schon dermaßen äußert, dann sollten gleich Erläuterungen folgen. Achte jedoch auf das "Zielgruppe: Fortgeschrittene". Ich wäre Dir sehr verbunden für die Hilfestellung :~)

          Ich spare mir mal Kommentare zu den restlichen Detailabschnitten des Artikels. Unter dem Strich bleibt schon vom allgemeinen Teil nicht viel übrig (was mich selbst jetzt auch überrascht hat). Einstampfen, neuschreiben - würde ich jetzt sagen.

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
          1. Servus Sven!

            Wow! Danke für Die Mühe, die Du Dir gemacht hast! ;~)
            Du scheinst viel Erfahrung in dem Thema zu haben.
            Deine Korrekturen werde ich berücksichtigen.
            Jedoch neu schreiben... ich denke ich werde die jeweiligen Passagen vorerst nur aktualisieren.

            Großen Dank.

            Freundliche Grüße
            Stefano Albrecht

            --
            Sancta Simplicitas!
          2. Hi,

            Respekt - so viel Arbeit ohne primären Eigennutz! Danke für die Infos.

            Grüße aus Nürnberg,
            Tobias

          3. Hallo.

            "Die Bandbreitenkapazitäten eines Netzwerks beginnen bei einer normalen LAN-Topologie bei dem 10BASE-T-Standard und gehen bis zum 100BASE-T-Standard (10Mbit/s und 100Mbit/s)."

            Deine zwei genannten Standards sind bei weitem nicht die einzigen für LAN. Erstens gibts neben diesen zwei Twisted-Pair-Standards auch noch 10Base-2 mit ebenfalls 10MBit/s, zweitens heißt der schnellere Standard 100Base-Tx (es gibt auch noch Abarten wie 100Base-T4 und die Glasfaserstandards 100Base-Fx und -Sx), drittens gibt es mittlerweile auch Gigabit-Ethernet, und viertens läßt du das ganze Thema WLAN komplett außen vor, obwohl es selbstverständlich auch in das Obergebiet "LAN" gehört.

            Bei dir hört sich "LAN" aber auch nur wie ein Synonym für "Best of Ethernet und Kompatible" an.
            MfG, at