Heim > Backend-Entwicklung > PHP-Tutorial > PHP automatisierte White-Box-Audit-Technologie und -Implementierung

PHP automatisierte White-Box-Audit-Technologie und -Implementierung

WBOY
Freigeben: 2016-08-08 09:23:31
Original
1494 Leute haben es durchsucht

0x00 Vorwort


In China gibt es nur wenige veröffentlichte technische Materialien für automatisierte PHP-Prüfungen. Im Ausland hingegen sind relativ hervorragende automatisierte Prüfimplementierungen erschienen . Führen Sie als Grundlage eine Reihe von Codeanalysen durch. Herkömmliche statische Analysetechniken wie Datenflussanalyse und Verschmutzungsausbreitungsanalyse werden relativ selten auf dynamische Skriptsprachenanalysen wie PHP angewendet, sind jedoch ein wichtiger technischer Punkt bei der Realisierung der White-Box-Automatisierungstechnologie. Heute stellt der Autor hauptsächlich die neuesten Forschungs- und Implementierungsergebnisse vor. Ich hoffe, dass mehr inländische Sicherheitsforscher ihre Energie dem sinnvollen Bereich der automatisierten PHP-Prüfungstechnologie widmen werden.

0x01 Grundkenntnisse


Es gibt viele Möglichkeiten, automatisierte Prüfungen zu implementieren, z. B. die direkte Verwendung der Regelbasis für reguläre Ausdrücke für den Standortabgleich. Diese Methode ist die einfachste, weist jedoch die geringsten Kosten auf Genauigkeit von. Die zuverlässigste Idee besteht darin, das Design auf der Grundlage von Kenntnissen im Bereich der statischen Analysetechnologie zu entwerfen. Im Allgemeinen hat der Prozess der statischen Analyse-Sicherheitstools meist die folgende Abbildung:

Das erste, was bei der statischen Analyse zu tun ist, besteht darin, den Quellcode zu modellieren, um den Quellcode der Zeichenfolge in eine Zwischendarstellung umzuwandeln, die für unsere nachfolgende Schwachstellenanalyse geeignet ist, dh in eine Reihe von Datenstrukturen repräsentiert diesen Code. Methoden aus dem Bereich der Kompilierungstechnologie werden im Allgemeinen bei Modellierungsarbeiten verwendet, beispielsweise bei der lexikalischen Analyse zur Generierung von Token, abstrakten Syntaxbäumen und Kontrollflussdiagrammen. Die Qualität der Modellierungsarbeit wirkt sich direkt auf die Ergebnisse der nachfolgenden Analyse der Ausbreitung der Verschmutzung und der Datenflussanalyse aus.
Bei der Ausführungsanalyse werden Sicherheitskenntnisse kombiniert, um Schwachstellen im geladenen Code zu analysieren und zu verarbeiten. Schließlich muss das statische Analysetool Beurteilungsergebnisse generieren, um diese Arbeitsphase abzuschließen.

0x02-Implementierungsidee


Nach einer Zeit harter Arbeit haben der Autor und meine Freunde grob ein statisches Analysetool für die Automatisierung implementiert. Die spezifische Implementierungsidee verwendet statische Analysetechnologie. Wenn Sie die Implementierungsidee eingehend verstehen möchten, können Sie die zuvor veröffentlichten Artikel lesen.
Im Tool läuft der automatisierte Prüfungsprozess wie folgt ab:

  • Laden Sie zunächst alle PHP-Dateien in das zu scannende Projektverzeichnis, das von der eingegeben wurde Wenn es sich bei der gescannten PHP-Datei um die Hauptdatei handelt, also um die PHP-Datei, die die Anfrage des Benutzers tatsächlich verarbeitet, führen Sie eine Schwachstellenanalyse für diesen Dateityp durch. Wenn es sich nicht um einen Hauptdateityp handelt, beispielsweise eine Klassendefinitions- oder Toolfunktionsdefinitionsdatei in einem PHP-Projekt, wird sie ohne Analyse übersprungen.
  • Zweitens sammeln Sie globale Daten und konzentrieren sich dabei auf die Definition von Klasseninformationen im zu scannenden Projekt, z. B. den Dateipfad, in dem sich die Klasse befindet, die Attribute in der Klasse, die Methoden und Parameter in der Klasse , und andere Informationen. Gleichzeitig wird für jede Datei eine Dateizusammenfassung erstellt. Die Dateizusammenfassung konzentriert sich auf das Sammeln der Informationen jeder Zuweisungsanweisung sowie der Reinigungsinformationen und Codierungsinformationen der relevanten Variablen in der Zuweisungsanweisung.
  • Kompilieren Sie nach der globalen Initialisierung das Frontend-Modul und erstellen Sie mit dem Open-Source-Tool PHP-Parser einen abstrakten Syntaxbaum (AST) für den zu analysierenden PHP-Code. Basierend auf AST wird der CFG-Konstruktionsalgorithmus verwendet, um das Kontrollflussdiagramm zu erstellen und zusammenfassende Informationen der Basisblöcke in Echtzeit zu generieren.
  • Wenn während der Kompilierung des Front-Ends Aufrufe sensibler Funktionen gefunden werden, stoppen Sie die Ausbreitungsanalyse der Verschmutzung und führen Sie sie durch. Führen Sie eine Interprozessanalyse und eine Intraprozessanalyse durch, um die entsprechenden fehlerhaften Daten zu finden. Anschließend werden die gereinigten und codierten Informationen anhand der während des Datenflussanalyseprozesses gesammelten Informationen beurteilt, um festzustellen, ob es sich um einen anfälligen Code handelt.
    Wenn es sich im vorherigen Schritt um anfälligen Code handelt, übertragen Sie ihn an das Schwachstellen-Berichtsmodul, um anfällige Codesegmente zu sammeln. Die Grundlage seiner Implementierung besteht darin, ein Single-Mode-Ergebnissatz-Kontextobjekt in der Systemumgebung zu verwalten. Wenn ein Schwachstellendatensatz generiert wird, wird er dem Ergebnissatz hinzugefügt. Nach den Ergebnissen des gesamten Scanprojekts wird Smarty verwendet, um den Ergebnissatz an das Frontend auszugeben, und das Frontend visualisiert die Scanergebnisse.

0x03 Initialisierungsarbeit


Wenn wir bei einem echten PHP-Audit auf Aufrufe sensibler Funktionen wie mysql_query stoßen, können wir nicht anders, als den ersten Parameter manuell zu analysieren, um zu sehen, ob er kontrollierbar ist. Tatsächlich kapseln viele CMS einige Datenbankabfragemethoden, um sie bequem aufzurufen und die Programmlogik klar zu gestalten, z. B. indem sie sie in eine MysqlDB-Klasse kapseln. Zu diesem Zeitpunkt werden wir während der Prüfung nicht nach dem Schlüsselwort mysql_query suchen, sondern nach Aufrufen wie db->getOne.
Die Frage ist also: Woher weiß man bei der Analyse durch das automatisierte Programm, dass die Funktion db->getOne eine Datenbankzugriffsklassenmethode ist?
Dies erfordert das Sammeln aller Klassen und definierten Methoden des gesamten Projekts in der frühen Phase der automatisierten Analyse, damit das Programm die Methodenkörper finden kann, die während der Analyse weiterverfolgt werden müssen.
Die Sammlung von Klasseninformationen und Methodeninformationen sollte im Rahmen der Framework-Initialisierung abgeschlossen und im Singleton-Kontext gespeichert werden:

Gleichzeitig muss festgestellt werden, ob es sich bei der analysierten PHP-Datei um die Datei handelt, die tatsächlich Benutzeranforderungen verarbeitet, da in einigen CMS gekapselte Klassen im Allgemeinen in separate Dateien geschrieben werden, z. B. Datenbankoperationsklassen oder gekapselte Dateioperationsklassen in Dateien. Für diese Dateien ist es sinnlos, eine Analyse der Verschmutzungsausbreitung durchzuführen, daher müssen sie bei der Initialisierung des Frameworks identifiziert werden. Das Prinzip ist sehr einfach. Analysieren Sie den Anteil der aufrufenden Typanweisungen und der Definition der Typanweisungen und treffen Sie Beurteilungen basierend auf Schwellenwerten. Die Fehlerquote ist sehr gering.
Führen Sie abschließend eine Zusammenfassungsoperation für jede Datei durch. Der Zweck dieses Schritts besteht darin, eine dateiübergreifende Analyse durchzuführen, wenn bei der nachfolgenden Analyse auf Anweisungen vom Typ „require“, „include“ und „andere“ gestoßen wird. Sammelt hauptsächlich Informationen zur Variablenzuweisung, Variablenkodierung und Variablenreinigung.

0x04 Benutzerfunktionsverarbeitung


Häufige Web-Schwachstellen werden im Allgemeinen durch gefährliche Parameter verursacht, die vom Benutzer kontrolliert werden können. Diese Art von Schwachstelle wird als Schwachstelle vom Typ „Taint“ bezeichnet, z. B. die allgemeine SQLI , XSS usw.
Einige der in PHP integrierten Funktionen sind von Natur aus gefährlich, z. B. Echo, das zu reflektiertem XSS führen kann. In echtem Code ruft jedoch niemand einige integrierte Funktionen direkt auf, sondern kapselt sie erneut als benutzerdefinierte Funktionen, z. B.:

<code><span><span>function</span><span>myexec</span><span>(<span>$cmd</span>)</span>
{</span>
    exec(<span>$cmd</span>) ;
}</code>
Nach dem Login kopieren

In der Implementierung lautet unser Verarbeitungsablauf:

  • Verwenden Sie die während der Initialisierung erhaltenen Kontextinformationen, um das entsprechende Methodencodesegment zu finden
  • Analysieren Sie dieses Codefragment und finden Sie die gefährliche Funktion (hier exec)
  • Lokalisieren Sie die gefährlichen Parameter in der gefährlichen Funktion (hier ist cmd)
  • Wenn bei der Analyse keine Reinigungsinformationen gefunden werden, bedeutet dies, dass der Parameter infiziert sein kann und dem ersten Parameter cmd der Benutzerfunktion myexec zugeordnet wird Speichern Sie diese benutzerdefinierte Funktion in der Kontextstruktur als gefährliche Funktion
  • Kehren Sie rekursiv zurück und starten Sie den Taint-Analyseprozess

In einem Satz zusammengefasst, folgen wir In Überprüfen Sie anhand der entsprechenden Klassenmethoden, statischen Methoden und Funktionen, ob gefährliche Funktionen und Parameter aus diesen Codesegmenten aufgerufen werden. Die Speicherorte dieser in PHP integrierten gefährlichen Funktionen und Parameter werden zur Konfiguration eingefügt Wenn Funktionen und Parameter erkannt werden und die gefährlichen Parameter nicht gefiltert werden, wird die benutzerdefinierte Funktion als benutzerdefinierte gefährliche Funktion verwendet. Sobald festgestellt wird, dass diese Funktionen in der nachfolgenden Analyse aufgerufen werden, wird sofort mit der Taint-Analyse begonnen.

0x05 Verarbeitung der Reinigung und Kodierung von Variablen


Sobald wir im echten Prüfungsprozess feststellen, dass gefährliche Parameter kontrollierbar sind, können wir es kaum erwarten herauszufinden, ob der Programmierer dies getan hat Filtern oder kodieren Sie die Variable effektiv, um festzustellen, ob eine Schwachstelle vorliegt.
Auch die automatisierte Prüfung folgt diesem Gedanken. Bei der Implementierung müssen zunächst Statistiken und Konfigurationen für jede Sicherheitsfunktion in PHP durchgeführt werden. Während der Programmanalyse sollten nachträglich für jede Datenflussinformation die erforderlichen Reinigungs- und Codierungsinformationen gesammelt werden, wie zum Beispiel:

<code><span>$a</span> = <span>$_GET</span>[<span>'a'</span>] ;
<span>$a</span> = intval(<span>$a</span>) ;
<span>echo</span><span>$a</span> ;
<span>$a</span> = htmlspecialchars(<span>$a</span>) ;
mysql_query(<span>$a</span>) ;</code>
Nach dem Login kopieren

Der obige Codeausschnitt sieht etwas seltsam aus, dient aber nur zu Demonstrationszwecken. Wie aus dem Codeausschnitt hervorgeht, wurde die Variable a durch intval und htmlspecialchars bereinigt. Gemäß der Konfigurationsdatei haben wir diese Informationen erfolgreich gesammelt. Zu diesem Zeitpunkt wird ein Backtracking durchgeführt, um die Reinigungs- und Codierungsinformationen ab der aktuellen Codezeile nach oben zusammenzuführen.
In der dritten Zeile beträgt die Reinigungsinformation der Variablen a beispielsweise nur ein Intervall, in der fünften Zeile müssen die Reinigungsinformationen der Variablen a jedoch zusammengeführt und in einem Listensatz aus intval und htmlspecialchars gesammelt werden um alle Datenströme im Vorgängercode zu sammeln und ein Backtracking durchzuführen.

Das Detail besteht darin, dass, wenn der Benutzer gleichzeitig zwei Funktionen wie base64_encode und base64_decode für dieselbe Variable aufruft, die Base64-Codierung der Variablen entfernt wird. Wenn Escape- und Anti-Escape-Vorgänge gleichzeitig durchgeführt werden, müssen diese ebenfalls beseitigt werden. Aber wenn die Aufrufreihenfolge falsch ist oder nur eine Dekodierung durchgeführt wird, dann ist das ziemlich gefährlich.

0x06 Variablen-Backtracking und Taint-Analyse


1. Variablen-Backtracking

Um die Parameter (traceSymbol) aller gefährlichen Senkenpunkte herauszufinden, werden alle mit dem aktuellen Block verbundenen Basisblöcke vorwärts verfolgt. Der spezifische Prozess ist wie folgt:

  • Schleife den aktuellen Basisblock. Suchen Sie an allen Eingangskanten des Blocks nach unbereinigtem TraceSymbol und suchen Sie nach dem Namen des TraceSymbols im DataFlow-Attribut des Basisblocks.
  • Wenn es einmal gefunden wurde, ersetzen Sie es durch das zugeordnete Symbol und kopieren Sie alle Reinigungsinformationen und Codierungsinformationen des Symbols. Die Nachverfolgung erfolgt dann an allen Eingängen.
  • Schließlich werden die Ergebnisse auf verschiedenen Pfaden auf CFG zurückgegeben.

Wenn TraceSymbol einem statischen Objekt wie einer statischen Zeichenfolge, Zahl usw. zugeordnet wird oder der aktuelle Basisblock keine Eintrittskante hat, stoppt der Algorithmus. Wenn TraceSymbol eine Variable oder ein Array ist, prüfen Sie, ob es sich im superglobalen Array befindet.

2. Taint-Analyse

Die Taint-Analyse beginnt während der prozessübergreifenden Analyse integrierter und benutzerdefinierter Funktionen. Wenn während der Programmanalyse ein sensibler Funktionsaufruf auftritt, verwenden Sie Backtracking oder beginnen Sie mit Ermitteln Sie den Kontext und starten Sie die Taint-Analyse. Für Laien geht es darum, zu beurteilen, ob gefährliche Parameter Schwachstellen verursachen können. Die Taint-Analyse-Arbeit ist im Code implementiert TaintAnalyser Nach Erhalt der gefährlichen Parameter sind die spezifischen Schritte wie folgt:

  • Suchen Sie zunächst nach der Zuweisung gefährlicher Parameter im Strom Basisblock und suchen Sie nach DataFlow. Ob sich im rechten Knoten von GET Das Obige stellt die Technologie und Implementierung der automatisierten PHP-White-Box-Prüfung vor, einschließlich ihrer Aspekte. Ich hoffe, dass es für Freunde hilfreich sein wird, die sich für PHP-Tutorials interessieren.
Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage