PHP-Sicherheitslücke und Schutz vor PHP-Injections. Regeln für sicheres Programmieren in PHP

Wir alle möchten auf die eine oder andere Weise sicher sein, dass niemand unsere Website oder unseren Blog hacken kann. Aber leider ist die Realität so, dass jedes System verwundbar ist, egal wie stark es geschützt ist. Alles hängt nur von den Ressourcen und der Ausdauer des Einbrechers ab... Hmm... Irgendetwas hat mich in die falsche Richtung gezogen... Betrachten wir das als Vorwort =)

Vor nicht allzu langer Zeit habe ich darüber geschrieben, wie. Aber nehmen wir an, Sie haben ein fertiges CMS genommen und wissen nicht, wie das Laden dort implementiert ist und welchen Schutz es überhaupt gibt. Natürlich werden besonders neugierige und kompetente Entwickler den Code dieses CMS studieren, bevor sie ihn auf ihre Website stellen. Aber was ist mit denen, die nicht so viel Zeit haben?

Okay, oder sagen wir mal, Sie gehören zu denen, die an Sicherheit glauben richtige Einstellung Gibt es keinen zusätzlichen Server? Wenn ja, dann willkommen bei cat.

Nein, in dem Artikel finden Sie kein Super-Duper-Plugin, das alle Daten filtert, die in allen Dateien enthalten sein müssen. Meine Idee ist, die auto_prepend_file-Direktive zu verwenden und eine Liste der zulässigen Dateien zu erstellen ... Aber im Allgemeinen lesen Sie selbst ...

Ich hatte diese Idee schon lange im Kopf, aber schließlich bin ich dazu gekommen, auch wenn es hier nichts Kompliziertes gibt, und ich konnte dieses System implementieren und einen Artikel schreiben =)

Arbeitsprinzip

Wie ich oben sagte, basiert das System auf der auto_prepend_file-Direktive in php.ini. Sie ist für die Installation des Skripts verantwortlich, das VOR der Ausführung des Hauptskripts ausgeführt wird.

Sie haben beispielsweise index.php geöffnet und vor der Ausführung wird die in auto_prepend_file angegebene Datei gestartet. Der Punkt ist, dass wir in diesem Skript die Kontrolle haben weitere Arbeit andere Skripte. Grob gesagt: Arbeiten Sie weiter und führen Sie das angeforderte Skript aus oder beenden Sie es sofort (die()).

Beispielsweise eine Situation, in der ein Angreifer über eine Sicherheitslücke eine Shell auf Ihre Website hochgeladen hat und versucht, diese in einem Browser zu öffnen. Und statt seiner Hülle wird ihm ohne Grund dieser Fehler angezeigt:

So etwas würde mich aus der Fassung bringen...

Damit mein System funktioniert, benötige ich eine Liste erlaubter Dateien; der Zugriff auf Dateien, die nicht in dieser Liste enthalten sind, wird blockiert.

(Ich weiß nicht, ob dieses Diagramm benötigt wird, es scheint, als ob alles klar sein sollte ...)

Natürlich ist das manuelle Zusammenstellen einer solchen Liste keine heikle Aufgabe, daher bin ich zu dem Schluss gekommen, dass es sinnvoll ist, den sogenannten „Lernmodus“ zu implementieren. Ein Modus, in dem alle Aufrufe aller Skripte automatisch zur Liste der zulässigen Dateien hinzugefügt werden.

Was bringt das? Sie können dieses System im Trainingsmodus ausführen und Ihre Website weiterhin nutzen. Während Sie es verwenden, wird Ihre Datenbank mit den von Ihnen verwendeten Seiten aufgefüllt (entschuldigen Sie das Wortspiel). Nehmen wir an, in ein oder zwei Monaten wird Ihre Liste alle Dateien enthalten, die sich auf Ihre Website beziehen (auf die Sie direkt zugegriffen haben).

Beachten Sie, dass die Liste nur die Dateien enthält, mit denen Sie direkt arbeiten. Die durchschnittliche Website-Engine verfügt über eine Reihe von Plug-in-Dateien (mit Klassen, Funktionen, Bibliotheken, Modulen usw.). Diese Dateien werden nicht in diese Liste aufgenommen und der Zugriff darauf wird in Zukunft auf der Ebene von blockiert unser Schutz (natürlich haben durchschnittliche Motoren einen Schutz gegen Direktstart, aber plötzlich fehlt dieser Schutz irgendwo).

Was wir tun können

Da es sich um ein Konzept handelt, können wir nicht viel tun.

  • Blockierung nicht autorisierter Skripte (eigentlich die Hauptfunktion). Aber auch dies ist anpassbar, Sie müssen die Verbindung nicht blockieren, sondern einfach den Administrator per E-Mail benachrichtigen
  • Benachrichtigung über unzulässige Anfragen an den Administrator per E-Mail (Kurzbericht oder vollständiger Bericht, letzterer enthält Paketheader und Daten). POST-Anfrage Falls vorhanden)
  • Sie können die IP des Administrators angeben, der Zugriff auf alle Skripte hat, d. h. dieses System es wird nicht beeinträchtigt (diese IPs nehmen nicht am Trainingsmodus teil). Beispielsweise müssen Sie jetzt keine Software wie PhpMyAdmin, SupexDumper und andere Systemdienstprogramme mit .htaccess schließen.
  • Ksati-IP-Adressen unterstützen einfache Masken =)
  • Vollständig kommentierter Code und jede Konfigurationsanweisung im Detail beschrieben
  • Ich weiß nicht, was sonst...
Einstellungen

Lassen Sie uns nun darüber sprechen, wie Sie diesen Schutz in Ihre Website integrieren können ...

Dazu benötigen Sie Zugriff auf die Datei php.ini

  • Laden Sie zunächst das Skript selbst herunter: PrependSecuritySystem
  • Entpacken Sie den Inhalt des Archivs (data.txt und main.php) in einen Ordner auf dem Server, vorzugsweise in einen Ordner, der nicht über das Internet zugänglich ist (nicht notwendig, da es an jedem Ort funktioniert, es ist sinnvoll, es aufzubewahren). das Drehbuch aus den Augen eines Angreifers fernhalten)
  • Öffnen Sie die Datei main.php und bearbeiten Sie die Einstellungen. Es ist notwendig, die IP-Adresse und E-Mail-Adresse des Administrators zu ändern. Die restlichen Einstellungen liegen in Ihrem Ermessen.
  • Zugriffsrechte auf entpackte Dateien festlegen. Unter Nicks empfiehlt es sich, für beide Dateien den Besitzer zu ändern, anders als der Benutzer, unter dem der Webserver läuft. Die Datei main.php muss für alle beschreibbar sein. Für die Datei data.txt müssen Sie Lese- und Schreibberechtigungen für alle festlegen (dies ist temporär, für die Dauer des Trainings).
  • Öffnen Sie php.ini und geben Sie Folgendes ein:
    auto_prepend_file=[Pfad zur entpackten main.php-Datei]
  • MIT in diesem Moment Das Systemtraining beginnt. Wir warten eine gewisse Zeit, die Ihrer Meinung nach ausreicht, um dieses System vollständig zu trainieren.
  • Öffnen Sie am Ende des Trainings die Datei main.php, bearbeiten Sie die Konstante PSS_STATUS_BLOCK, setzen Sie ihren Wert auf true und speichern Sie sie
  • Ändern Sie die Zugriffsrechte auf die Datei data.txt. Wir verbieten die Bearbeitung Diese Datei für alle.
  • Jetzt ist das System in den Blockierungsmodus für nicht autorisierte Skripte geschaltet
  • Natürlich gibt es viele Schritte, aber ich denke, dass sogar ein Kind damit umgehen kann.

    Wenn Sie das System neu trainieren müssen (von Grund auf neu oder durch Ergänzungen), müssen Sie Folgendes tun:

  • Erlauben Sie das Schreiben in die Datei data.txt
  • Löschen Sie den Inhalt von data.txt (NUR, wenn Sie das System von Grund auf neu trainieren müssen)
  • Bearbeiten Sie die Konstante PSS_STATUS_BLOCK in der Datei main.php und setzen Sie ihren Wert auf „false“.
  • Wir schulen um...
  • Bearbeiten Sie am Ende des erneuten Trainings die Konstante PSS_STATUS_BLOCK und setzen Sie ihren Wert wieder auf „true“.
  • Wir verbieten das Schreiben der data.txt-Datei
  • Nun zum Traurigen

    Ich werde nicht lügen, und jetzt erzähle ich Ihnen von den Mängeln.

    • Der vielleicht größte Nachteil, gegenüber dem alle anderen im Vergleich verblassen, besteht darin, dass dieses System umgangen werden kann. Sie fragen sich vielleicht: Wie kann das sein? Alles ist ganz einfach, die Direktive auto_prepend_file kann auch in .htaccess angegeben werden. Und wenn man es nüchtern angeht: Wenn ein Angreifer plötzlich in der Lage wäre, die Shell zu überfluten, dann wird er wahrscheinlich auch in der Lage sein, seine .htaccess-Datei zu überfluten, in der er die ursprüngliche Direktive deaktivieren kann.
      Dies funktioniert nur unter Apache, aber beispielsweise unter Nginx funktioniert dieser Trick nicht (Nginx hat keine .htaccess-Dateien). ABER! Unter Nginx können Sie generell hochladen.
    • Ein Angreifer kann ein „erlaubtes“ Skript bearbeiten, wenn er über gültige Rechte dazu verfügt, und unser System kann leider nichts dagegen tun. Es sei denn, Sie müssen für alle ausführbaren Dateien die richtigen Berechtigungen festlegen
    • Neben PHP gibt es auch alle möglichen Perl-, CGI- usw.... dieses System funktioniert damit nicht.
    • Zusätzliche Belastung. Aber sie dachten, diese Belastung würde spürbar sein.

    Aus diesem Grund kann ein solches ursprüngliches System anscheinend nicht als ideal bezeichnet werden. Aber es eignet sich durchaus als einfache vorbeugende Maßnahme, die nicht die hartnäckigsten Einbrecher aufhält. Zumindest kann dieses System dem Angreifer die Zeit nehmen, einen Angriff auszuführen. Beispielsweise benachrichtigt das System den Administrator über einen Hacking-Versuch und gibt ihm so die Möglichkeit, die Schwachstelle zu beseitigen, bis der Angreifer den Grund für sein Versagen versteht.

    Abschluss

    Dennoch ist dies auf die eine oder andere Weise ein Konzept, vielleicht können Sie sich darauf basierend etwas Besseres einfallen lassen. Oder vielleicht passt mein System zu Ihnen.

    Meiner Meinung nach gibt es nie zu viel angemessenen Schutz. Ob Sie so etwas verwenden oder nicht, liegt auf Ihren Websites bei Ihnen.

    Puh. Nun ja, schrieb ich, ich war fast den ganzen Tag weg. Tut mir leid, wenn ich es etwas chaotisch beschrieben habe. Stellen Sie Ihre Fragen im Allgemeinen in den Kommentaren. Ich werde versuchen, sie zu beantworten.

    PS: Obwohl ich so angemessen wie möglich codiert habe, kann das Skript Fehler aufweisen. Getestet unter Win/Apache/PHP 5.2 - alles war in Ordnung.

    Überall auf der Welt ist auf Flughäfen der Slogan „Sicherheit ist kein Scherz“ zu finden. Immer derselbe Slogan Systemadministrator hätte es neben meinem PHP-Server anheften sollen. Und jeder, der eine Verbindung zu einem Server im Internet herstellt, muss angemessene Sicherheitsmaßnahmen ergreifen, sonst riskiert er, Daten und sogar Geld an böswillige Hacker zu verlieren. Software können mit der Tastatur ihres Computers Schaden anrichten.

    Ein Website-Entwickler, der über Sicherheitsprobleme besorgt ist, muss ständig wiederholen: „Vertrauen Sie dem Netzwerk nicht.“ Wenn Sie Bedenken hinsichtlich des Schutzes Ihrer Website haben, wiederholen Sie diese Aussage beim Codieren zukünftiger Seiten Ihrer Website. Alle über das Netzwerk an den Server übertragenen Informationen (sei es URL, Daten von HTML-Formulare oder Daten, die über andere eingehen Netzwerk-Port), sollte als potenziell gefährlich angesehen werden. In diesem Artikel werden verschiedene Methoden zur Sicherung eingehender Informationen vorgeschlagen. Man muss diese Methoden nicht nur anwenden, sondern auch darauf achten bestimmte Zeit andere potenzielle Gefahren zu identifizieren und Wege zu finden, diese zu verhindern.

    Die zweite Faustregel für die Erstellung einer sicheren Website lautet: „Minimieren Sie den Schaden.“ Was passiert, wenn sich das von Ihnen geschriebene Programm, das Sie für absolut zuverlässig halten, tatsächlich als anfällig erweist? Auch nur um drinnen zu bleiben absolute Sicherheit, begrenzen Sie den Schaden, den ein Angreifer durch die Ausnutzung dieser Sicherheitslücke anrichten könnte.

    Wenn Besucher Ihre Website besuchen, hoffen sie, dass die Website gültige Informationen enthält, die ihnen oder ihren Computern keinen Schaden zufügen, und dass die von ihnen bereitgestellten Informationen ordnungsgemäß behandelt werden. Bei der Interaktion mit einer Website besteht für einen Besucher immer ein gewisses Risiko einer Sicherheitsverletzung, unabhängig davon, ob es sich um eine Unterhaltungs-, Informations- oder E-Commerce-Website handelt. Die Verantwortung für den Schutz der Besucher vor solchen Risiken liegt beim Website-Designer. Das bedeutet, dass Sie nicht nur die von Besuchern bereitgestellten Informationen sicher auf Ihrem Server speichern müssen, sondern auch Maßnahmen ergreifen müssen, um die bereitgestellten Informationen zu schützen, während sie von den Computern der Besucher auf Ihren Server übertragen werden.

    Aber all diese Überlegungen sollten Ihren Absichten, beispielsweise Ihre E-Commerce-Website online zu stellen, nicht im Wege stehen.

    Mögliche Angriffe

    Das Anschließen eines Servers an das Internet kann mit der Eröffnung eines Ladens an einer belebten Straße verglichen werden. Sie möchten viele Besucher haben, aber wenn Sie keine Vorkehrungen treffen, kann es sein, dass nicht gewöhnliche Besucher, sondern sehr unerwünschte Gäste Ihre Nachlässigkeit ausnutzen.

    Gewöhnlich Hacker Nennen Sie diejenigen, die korrekter benannt werden würden Einbrecher Softwareschutz . In der Computerwelt sind Sicherheitsknacker Spezialisten, die mit Glück oder Geschick Sicherheitslücken überwinden Computersysteme und Schäden verursachen. Und Hacker sind Programmierer, die meisterhaft Programme schreiben können und nicht nur in der Lage sind, komplexen Code zu verstehen, sondern auch selbstständig effektiven (und für Außenstehende oft unzugänglichen) Code in vielen Sprachen zu schreiben. Für einen Programmierer ist der Erwerb des Titels „Hacker“ eine Ehre, und der Titel „Software-Cracker“ bedeutet offenbar, dass sein Besitzer ein Auge auf die „Gesucht“-Beiträge haben muss.

    Da sie sich nicht darüber im Klaren sind, wie demütigend der Titel „Software-Cracker“ ist, beschreiten viele unerfahrene Programmierer diesen Weg, indem sie auf Tools und Skripte zurückgreifen, die sie im Internet finden. Solche unerfahrenen Cracker nennt man Script-Kiddies oder in unserer Sprache Kulhatsker. Diese Menschen verstehen oft kaum, was sie tun. Typischerweise steckt diese Kategorie von Tätern hinter primitiven Angriffen wie Website-Kompromittierung, XSS- und SQL-Injections.

    Kompromittierung der Website und XSS-Angriffe

    Fälle von Website-Kompromittierung, die oft eher ein Ärgernis als wirklich schädlich sind, kommen recht häufig vor, da viele Websites einem Software-Sicherheitshacker die Möglichkeit bieten, der Welt zu verkünden, dass es ihm gelungen ist, sein Ziel zu erreichen. Um eine schlecht gestaltete Website zu kompromittieren, genügt manchmal die Verwendung eines Webbrowsers. Betrachten Sie zum Beispiel das folgende Programm:

    Seite mit einem einfachen Formular zum Hinzufügen von Kommentaren. PHP-Grundlagen

    Dieses Programm implementiert ein Kommentarsystem in einer sehr primitiven Form (wenn Sie mein PHP-Tutorial von Anfang an studieren, sind Sie möglicherweise noch nicht mit Datenbankoperationen vertraut; wenn ja, empfehle ich Ihnen, zu diesem Artikel zurückzukehren, nachdem Sie die relevanten Informationen gelesen haben Material zu MySQL).

    Beim Lesen dieses Codes beginnt ein erfahrener Programmierer, sich nicht ganz sicher zu fühlen (denken Sie daran: „Vertrauen Sie dem Netzwerk nicht“). Ein solches Programm akzeptiert Formulardaten, von denen erwartet wird, dass sie Kommentartext enthalten. Dieser Text wird der Variablen $comment zugewiesen und in der Datenbank gespeichert, um zukünftigen Besuchern angezeigt zu werden. Wenn die eingegebenen Daten unseren Erwartungen entsprechen, liegt kein Problem vor.

    Versetzen Sie sich nun für einen Moment in die Lage des Kühlers und stellen Sie sich vor, was passieren würde, wenn die Eingabe HTML-Deskriptoren enthalten würde. Das einfaches Programm fügt solche Deskriptoren automatisch in die generierte Seite ein und diese verzerrte Seite wird in den Browsern anderer Besucher statt wie gewohnt angezeigt. Ein Deskriptor, der aus Sicht der Datensicherheit besonders gefährlich sein kann, ist der . Ein Sicherheitsknacker könnte den folgenden Kommentar einfügen:

    Einschleusung von bösartigem JavaScript-Code

    Diese Art von Angriff wird als bekannt Cross-Site-Scripting oder XSS. Nach dem Schließen und Öffnen dieser Seite erhält der Browser ein solches Handle und beginnt sofort mit dem Laden der Seite der gefälschten Site und nicht der Seite der gehackten Site. Mit ein wenig Einfallsreichtum kann ein Sicherheitshacker dann das Vertrauen der Besucher in Ihre Website ausnutzen, um persönliche Informationen wie Passwörter oder Kreditkartennummern abzugreifen (durch Phishing, bei dem das Design und die Struktur einer bösartigen Website nachgeahmt werden, um sie zu ähneln). die gehackte Seite).

    Die Lösung für ein solches Problem besteht darin, dass die Eingabedaten aus Sicherheitsgründen vorverarbeitet werden sollten. In diesem Fall ist es notwendig, alle Zeichen, die für den Browser eine besondere Bedeutung haben, in eine sichere Form umzuwandeln. Glücklicherweise verfügt PHP über eine Möglichkeit, genau diese Konvertierung durchzuführen. Die Funktion htmlentities() wandelt die Zeichen , „ und & in Darstellungen dieser Zeichen in Form sogenannter HTML-Zeichenentitäten (z. B

    Wird geladen...
    Spitze