HEX
Server: Apache/2.4.6 (CloudLinux) OpenSSL/1.0.2k-fips mod_fcgid/2.3.9 PHP/5.4.16
System: Linux s1.gigspace.ru 3.10.0-962.3.2.lve1.5.77.el7.x86_64 #1 SMP Mon Dec 12 07:06:14 EST 2022 x86_64
User: samok164 (6070)
PHP: 7.2.34
Disabled: NONE
Upload Files
File: /var/www/samok164/data/www2/townsusa.ru/rzgn/r4_api.php
<?php

    $r4_error_reporting = error_reporting(0);

    $r4_cfg_root = dirname(__FILE__);
    $r4_cfg_root .= '/';
    $r4_cfg_root = preg_replace('|([/]+)|is', '/', $r4_cfg_root);

    include_once("{$r4_cfg_root}r4_vars.php");
    include_once("{$r4_cfg_root}r4_libs.php");

    $result = array();

    // Проверка ключа для доступа к API.
    if (!empty($_GET['apikey'])) {
        if (md5('r4apikey') !== $_GET['apikey']) {
            r4_fail($result, 'ApiKey is invalid');
        }
    }
    else {
        r4_fail($result, 'ApiKey required');
    }

    // Проверка защитного ключа с привязкой к сайту.
    if (file_exists("{$r4_cfg_root}r4_vars.php")) {
        if (!empty($_GET['dongle']) && !empty($r4_cfg_dongle)) {
            if ($r4_cfg_dongle !== $_GET['dongle']) {
                r4_fail($result, 'Dongle is invalid');
            }
        }
        else {
            r4_fail($result, 'Dongle required');
        }
    }

    // Проверка режима SAFE MODE.
    $safe_mode = check_safe_mode($r4_cfg_root);

    if ($safe_mode) {
        include_once("{$r4_cfg_root}pclerror.lib.php3");
        include_once("{$r4_cfg_root}pcltrace.lib.php3");
        include_once("{$r4_cfg_root}pcltar.lib.php3");
    }

    // Мультидомены.
    if (isset($r4_cfg_multidomain) && $r4_cfg_multidomain && !$safe_mode) {
        $r4_domain = preg_replace('#^www\.#ism', '', $_SERVER['SERVER_NAME']).'/';

        if (!file_exists("{$r4_cfg_root}{$r4_domain}")) {
            mkdir("{$r4_cfg_root}{$r4_domain}", 0755);
            chmod("{$r4_cfg_root}{$r4_domain}", 0755);
        }

        $safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
    }
    elseif (isset($r4_cfg_multidomain) && $r4_cfg_multidomain) {
        $r4_domain = preg_replace('#^www\.#ism', '', $_SERVER['SERVER_NAME']).'_';
        $safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";

        $r4_domain = '';
    }
    else {
        $r4_domain = '';
        $safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
    }

    // Загрузка или обновление файлов (бывший r4.putfile.php).
    if (isset($_GET['upload']) || isset($_GET['putfile'])) {
        if (empty($_GET['key'])) {
            r4_fail($result, 'Signature required');
        }

        if (!isset($_POST['r'])) {
            r4_fail($result, 'No file contents');
        }

        $rq = $_POST['r'];

        if (!isset($_GET['fn'])) {
            r4_fail($result, 'Filename not specified');
        }

        $fn = $_GET['fn'];

        if (get_magic_quotes_gpc()) {
            $rq = stripslashes($rq);
            $fn = stripslashes($fn);
        }

        $skip_key_check = false;

        if ($fn === 'multiuploader') {
            $skip_key_check = true; // Ключ один, а файлов может быть несколько

            foreach (explode(';', $rq) as $t) {
                list($fn, $rq) = explode(',', $t, 2);
                $content[$fn] = base64_decode($rq);
            }
        }
        else {
            $content[$fn] = $rq;
        }

        foreach ($content as $fn => $rq) {
            if (!$skip_key_check) {
                $url = preg_replace("/&key=[0-9a-f]{32}/i", "", $_SERVER['REQUEST_URI']);
                $secret_key = md5('987agsdn7aoluygto97w64tudydtjkv'.'http://'.$_SERVER['HTTP_HOST'].$url.md5($rq));

                if ($secret_key != $_GET['key']) {
                    r4_fail($result, 'Incorrect key '.$_GET['key'].'. Host '.$_SERVER['HTTP_HOST']);
                }
            }

            $is_new_rzg_file = preg_match('/^\d{18}\.rzg$/', $fn);

            // Для нового разгонщика предварительно создаём папку links и соответствующие подпапки
            // Если на сайте включён SAFE MODE, то пропускаем данный шаг
            if ($is_new_rzg_file && !$safe_mode) {
                $r5_links_dir = "{$r4_domain}links";
                $r5_links_subdir = $r5_links_dir.'/'.substr($fn, 0, 2);

                if (!file_exists($r5_links_dir)) {
                    mkdir($r5_links_dir, 0777);
                    chmod($r5_links_dir, 0777);
                }

                if (!file_exists($r5_links_subdir) && file_exists($r5_links_dir)) {
                    mkdir($r5_links_subdir, 0777);
                    chmod($r5_links_subdir, 0777);
                }

                $fn = "{$r5_links_subdir}/{$fn}";
            }

            $r4_files_list = array(
                '.htaccess',
                'pclerror.lib.php3',
                'pcltar.lib.php3',
                'pcltrace.lib.php3',
                'r4_api.php',
                'r4_download_links.php',
                'r4_download.php',
                'r4_getHash.php',
                'r4_libs.php',
                'r4_vars.php',
                'r4_version',
                'razgon2006return.php',
                'razgon2006vnutri.php'
            );

            $r4_params_files_list = array(
                'r4_badparams.list',
                'r4_knownparams.list'
            );

            if ($is_new_rzg_file || in_array($fn, $r4_files_list) || $safe_mode) {
                $fn = "{$r4_cfg_root}{$fn}";
            }
            else {
                $fn = "{$r4_cfg_root}{$r4_domain}{$fn}";
            }

            // Пробуем создать файл по указанному пути
            $f = fopen($fn, 'w');

            if ($f) {
                if (fwrite($f, $rq) == -1) {
                    r4_fail($result, "Error to write file: {$fn}");
                }

                fclose($f);
                chmod($fn, 0644);

                // Если включён SAFE MODE, то файл добавляем к links.tar, а искомый файл удаляем
                if ($safe_mode) {
                    $p_tarname = $safe_mode_links_file;
                    $p_list = array($fn);
                    $p_mode = 'tar';
                    $p_add_dir = '';
                    $p_remove_dir = "{$r4_cfg_root}";

                    if (file_exists($p_tarname)) {
                        PclTarUpdate($p_tarname, $p_list, $p_mode, $p_add_dir, $p_remove_dir);
                    }
                    else {
                        PclTarCreate($p_tarname, $p_list, $p_mode, $p_add_dir, $p_remove_dir);
                    }

                    if (!unlink($fn)) {
                        r4_fail($result, "Error to delete file: {$fn} - SAFE MODE ON");
                    }
                }
            }
            else {
                r4_fail($result, "Error to open file: {$fn}");
            }
        }

        r4_success($result);
    }

    // Паттерны для файлов разгонщика и файлов ссылок
    $rzgn_pattern = '^(r4.*|razgon.*|getHash.*|addongoogle.*|\.htaccess|pcl.*)$';
    $links_pattern = '^(([0-9A-Fa-f]{32}|[0-9]{18})\.rzg|.*links\.tar)$';

    // Удаление папок и файлов в каталоге разгонщика (по умолчанию: удаление всех файлов).
    if (array_intersect(array('delete_all', 'delete_rzgn', 'delete_links', 'delete_files'), array_keys($_GET))) {
        $pattern = '';

        if (isset($_GET['delete_rzgn'])) { // Удаление всех файлов разгонщика.
            $pattern = $rzgn_pattern;
        }
        elseif (isset($_GET['delete_links'])) { // Удаление всех файлов со ссылками разгонщика.
            $pattern = $links_pattern;
        }
        elseif (isset($_GET['delete_files']) && isset($_GET['pattern'])) { // Удаление файлов по маске.
            if (get_magic_quotes_gpc()) {
                $pattern = rawurldecode(stripslashes($_GET['pattern']));
            }
            else {
                $pattern = rawurldecode($_GET['pattern']);
            }
        }

        $exclude_files = array($r4_cfg_root.'r4_api.php', $r4_cfg_root.'r4_libs.php');
        $undeleted_files = rmdir_recursive($r4_cfg_root, $exclude_files, $pattern);

        if (empty($undeleted_files)) {
            r4_success($result);
        }
        else {
            $result['undeleted_files'] = $undeleted_files;
            r4_fail($result, 'Some files were not deleted.');
        }
    }

    // Получение содержимого файлов (по умолчанию: получение содержимого всех файлов в папке разгонщика).
    if (array_intersect(array('download_all', 'download_rzgn', 'download_links', 'download_files'), array_keys($_GET))) {
        $pattern = '';

        if (isset($_GET['download_rzgn'])) { // Получение содержимого всех файлов разгонщика.
            $pattern = $rzgn_pattern;
        }
        elseif (isset($_GET['download_links'])) { // Получение содержимого всех файлов со ссылками разгонщика.
            $pattern = $links_pattern;
        }
        elseif (isset($_GET['download_files']) && isset($_GET['pattern'])) { // Получение содержимого файлов по маске.
            if (get_magic_quotes_gpc()) {
                $pattern = rawurldecode(stripslashes($_GET['pattern']));
            }
            else {
                $pattern = rawurldecode($_GET['pattern']);
            }
        }

        $filenames = get_filenames($r4_cfg_root, array(), $pattern);
        $files = array();

        foreach ($filenames as $filename) {
            $contents = file_get_contents($filename);
            $files[substr($filename, strlen($r4_cfg_root))] = base64_encode($contents);
        }

        $result['files'] = $files;

        r4_success($result);
    }

    // Возвращает список файлов (по умолчанию: получение списка всех файлов в папке разгонщика).
    if (array_intersect(array('list_all', 'list_rzgn', 'list_links', 'list_files'), array_keys($_GET))) {
        $pattern = '';

        if (isset($_GET['list_rzgn'])) { // Возвращает список всех файлов разгонщика.
            $pattern = $rzgn_pattern;
        }
        elseif (isset($_GET['list_links'])) { // Возвращает список всех файлов со ссылками разгонщика.
            $pattern = $links_pattern;
        }
        elseif (isset($_GET['list_files']) && isset($_GET['pattern'])) { // Возвращает список файлов по маске.
            if (get_magic_quotes_gpc()) {
                $pattern = rawurldecode(stripslashes($_GET['pattern']));
            }
            else {
                $pattern = rawurldecode($_GET['pattern']);
            }
        }

        // Если SAFE MODE включён на сайте, выполняем дополнительную проверку для SiteApi.check_r4()
        if ($safe_mode && file_exists($safe_mode_links_file) && preg_match('/\d{18}\.rzg/', $pattern)) {
            $filelist = PclTarList($safe_mode_links_file, 'tar');

            foreach ($filelist as $properties) {
                $filename = basename($properties['filename']);
                $filenames[] = 'links/'.substr($filename, 0, 2).'/'.$filename;
            }
        }
        else {
            $filenames = get_filenames($r4_cfg_root, array(), $pattern);

            foreach ($filenames as $key => $filename) {
                $filenames[$key] = substr($filename, strlen($r4_cfg_root));
            }
        }

        $result['files'] = $filenames;

        r4_success($result);
    }

    // Возвращает содержимое log-файлов посещений роботов поисковых систем.
    if (isset($_GET['get_visits_log'])) {
        if (empty($_GET['engine'])) {
            r4_fail($result, 'Param engine is empty');
        }

        if (!in_array($_GET['engine'], array('yandex', 'google'))) {
            r4_fail($result, 'Unknown engine: ' . $_GET['engine']);
        }

        $r4_logfile = "{$r4_cfg_root}{$r4_domain}seenby" . $_GET['engine'] . '.rzg';

        if (!file_exists($r4_logfile)) {
            r4_fail($result, 'File not found: ' . $r4_logfile);
        }

        $action = array_intersect(array('get', 'delete'), explode(',', (empty($_GET['action']) ? 'get' : $_GET['action'])));

        if (in_array('get', $action)) {
            $result['contents'] = file_get_contents($r4_logfile);
        }

        if (in_array('delete', $action)) {
            if (!unlink($r4_logfile)) {
                $result['error'] = 'Could not delete: ' . $r4_logfile;
            }
        }

        r4_success($result);
    }

    // Получение используемой версии разгонщика.
    if (isset($_GET['get_version'])) {
        $filename = "{$r4_cfg_root}r4_version";

        if (file_exists($filename)) {
            $result['version'] = file_get_contents($filename);

            r4_success($result);
        }
        else {
            r4_fail($result, "File not found: {$filename}");
        }
    }

    // Получение параметров сайта из конфигурационного файла.
    if (isset($_GET['get_config'])) {
        $filename = "{$r4_cfg_root}r4_vars.php";

        if (file_exists($filename)) {
            $matches = array();
            $contents = file_get_contents($filename);

            preg_match_all('/^\s+\$(.*?)\s+=\s+(.*?);/ism', $contents, $matches);

            $result['safe_mode'] = $safe_mode;
            $result['php_version'] = preg_replace('/^(\d+\.\d+(?:\.\d+)?).*$/', '$1', phpversion());
            $result['cfg_root'] = $r4_cfg_root;

            foreach ($matches[1] as $index => $match) {
                $result[$match] = ($matches[2][$index]);
            }
            r4_success($result);
        }
        else {
            r4_fail($result, "File not found: {$filename}");
        }
    }

    error_reporting($r4_error_reporting);