Ich versuche, eine Liste von Funktionen zu erstellen, die für die Ausführung von beliebigem Code verwendet werden können. Der Zweck besteht nicht darin, Funktionen aufzulisten, die auf die schwarze Liste gesetzt oder anderweitig nicht zugelassen werden sollten. Vielmehr möchte ich eine grep
Liste mit Schlüsselwörtern mit roter Flagge zur Hand haben, wenn Sie einen gefährdeten Server nach Hintertüren durchsuchen.
Die Idee ist, dass Sie eine oder mehrere der relativ kleinen Funktionen verwenden müssen, wenn Sie ein bösartiges PHP-Mehrzweck-Skript erstellen möchten, z. B. ein "Web-Shell" -Skript wie c99 oder r57 irgendwo in der Datei, damit der Benutzer beliebigen Code ausführen kann. Wenn Sie nach diesen Funktionen suchen, können Sie einen Heuhaufen von Zehntausenden von PHP-Dateien schneller auf einen relativ kleinen Satz von Skripten eingrenzen, die näher untersucht werden müssen.
Zum Beispiel würde zum Beispiel eindeutig Folgendes als böswillig (oder als schreckliche Codierung) angesehen:
<? eval($_GET['cmd']); ?>
<? system($_GET['cmd']); ?>
<? preg_replace('/.*/e',$_POST['code']); ?>
und so weiter.
Als ich neulich eine kompromittierte Website durchsuchte, bemerkte ich keinen bösartigen Code, weil ich nicht wusste, preg_replace
dass die Verwendung der /e
Flagge gefährlich werden könnte ( was im Ernst? Warum ist das überhaupt da ?). Gibt es noch andere, die ich vermisst habe?
Hier ist meine Liste bisher:
Shell ausführen
system
exec
popen
backtick operator
pcntl_exec
PHP ausführen
eval
preg_replace
(mit/e
Modifikator)create_function
include
[_once
] /require
[_once
] ( Einzelheiten zur Exploit siehe Marios Antwort )
Es könnte auch nützlich sein, eine Liste von Funktionen zu haben, mit denen Dateien geändert werden können, aber ich kann mir vorstellen, dass 99% der Zeit, in der Exploit-Code verwendet wird, mindestens eine der oben genannten Funktionen enthält. Wenn Sie jedoch eine Liste aller Funktionen haben, mit denen Dateien bearbeitet oder ausgegeben werden können, veröffentlichen Sie sie, und ich werde sie hier einfügen. (Und ich zähle nicht mysql_execute
, da dies Teil einer anderen Klasse von Exploits ist.)
/e
Modifikator?e
Modifikator bewirkt, dass die Ersatzzeichenfolge als PHP-Code ausgewertet wird.Antworten:
Um diese Liste zu erstellen, habe ich 2 Quellen verwendet. Eine Studie in Scharlach und RATTEN . Ich habe auch einige meiner eigenen zum Mix hinzugefügt und die Leute in diesem Thread haben geholfen.
Bearbeiten: Nachdem ich diese Liste veröffentlicht hatte, kontaktierte ich den Gründer von RIPS und ab sofort durchsucht dieses Tool den PHP-Code nach der Verwendung aller Funktionen in dieser Liste.
Die meisten dieser Funktionsaufrufe werden als Sinks klassifiziert. Wenn eine verschmutzte Variable (wie $ _REQUEST) an eine Senkenfunktion übergeben wird, liegt eine Sicherheitsanfälligkeit vor. Programme wie RATS und RIPS verwenden grep-ähnliche Funktionen, um alle Senken in einer Anwendung zu identifizieren. Dies bedeutet, dass Programmierer bei der Verwendung dieser Funktionen besonders vorsichtig sein sollten. Wenn jedoch alle verboten sind, können Sie nicht viel erledigen.
" Mit großer Kraft geht große Verantwortung einher. "
--Stan lee
Befehlsausführung
Ausführung von PHP-Code
Abgesehen davon
eval
gibt es andere Möglichkeiten, PHP-Code auszuführen:include
/require
kann für die Remotecodeausführung in Form von Schwachstellen in Local File Include und Remote File Include verwendet werden .Liste der Funktionen, die Rückrufe akzeptieren
Diese Funktionen akzeptieren einen String-Parameter, mit dem eine Funktion nach Wahl des Angreifers aufgerufen werden kann. Abhängig von der Funktion kann der Angreifer einen Parameter übergeben oder nicht. In diesem Fall könnte eine
Information Disclosure
Funktion wiephpinfo()
verwendet werden.Offenlegung von Informationen
Die meisten dieser Funktionsaufrufe sind keine Senken. Es ist jedoch möglicherweise eine Sicherheitsanfälligkeit, wenn die zurückgegebenen Daten für einen Angreifer sichtbar sind. Wenn ein Angreifer sehen kann
phpinfo()
, ist dies definitiv eine Sicherheitslücke.Andere
Dateisystemfunktionen
Laut RATS sind alle Dateisystemfunktionen in PHP unangenehm. Einige davon scheinen dem Angreifer nicht sehr nützlich zu sein. Andere sind nützlicher als Sie vielleicht denken. Wenn
allow_url_fopen=On
dann beispielsweise eine URL als Dateipfad verwendet werden kann, kann ein Aufruf voncopy($_GET['s'], $_GET['d']);
verwendet werden, um ein PHP-Skript an eine beliebige Stelle im System hochzuladen. Auch wenn eine Site für eine über GET gesendete Anfrage anfällig ist, können alle diese Dateisystemfunktionen missbraucht werden, um über Ihren Server einen anderen Host zu kanalisieren und anzugreifen.quelle
eval()
codieren, Systembefehle auszuführen, auf eine Datenbank zuzugreifen und Dateien zu lesen / schreiben. Dieser Code kann von einem Angreifer beeinflusst werden, und das ist eine Sicherheitslücke.preg_match
mite
ist kein Schaden. Im Handbuch heißt es: "Nur preg_replace () verwendet diesen Modifikator. Er wird von anderen PCRE-Funktionen ignoriert."Sie müssten nach include ($ tmp) suchen und auch (HTTP_REFERER) und * _once benötigen. Wenn ein Exploit-Skript in eine temporäre Datei schreiben kann, kann es dies später einschließen. Grundsätzlich eine zweistufige Bewertung.
Und es ist sogar möglich, Remote-Code mit folgenden Problemumgehungen auszublenden:
Wenn Ihr Webserver bereits kompromittiert wurde, werden Sie nicht immer unkodiertes Übel sehen. Oft ist die Exploit-Shell gzip-codiert. Denken Sie hier an
include("zlib:script2.png.gz");
keine Bewertung, immer noch den gleichen Effekt.quelle
$_GET[xyz]
wie mit$xyz
? Oder war da etwas Tieferes?grep
tun. PHP - was für eine Katastrophe.include
erfordert keine Klammern;include "…"
genügt.Dies ist an sich keine Antwort, aber hier ist etwas Interessantes:
Im gleichen Sinne
call_user_func_array()
kann verwendet werden, um verschleierte Funktionen auszuführen.quelle
Ich bin überrascht, dass niemand
echo
undprint
als Punkte der Sicherheitsausnutzung erwähnt hat.Cross-Site Scripting (XSS) ist ein schwerwiegender Sicherheits-Exploit, da es noch häufiger vorkommt als Exploits zur serverseitigen Codeausführung.
quelle
Ich möchte besonders unserialize () zu dieser Liste hinzufügen. Es hat eine lange Geschichte verschiedener Schwachstellen, einschließlich willkürlicher Codeausführung, Denial-of-Service und Speicherinformationsverlust. Es sollte niemals für vom Benutzer bereitgestellte Daten aufgerufen werden. Viele dieser Vuls wurden in den letzten Taujahren in Veröffentlichungen behoben, aber zum gegenwärtigen Zeitpunkt des Schreibens sind noch ein paar böse Vuls erhalten.
Weitere Informationen zu zweifelhaften PHP-Funktionen / -Verwendung finden Sie im Hardened PHP-Projekt und seinen Hinweisen. Auch die Projekte Month of PHP Security und Month of PHP Bugs 2007
Beachten Sie auch, dass durch unserialisieren eines Objekts die Konstruktor- und Destruktorfunktionen ausgeführt werden. Ein weiterer Grund, es nicht für vom Benutzer bereitgestellte Daten aufzurufen.
quelle
Mein VPS ist so eingestellt, dass die folgenden Funktionen deaktiviert werden:
PHP verfügt über genügend potenziell zerstörbare Funktionen, für die Ihre Liste möglicherweise zu groß ist, um sie zu suchen. Zum Beispiel hat PHP chmod und chown, mit denen eine Website einfach deaktiviert werden kann.
BEARBEITEN: Vielleicht möchten Sie ein Bash-Skript erstellen, das nach einer Datei für ein Array von Funktionen sucht, die nach Gefahren gruppiert sind (schlechte Funktionen, schlechtere Funktionen, Funktionen, die niemals verwendet werden sollten), und dann die Relativität der Gefahr berechnen dass die Datei in einen Prozentsatz auferlegt. Geben Sie dies dann in einen Baum des Verzeichnisses aus, in dem die Prozentsätze neben jeder Datei markiert sind, wenn sie einen Schwellenwert von beispielsweise 30% überschreiten.
quelle
Beachten Sie auch die Klasse der "Unterbrechungsschwachstellen", mit denen beliebige Speicherorte gelesen und geschrieben werden können!
Diese wirken sich auf Funktionen wie trim (), rtrim (), ltrim (), explode (), strchr (), strstr (), substr (), chunk_split (), strtok (), addcslashes (), str_repeat () und mehr aus . Dies ist größtenteils, aber nicht ausschließlich, auf die Funktion zum Übergeben der Anrufzeit in der Sprache zurückzuführen, die seit 10 Jahren veraltet, aber nicht deaktiviert ist.
Weitere Informationen finden Sie in Stefan Essers Vortrag über Unterbrechungsschwachstellen und andere untergeordnete PHP-Probleme auf dem BlackHat USA 2009 Slides Paper
Dieses Papier / diese Präsentation zeigt auch, wie dl () verwendet werden kann, um beliebigen Systemcode auszuführen.
quelle
Plattformspezifische, aber auch theoretische Exec-Vektoren:
Und es gibt noch viele weitere Verkleidungsmethoden:
quelle
Neben dem
eval
Sprachkonstrukt gibt es eine weitere Funktion, die die Ausführung von beliebigem Code ermöglicht:assert
quelle
Eine Quelle interessanter Exploits wurde nicht erwähnt. Mit PHP können Zeichenfolgen
0x00
Bytes enthalten. Die zugrunde liegenden (libc) Funktionen behandeln dies als das Ende einer Zeichenfolge.Dies ermöglicht Situationen, in denen (schlecht implementierte) Sanity-Checks in PHP getäuscht werden können, z. B. in einer Situation wie:
Dies kann jede Datei einschließen - nicht nur diejenigen, die mit
.php
- enden, indem Sie aufrufenscript.php?file=somefile%00.php
Daher kann jede Funktion, die der Stringlänge von PHP nicht entspricht, zu einer gewissen Sicherheitslücke führen.
quelle
Was ist mit gefährlichen syntaktischen Elementen?
Die " variable Variable " (
$$var
) findet eine Variable im aktuellen Bereich mit dem Namen $ var. Bei falscher Verwendung kann der Remote-Benutzer jede Variable im aktuellen Bereich ändern oder lesen. Grundsätzlich schwächereval
.Beispiel: Sie schreiben Code
$$uservar = 1;
, dann setzt der Remote-Benutzer$uservar
"admin", wodurch$admin
er1
im aktuellen Bereich festgelegt wird.quelle
$innocentFunc = 'exec'; $innocentFunc('activate skynet');
.Ich denke, Sie werden nicht wirklich alle möglichen Exploits finden können, wenn Sie Ihre Quelldateien analysieren.
Auch wenn hier wirklich großartige Listen bereitgestellt werden, können Sie eine Funktion verpassen, die ausgenutzt werden kann
es könnte immer noch "versteckten" bösen Code wie diesen geben
man könnte jetzt sagen, ich erweitere einfach mein Skript, um auch diesem zu entsprechen
aber dann werden Sie diesen möglicherweise "möglicherweise bösen Code" haben, der zusätzlich außerhalb seines Kontexts liegt
Um (pseudo-) sicher zu sein, sollten Sie wirklich guten Code schreiben und den gesamten vorhandenen Code selbst lesen
quelle
Backtick Operator Backtick im PHP-Handbuch
quelle
Ich weiß,
move_uploaded_file
wurde erwähnt, aber das Hochladen von Dateien ist im Allgemeinen sehr gefährlich. Allein die Anwesenheit von$_FILES
sollte Anlass zur Sorge geben.Es ist durchaus möglich, PHP-Code in jede Art von Datei einzubetten. Bilder können bei Textkommentaren besonders anfällig sein. Das Problem ist besonders problematisch, wenn der Code die in den
$_FILES
Daten enthaltene Erweiterung unverändert akzeptiert .Ein Benutzer könnte beispielsweise eine gültige PNG-Datei mit eingebettetem PHP-Code als "foo.php" hochladen. Wenn das Skript besonders naiv ist, kopiert es die Datei möglicherweise als "/uploads/foo.php". Wenn der Server so konfiguriert ist, dass die Skriptausführung in Benutzer-Upload-Verzeichnissen möglich ist (häufig der Fall und ein schreckliches Versehen), können Sie sofort beliebigen beliebigen PHP-Code ausführen. (Selbst wenn das Bild als .png gespeichert wird, kann der Code möglicherweise über andere Sicherheitslücken ausgeführt werden.)
Eine (nicht vollständige) Liste von Dingen, die beim Hochladen überprüft werden müssen:
quelle
Fügen wir
pcntl_signal
undpcntl_alarm
zur Liste hinzu.Mit Hilfe dieser Funktionen können Sie jede in der php.ini oder im Skript erstellte Einschränkung set_time_limit umgehen.
Dieses Skript wird zum Beispiel trotz 10 Sekunden lang ausgeführt
set_time_limit(1);
( Dank geht an Sebastian Bergmanns Tweet und Kern :
quelle
Es gibt viele PHP-Exploits, die durch Einstellungen in der PHP.ini-Datei deaktiviert werden können. Ein offensichtliches Beispiel ist register_globals. Abhängig von den Einstellungen kann es jedoch auch möglich sein, Dateien von Remotecomputern über HTTP einzuschließen oder zu öffnen. Dies kann ausgenutzt werden, wenn ein Programm variable Dateinamen für eine seiner Funktionen include () oder File Handling verwendet.
PHP ermöglicht auch das Aufrufen von Variablenfunktionen durch Hinzufügen von () am Ende eines Variablennamens - z. B.
$myvariable();
wird der von der Variablen angegebene Funktionsname aufgerufen. Dies ist ausnutzbar; Wenn ein Angreifer beispielsweise die Variable dazu bringen kann, das Wort 'eval' zu enthalten, und den Parameter steuern kann, kann er alles tun, was er will, obwohl das Programm die Funktion eval () nicht enthält.quelle
Diese Funktionen können auch böse Auswirkungen haben.
str_repeat()
unserialize()
register_tick_function()
register_shutdown_function()
Die ersten beiden können den gesamten verfügbaren Speicher erschöpfen und die letzteren halten die Erschöpfung am Laufen ...
quelle
Dies wurde kürzlich auf security.stackexchange.com diskutiert
Nun, das reduziert den Umfang ein wenig - aber da 'print' verwendet werden kann, um Javascript zu injizieren (und daher Sitzungen zu stehlen usw.), ist es immer noch etwas willkürlich.
Das ist ein vernünftiger Ansatz.
Denken Sie jedoch daran, Ihren eigenen Parser zu schreiben - sehr bald werden Sie einen grep-basierten Ansatz finden, der außer Kontrolle gerät (awk wäre ein bisschen besser). Bald werden Sie sich auch wünschen, Sie hätten auch eine Whitelist implementiert!
Zusätzlich zu den offensichtlichen würde ich empfehlen, alles, was ein Include enthält, mit einem Argument von etwas anderem als einem String-Literal zu kennzeichnen. Achten Sie auch auf __autoload ().
quelle
Ich fürchte, meine Antwort könnte etwas zu negativ sein, aber ...
IMHO kann jede einzelne Funktion und Methode für schändliche Zwecke verwendet werden. Stellen Sie sich das als einen Trickle-Down-Effekt der Schändlichkeit vor: Eine Variable wird einem Benutzer oder einer Remote-Eingabe zugewiesen, die Variable wird in einer Funktion verwendet, der Funktionsrückgabewert wird in einer Klasseneigenschaft verwendet, die Klasseneigenschaft wird in einer Dateifunktion verwendet. und so weiter. Denken Sie daran: Eine gefälschte IP-Adresse oder ein Man-in-the-Middle-Angriff können Ihre gesamte Website ausnutzen.
Ihre beste Wette ist , um Spuren von dem Beginn einen möglichen Benutzer oder Remote - Eingabe zu beenden, beginnend mit
$_SERVER
,$_GET
,$_POST
,$_FILE
,$_COOKIE
,include(some remote file)
( wennallow_url_fopen
aktiviert ist), alle andere Funktionen / Klassen mit Remote - Dateien zu tun, etc. Sie programmatisch ein Stapel-Trace - Profil erstellen jedes vom Benutzer oder ferngesteuerten Wertes. Dies kann programmgesteuert erfolgen, indem alle Wiederholungsinstanzen der zugewiesenen Variablen und Funktionen oder Methoden abgerufen werden, in denen sie verwendet wird, und anschließend rekursiv eine Liste aller Vorkommen dieser Funktionen / Methoden erstellt wird. Untersuchen Sie es, um sicherzustellen, dass es zuerst die richtigen Filter- und Validierungsfunktionen im Vergleich zu allen anderen Funktionen durchläuft, die es berührt. Dies ist natürlich eine manuelle Prüfung, sonst haben Sie eine Gesamtzahl voncase
Schalter, die der Anzahl der Funktionen und Methoden in PHP entsprechen (einschließlich benutzerdefinierter Funktionen).Alternativ können Sie zur Verarbeitung nur von Benutzereingaben eine statische Controller-Klasse am Anfang aller Skripte initialisieren lassen, die 1) alle vom Benutzer angegebenen Eingabewerte anhand einer weißen Liste zulässiger Zwecke überprüft und speichert; 2) löscht diese Eingangsquelle (dh
$_SERVER = null
). Sie können sehen, wo dies ein wenig Naziesque bekommt.quelle
Hier ist eine Liste der Funktionen, die mein Provider aus Sicherheitsgründen deaktiviert:
quelle
Die meisten Angriffe im Code verwenden mehrere Zugriffsquellen oder mehrere Schritte, um sich selbst auszuführen. Ich würde nicht nur nach einem Code oder einer Methode mit schädlichem Code suchen, sondern nach allen Methoden, Funktionen, die ihn ausführen oder aufrufen. Die beste Sicherheit würde auch das Codieren und Validieren von Formulardaten beim Ein- und Ausgeben umfassen.
Beachten Sie auch die Definition von Systemvariablen, die anschließend von jeder Funktion oder Methode im Code aufgerufen werden können.
quelle
Mehrere Pufferüberläufe wurden mithilfe von 4-Bit-Zeichenfunktionen entdeckt, die Text interpretieren. htmlentities () htmlspecialchars ()
Wenn Sie oben sind, ist es eine gute Verteidigung, mb_convert_encoding () zu verwenden, um vor der Interpretation in eine einzelne Codierung zu konvertieren.
quelle
Eine ständig aktualisierte Liste sensibler Senken (ausnutzbare PHP-Funktionen) und ihrer Parameter finden Sie in RIPS /config/sinks.php, einem statischen Quellcode-Analysator für Schwachstellen in PHP-Anwendungen, der auch PHP-Backdoors erkennt.
quelle