Ausnutzbare PHP-Funktionen

277

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 grepListe 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_replacedass die Verwendung der /eFlagge 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 /eModifikator)
  • 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.)

tylerl
quelle
43
Als Nebenbemerkung würde ich gerne sehen, dass diese Liste in naher Zukunft veröffentlicht wird, wenn möglich :)
Yoda
16
@yoda: wo veröffentlicht? Ich werde die Liste hier auf dem neuesten Stand halten, da SO die Quelle allen Wissens ist.
Tylerl
3
Was macht der /eModifikator?
Billy ONeal
6
@ Billy: Der eModifikator bewirkt, dass die Ersatzzeichenfolge als PHP-Code ausgewertet wird.
Nikc.org
1
Es muss gesagt werden: Das Ausführen des Codes in der Regex ist etwas, was Perl und möglicherweise auch Python tun, nicht etwas, das nur PHP vorbehalten ist. Ich kenne die Details jedoch nicht.
Adriano Varoli Piazza

Antworten:

205

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

exec           - Returns last line of commands output
passthru       - Passes commands output directly to the browser
system         - Passes commands output directly to the browser and returns last line
shell_exec     - Returns commands output
`` (backticks) - Same as shell_exec()
popen          - Opens read or write pipe to process of a command
proc_open      - Similar to popen() but greater degree of control
pcntl_exec     - Executes a program

Ausführung von PHP-Code

Abgesehen davon evalgibt es andere Möglichkeiten, PHP-Code auszuführen: include/ requirekann für die Remotecodeausführung in Form von Schwachstellen in Local File Include und Remote File Include verwendet werden .

eval()
assert()  - identical to eval()
preg_replace('/.*/e',...) - /e does an eval() on the match
create_function()
include()
include_once()
require()
require_once()
$_GET['func_name']($_GET['argument']);
$func = new ReflectionFunction($_GET['func_name']); $func->invoke(); or $func->invokeArgs(array());

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 DisclosureFunktion wie phpinfo()verwendet werden.

Function                     => Position of callback arguments
'ob_start'                   =>  0,
'array_diff_uassoc'          => -1,
'array_diff_ukey'            => -1,
'array_filter'               =>  1,
'array_intersect_uassoc'     => -1,
'array_intersect_ukey'       => -1,
'array_map'                  =>  0,
'array_reduce'               =>  1,
'array_udiff_assoc'          => -1,
'array_udiff_uassoc'         => array(-1, -2),
'array_udiff'                => -1,
'array_uintersect_assoc'     => -1,
'array_uintersect_uassoc'    => array(-1, -2),
'array_uintersect'           => -1,
'array_walk_recursive'       =>  1,
'array_walk'                 =>  1,
'assert_options'             =>  1,
'uasort'                     =>  1,
'uksort'                     =>  1,
'usort'                      =>  1,
'preg_replace_callback'      =>  1,
'spl_autoload_register'      =>  0,
'iterator_apply'             =>  1,
'call_user_func'             =>  0,
'call_user_func_array'       =>  0,
'register_shutdown_function' =>  0,
'register_tick_function'     =>  0,
'set_error_handler'          =>  0,
'set_exception_handler'      =>  0,
'session_set_save_handler'   => array(0, 1, 2, 3, 4, 5),
'sqlite_create_aggregate'    => array(2, 3),
'sqlite_create_function'     =>  2,

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.

phpinfo
posix_mkfifo
posix_getlogin
posix_ttyname
getenv
get_current_user
proc_get_status
get_cfg_var
disk_free_space
disk_total_space
diskfreespace
getcwd
getlastmo
getmygid
getmyinode
getmypid
getmyuid

Andere

extract - Opens the door for register_globals attacks (see study in scarlet).
parse_str -  works like extract if only one argument is given.  
putenv
ini_set
mail - has CRLF injection in the 3rd parameter, opens the door for spam. 
header - on old systems CRLF injection could be used for xss or other purposes, now it is still a problem if they do a header("location: ..."); and they do not die();. The script keeps executing after a call to header(), and will still print output normally. This is nasty if you are trying to protect an administrative area. 
proc_nice
proc_terminate
proc_close
pfsockopen
fsockopen
apache_child_terminate
posix_kill
posix_mkfifo
posix_setpgid
posix_setsid
posix_setuid

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=Ondann beispielsweise eine URL als Dateipfad verwendet werden kann, kann ein Aufruf von copy($_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.

// open filesystem handler
fopen
tmpfile
bzopen
gzopen
SplFileObject->__construct
// write to filesystem (partially in combination with reading)
chgrp
chmod
chown
copy
file_put_contents
lchgrp
lchown
link
mkdir
move_uploaded_file
rename
rmdir
symlink
tempnam
touch
unlink
imagepng   - 2nd parameter is a path.
imagewbmp  - 2nd parameter is a path. 
image2wbmp - 2nd parameter is a path. 
imagejpeg  - 2nd parameter is a path.
imagexbm   - 2nd parameter is a path.
imagegif   - 2nd parameter is a path.
imagegd    - 2nd parameter is a path.
imagegd2   - 2nd parameter is a path.
iptcembed
ftp_get
ftp_nb_get
// read from filesystem
file_exists
file_get_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
linkinfo
lstat
parse_ini_file
pathinfo
readfile
readlink
realpath
stat
gzfile
readgzfile
getimagesize
imagecreatefromgif
imagecreatefromjpeg
imagecreatefrompng
imagecreatefromwbmp
imagecreatefromxbm
imagecreatefromxpm
ftp_put
ftp_nb_put
exif_read_data
read_exif_data
exif_thumbnail
exif_imagetype
hash_file
hash_hmac_file
hash_update_file
md5_file
sha1_file
highlight_file
show_source
php_strip_whitespace
get_meta_tags
Turm
quelle
37
@whatnick Eigentlich sehe ich keinen nennenswerten Unterschied zwischen PHP und anderen Webanwendungssprachen. Letztendlich müssen Programmierer in der Lage sein, zu 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.
Turm
8
So viele Funktionen verboten! Sind Sie zufällig der Gastgeber meiner Website?
Randy the Dev
2
@ Andrew Dunn haha, nein. Wenn Sie alle diese Funktionen gesperrt hätten, würde keine PHP-Anwendung funktionieren. Insbesondere include (), require () und die Dateisystemfunktionen.
Turm
2
@Rook: meine Gedanken genau, aber diese sind für potenzielle Probleme, nicht bestimmte. Bei richtiger Anwendung stellt keines davon eine unmittelbare Bedrohung dar; aber wenn sie vermieden werden können, sollten sie es sein.
Geekster
3
Imho preg_matchmit eist kein Schaden. Im Handbuch heißt es: "Nur preg_replace () verwendet diesen Modifikator. Er wird von anderen PCRE-Funktionen ignoriert."
NikiC
59

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:

 include("data:text/plain;base64,$_GET[code]");

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.

Mario
quelle
1
Abhängig von der Konfiguration von PHP kann include tatsächlich Code von beliebigen URLs enthalten. So etwas wie " example.com/code.phps "; Ich habe eine kompromittierte Website gesehen, die mit einer Kombination aus dieser Funktion und register_globals aufgebrochen wurde.
BlackAura
@BlackAura Wie haben sich regiser_globals in den Angriff eingefügt? Ist es etwas, das mit der Verwendung genauso leicht hätte abgezogen werden können $_GET[xyz]wie mit $xyz? Oder war da etwas Tieferes?
Tylerl
Ich bin mir nicht ganz sicher, warum das so gemacht wurde, aber die Website hat immer wieder solche Dinge gemacht: include ($ prefix. '/Filename.php'); Ich denke, die Idee war, dass Sie den Kerncode außerhalb des Webstamms verschieben können, indem Sie die Variable $ prefix in der Konfigurationsdatei festlegen. Wenn der Angreifer diesen Wert auf " example.com/code.phps ?" Setzt , enthält PHP stattdessen diese entfernte Datei. Soweit ich das beurteilen kann, hat es ein Bot tatsächlich geschafft, mit einem generischen Exploit einzubrechen. Anscheinend hat viel alter PHP-Code diesen Fehler gemacht. Grundsätzlich darf NIEMALS ein vom Benutzer übermittelter Wert in der Nähe einer include-Anweisung liegen.
BlackAura
Ich denke, Sie können dies auf Einschlüsse verallgemeinern, die ein ":" im Dateinamen enthalten ... außer dass der Dateiname eine Variable sein könnte, was es schwierig macht, dies zu greptun. PHP - was für eine Katastrophe.
Tylerl
2
includeerfordert keine Klammern; include "…"genügt.
Gumbo
48

Dies ist an sich keine Antwort, aber hier ist etwas Interessantes:

$y = str_replace('z', 'e', 'zxzc');
$y("malicious code");

Im gleichen Sinne call_user_func_array()kann verwendet werden, um verschleierte Funktionen auszuführen.

Aillyn
quelle
1
Und es gibt keine Möglichkeit, dies zu finden, ohne den Code auszuführen :( Statische Analyse wird hier nicht helfen.
NikiC
15
@tylerl: ... oder eine andere Sprache?
Dr. Hannibal Lecter
@dr Hannibal Lector: sogar kompilierte Sprachen?
Ponkadoodle
3
@Wallacoloo: Es ist noch einfacher, eine CGI-Hintertür in kompilierter Sprache auszublenden, da in einer Binärdatei keine einfachen Textzeichenfolgen zu suchen sind.
Freitag,
2
Schön .. Ich habe es mit $ f = 'ev' versucht. 'Al'; $ f ($ _ POST ['c']); hat aber nicht funktioniert, da 'eval' keine Funktion ist, sondern ein spezielles Konstrukt wie include, echo usw. -> interessant, dass exec () nicht ist und dies daher funktionieren würde ..
redShadow
20

Ich bin überrascht, dass niemand echound printals 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.

Bill Karwin
quelle
Dies wäre ein Vektor, der sich technisch auf den Client und nicht auf den Server auswirkt.
Damianb
@damianb: Wenn eine Site Ajax verwendet und ich in jeder Benutzersitzung die Auswertung von beliebigem Javascript veranlassen kann, kann dies auf dem Server viel Unheil anrichten.
Bill Karwin
"auf dem Server" .... an verbundene Clients; Das Server-Backend ist davon nicht betroffen. Dies fällt unter clientseitige Exploits wie Cursorjacking, CSRF, Header-Injection usw. Es ist gefährlich, ja, aber es fällt völlig unter eine andere Klassifizierung.
Damianb
19

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.

Cheekysoft
quelle
Ich bin interessiert, mehr über das Problem der Unserialisierung zu erfahren. Ist dies nur ein Fehler in der Implementierung oder ein Fehler im Design (dh kann nicht behoben werden)? Können Sie mich auf weitere Informationen zu diesem Thema hinweisen?
Tylerl
Informationen zur Ausführung von willkürlichem Code und zum Verlust von
Empfehlung unter
Die aktuelle Version 5.2.14 behebt eine weitere Sicherheitsanfälligkeit bezüglich willkürlicher Codeausführung in unserialize () cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-2225 php.net/ChangeLog-5.php#5.2. 14
Cheekysoft
17

Mein VPS ist so eingestellt, dass die folgenden Funktionen deaktiviert werden:

root@vps [~]# grep disable_functions /usr/local/lib/php.ini
disable_functions = dl, exec, shell_exec, system, passthru, popen, pclose, proc_open, proc_nice, proc_terminate, proc_get_status, proc_close, pfsockopen, leak, apache_child_terminate, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid

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.

Josh
quelle
Sie können das Flag "--disable-posix" zur Kompilierungszeit setzen und alle diese posix-Funktionen aus disable_functions entfernen.
Der Pixel-Entwickler
15

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.

Cheekysoft
quelle
1
Autsch. Nun, ich dachte wirklich, dass PHP etwas sicher war, bevor ich mir diese Folien
ansah
14

Plattformspezifische, aber auch theoretische Exec-Vektoren:

  • dotnet_load ()
  • neue COM ("WScript.Shell")
  • neues Java ("java.lang.Runtime")
  • event_new () - sehr irgendwann

Und es gibt noch viele weitere Verkleidungsmethoden:

  • proc_open ist ein Alias ​​für popen
  • call_user_func_array ("exE" .chr (99), Array ("/ usr / bin / Damage", "--all"));
  • file_put_contents ("/ cgi-bin / nextinvocation.cgi") && chmod (...)
  • PharData :: setDefaultStub - weitere Arbeiten zum Untersuchen von Code in .phar-Dateien
  • runkit_function_rename ("exec", "unschuldiger_name") oder APD rename_function
Mario
quelle
Rufen Sie auch_user_func () in dieser zweiten Liste
Cheekysoft
1
Eine Antwort ist ausreichend;) Sie sollten sie einfach zu Ihrer vorherigen hinzufügen.
Justin Johnson
13

Neben dem evalSprachkonstrukt gibt es eine weitere Funktion, die die Ausführung von beliebigem Code ermöglicht:assert

assert('ex' . 'ec("kill --bill")');
NikiC
quelle
10

Eine Quelle interessanter Exploits wurde nicht erwähnt. Mit PHP können Zeichenfolgen 0x00Bytes 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:

/// note: proof of principle code, don't use
$include = $_GET['file'];
if ( preg_match("/\\.php$/",$include) ) include($include);

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.

mvds
quelle
Dateipfade mit Nullen sind in Version 5.4 und den neuesten Versionen 5.3 nicht mehr zulässig.
StasM
@stasM Das ist eines der besten Dinge, die ich seit einiger Zeit über PHP gehört habe. Danke für das Teilen.
William
9

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ächer eval.

Beispiel: Sie schreiben Code $$uservar = 1;, dann setzt der Remote-Benutzer $uservar"admin", wodurch $adminer 1im aktuellen Bereich festgelegt wird.

L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
quelle
Ich verstehe, was du meinst, aber das sieht nach einer anderen Klasse von Exploits aus. Gibt es eine Möglichkeit, mit diesem Mechanismus beliebigen PHP-Code auszuführen (ohne eine der oben genannten Funktionen zu verwenden)? Oder kann es nur zum Ändern von Variableninhalten missbraucht werden? Wenn mir etwas fehlt, möchte ich es richtig machen.
Tyler
6
Sie können auch variable Funktionen verwenden, die ohne Auswertung des Skripts nicht zu erarbeiten sind. Zum Beispiel : $innocentFunc = 'exec'; $innocentFunc('activate skynet');.
Erisco
Achten Sie auch auf Reflexion.
Erisco
6

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

$ myEvilRegex = base64_decode ('Ly4qL2U =');

preg_replace ($ myEvilRegex, $ _POST ['code']);

  • 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

Andreas Linden
quelle
Ich habe gesehen, dass base64_decode () in Wordpress-basierter Malware häufig für das Böse verwendet wird. Gute Ergänzung zur Liste.
Chris Allen Lane
5

Ich weiß, move_uploaded_filewurde erwähnt, aber das Hochladen von Dateien ist im Allgemeinen sehr gefährlich. Allein die Anwesenheit von $_FILESsollte 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 $_FILESDaten 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:

  • Stellen Sie sicher, dass Sie den Inhalt analysieren, um sicherzustellen, dass der Upload dem Typ entspricht, für den er sich ausgibt
  • Speichern Sie die Datei mit einer bekannten, sicheren Dateierweiterung, die niemals ausgeführt wird
  • Stellen Sie sicher, dass PHP (und jede andere Codeausführung) in Benutzer-Upload-Verzeichnissen deaktiviert ist
Matthew
quelle
5

Fügen wir pcntl_signalund pcntl_alarmzur 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 :

<?php
declare(ticks = 1);

set_time_limit(1);

function foo() {
    for (;;) {}
}

class Invoker_TimeoutException extends RuntimeException {}

class Invoker
{
    public function invoke($callable, $timeout)
    {
        pcntl_signal(SIGALRM, function() { throw new Invoker_TimeoutException; }, TRUE);
        pcntl_alarm($timeout);
        call_user_func($callable);
    }
}

try {
    $invoker = new Invoker;
    $invoker->invoke('foo', 1);
} catch (Exception $e) {
    sleep(10);
    echo "Still running despite of the timelimit";
}
edorian
quelle
4

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.

Spudley
quelle
4

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 ...

Alix Axel
quelle
2

Dies wurde kürzlich auf security.stackexchange.com diskutiert

Funktionen, die für die Ausführung von beliebigem Code verwendet werden können

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.

Es geht nicht darum, Funktionen aufzulisten, die auf die schwarze Liste gesetzt oder anderweitig nicht zugelassen werden sollten. Ich hätte lieber eine grep-fähige Liste

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 ().

symcbean
quelle
2

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)( wenn allow_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.

Bob-the-Destroyer
quelle
Ja, wie bei vielen Programmiersprachen gibt es natürlich unzählige Möglichkeiten, Ihre bösen Taten zu verbergen. Ich denke jedoch, dass dies die Absicht von dem, was ich gefragt habe, verfehlt. Das Szenario sieht ungefähr so ​​aus: Sie werden gerufen, um zu helfen, nachdem eine Website gehackt wurde. Der Kunde zahlt extra, wenn Sie seine Website vor dem Morgen sichern können. Die Seite enthält 475 PHP-Dateien und die nützlichen forensischen Details wurden zerstört - Sie haben einen riesigen Heuhaufen und eine notorisch kleine Nadel ... wo fangen Sie an zu suchen? (Mein Tagesjob auf den Punkt gebracht)
Tylerl
1

Hier ist eine Liste der Funktionen, die mein Provider aus Sicherheitsgründen deaktiviert:

  • exec
  • dl
  • show_source
  • apache_note
  • apache_setenv
  • Closelog
  • debugger_off
  • debugger_on
  • define_syslog_variables
  • Escapeeshellarg
  • Escapeeshellcmd
  • ini_restore
  • openlog
  • durchgehen
  • pclose
  • pcntl_exec
  • popen
  • proc_close
  • proc_get_status
  • proc_nice
  • proc_open
  • proc_terminate
  • shell_exec
  • Syslog
  • System
  • url_exec
Vladislav Rastrusny
quelle
1

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.

Cninroh
quelle
0

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.

ehime
quelle
0

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.

Reiners
quelle
RIPS verwendet die Liste auf dieser Seite.
Turm