it-swarm.com.de

PHP Datei_get_contents Sicherheitslücke

Ich überprüfe die Sicherheit eines Webportals für einen Kunden und habe eine Sicherheitsanfälligkeit festgestellt.

Dies ist der PHP Code:

echo(file_get_contents("template/data/" $_GET['id']));

Ich konnte erfolgreich ../../../index.php, config.php usw. lesen.

Aber ich möchte nur beweisen können, dass dieser Fehler kritischer ist als das Lesen von Konfigurationen. Ich habe den MySQL-Benutzer/Pass gelesen, kann aber keine Verbindung herstellen, da er nur auf localhost abhört. Alle anderen Codes, die ich las, führten zu nichts. Im Grunde war alles, was ich bekam, nur ein Quellcode, der irgendwie kein Geheimnis war.

Ich kann keine PHP-Filter-Sachen machen, weil es "template/data /" am Anfang des Strings hat.

Was kann man mit diesem anfälligen Code noch tun? Irgendwelche Ideen?

7
GMX Rider

Befindet sich die MySQL-Datenbank auf demselben Computer? Wenn ja, können Sie einfach die Datenbankdateien abrufen und die Datenbank auf Ihrem Computer rekonstruieren?

Wie andere angegeben haben, können Sie/etc/passwd abrufen, das viele Informationen zum Benutzerlayout enthält. Wenn Sie auf/etc/shadow zugreifen können, können Sie versuchen, Kennwörter offline zu knacken.

Wenn die Webanwendung über ein Anmeldeportal verfügt, versuchen Sie, die MySQL-Anmeldeinformationen sowie "admin", "root" usw. mit dem Kennwort einzugeben.

Enthält der Quellcode oder die Konfigurationsdateien andere Zugriffsdaten/API-Schlüssel? Ist das SSL-Zertifikat der Site lesbar - wenn ja, können Sie Man In the Middle-Verbindungen herstellen?

Sie können auch Details aus/proc/version,/etc/issue usw. und den Webserver-Versionen abrufen, um nach anderen bekannten Sicherheitslücken zu suchen.

Schließlich soll die Quelle öffentlich sein? Wenn nicht, wird Quellcode oft als wertvoll angesehen. Und Sie können dies auf weitere Schwachstellen untersuchen.

5
Hector

Hectors Antwort enthält einige gute Beispiele, aber ich möchte noch einen weiteren sehr wichtigen Punkt hervorheben:

Dies ist keine kleine Sicherheitslücke

Sie scheinen den Eindruck zu haben, dass die Sicherheitsanfälligkeit nicht wirklich eine Sicherheitsanfälligkeit ist, wenn Sie nur beliebige Dateien auf ihrem System lesen können. Ich würde genau das Gegenteil argumentieren. Sie müssen sich darüber im Klaren sein, dass Sicherheit am besten aus der Perspektive einer eingehenden Verteidigung angegangen werden kann. Es kann praktisch unmöglich sein, ein System ohne Sicherheitslücken zu haben. Ziel ist es daher, in möglichst vielen Bereichen so viele Verteidigungsebenen wie möglich zu haben, damit die Verteidigung im gesamten System verteidigt, wenn ein böswilliger Akteur in einem Bereich eine Schwäche findet verhindert, dass sie echten Schaden anrichten. Viele reale Verstöße treten auf, nicht weil es eine Sicherheitslücke gab, die jemand ausgenutzt hat, sondern weil es eine Sicherheitslücke gab, die es ihnen ermöglichte, eine andere Sicherheitslücke auszunutzen, die es ihnen ermöglichte, etwas anderes zu tun, bis sie etwas fanden wirklich = gefährlich.

Diese kleine Sicherheitsanfälligkeit ermöglicht böswilligen Akteuren den vollständigen Lesezugriff auf Ihr System. Dies wird durch die Tatsache weiter verstärkt, dass dies ein ziemlich offensichtlicher Sicherheitsfehler war. Wenn das betreffende Unternehmen gut ausgebildete Entwickler hatte und regelmäßig Codeüberprüfungen durchführte, ist es (IMO) sehr unwahrscheinlich, dass ein solcher Code in ein Produktionssystem gelangt. Die Bedeutung dieser Tatsache besteht darin, dass dies nicht die einzige vorhandene Sicherheitslücke sein wird. Die Tatsache, dass Sie jetzt die Möglichkeit haben, den Quellcode des Systems direkt anzuzeigen, bedeutet, dass das Auffinden weiterer Sicherheitslücken wesentlich einfacher ist. Möglicherweise ist das Spiel vorbei. Wäre ich ein bösartiger Schauspieler und hätte ich Folgendes gefunden:

  1. Laden Sie den Quellcode des gesamten Systems herunter (kann einen Tag dauern, ist aber mit ziemlicher Sicherheit möglich)
  2. Suchen Sie nach SQLi-Schwachstellen (es gibt wahrscheinlich viele) und laden Sie damit die gesamte Datenbank herunter. Ich würde sagen, es gibt gute Chancen, dass sie nicht die richtige Passwortsicherheit verwenden. Aus ihrem Quellcode geht hervor, dass ich aufgrund einer SQLi-Sicherheitsanfälligkeit Folgendes tun kann, wenn sie ihre Passwörter nicht ordnungsgemäß sichern.
  3. Brute Force die Administratorkennwörter. Jetzt bin ich in Ihrem Webportal. Aber rate mal was? ich bin nicht fertig
  4. Die meisten Geschäftsbenutzer verwenden Kennwörter ständig wieder. Jetzt nehme ich das Administratorkennwort und überprüfe, ob ich mich bei ihrem eigenen E-Mail-Konto anmelden kann. Von dort aus kann ich mit etwas Glück in die Verwaltung des Hosting-Kontos einsteigen. Oder vielleicht Gehaltsabrechnung oder Bankkonten. Der Himmel ist das Limit, sobald ich Ihr E-Mail-Passwort habe, insbesondere für ein Administratorkonto. Es ist sogar noch besser, wenn die E-Mail-Adresse des Unternehmens von einem Cloud-Hosting-Anbieter (Office 365 oder ähnlichem) gehostet wird und das von mir geknackte Administratorkennwort mir Zugriff auf den E-Mail-Hosting-Anbieter gewährt. Dadurch habe ich Zugriff auf jede einzelne E-Mail-Adresse im Unternehmen.
  5. Vielleicht habe ich zwar eine SQLi-Sicherheitslücke gefunden und die Datenbank heruntergeladen, aber sie hatten eine gute Passwortsicherheit und ich konnte nichts knacken. Jetzt suche ich nach XSS-Schwachstellen in Ihrem Quellcode. Ein paar einfache Social-Engineering-E-Mails und ich verwenden XSS, um Zugriff auf ein Administratorkonto auf dem System zu erhalten, ohne das Kennwort zu kennen. Was jetzt?
  6. Ich wette, es gibt Bereiche des Systems, in denen ein Administrator das System aktualisieren kann. Haben sie ein CMS? Verfügt es über Funktionen wie WordPress usw., mit denen Administratoren Vorlagen über das Webportal bearbeiten können? Denn wenn ja, habe ich damit eine Hintertür auf dem Computer installiert, um direkt auf das zugrunde liegende System zuzugreifen. Ich bleibe bei den Berechtigungen derjenigen, als die der Webserver ausgeführt wird. Hoffentlich läuft der Server nicht als root. Wenn nichts anderes, werde ich einen Monero-Mining-Bot installieren, der erst in ein paar Monaten startet, eine gut versteckte Hintertür, und dann einfach anfangen, Ihre CPU-Zeit und Ihr Geld damit zu verbringen, Geld zu verdienen. Wenn sie keine saubere Kopie des Systems außerhalb des Live-Servers haben (viele kleine Unternehmen nicht), werden sie mich nie rausholen. Sie werden unzählige Zeit- und Geldbeträge verbrauchen, um dieses mysteriöse Virus aus ihrem System zu entfernen, das immer wieder zurückkehrt, egal wie oft sie sauber anfangen.
  7. Während ich dabei bin, installiere ich einen Code, der mir automatisch die E-Mail-Adressen und Passwörter aller Personen sendet, die sich beim Webportal anmelden. Kehren Sie zu Schritt 4 oben zurück.
  8. Der Himmel hilft ihnen, wenn sie etwas Wertvolles im System haben. Sozialversicherungsnummern? Kreditkarten? Wenn sie solche Informationen für ihre Mitarbeiter oder Kunden aufbewahren, sind es jetzt meine.

Dies ist kein isoliertes Sicherheitsproblem. Solche Dinge gibt es in der Praxis nie.

5
Conor Mancone

Viele gute Informationen in den anderen Antworten, die viel enthalten, könnten passieren und sollten ernst genommen werden.

Sie sind sich Ihres Hosting-Setups nicht sicher, aber nehmen wir an, Sie befinden sich auf einem Whm-Server mit anderen Konten und die Funktion wird verwendet, um den Inhalt von /etc/passwd Abzurufen, der Zeilen wie diese für Benutzer im System enthält:

username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
username:x:123:654::/home/username:/usr/local/cpanel/bin/noshell
etc...

Sie könnten dann für jeden Benutzernamen übergeben:

/home/username/public_html/wp-config.php 

Und am Ende die Konfigurationsdatei jeder wp-Site. Dies ist nur ein Beispiel ... letztendlich sollten Sie Ihr Bestes tun, um Dinge zu sichern, die höher als der Code sind - als eine weitere Ebene.

Was sollte passieren, wenn der Funktion ein lokaler Pfad wie/etc/passwd bereitgestellt wird:

<br />
<b>Warning</b>:  file_get_contents(): open_basedir restriction in effect. File(/etc/passwd) is not within the allowed path(s): (/home/uservalue/public_html) in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />
<br />
<b>Warning</b>:  file_get_contents(/etc/passwd): failed to open stream: Operation not permitted in <b>/home/uservalue/public_html/test.php</b> on line <b>2</b><br />

"open_basedir Einschränkung in Kraft."

2
Chris