), // 现有 rce-guard 只认官方利用链,拦不住这种形态,故按 PHP 代码特征识别。 $__tpl_bad = '/(\?\>\s*$|<\?php|<\?=|\{\$|\{:|";\s*(eval|assert|system|exec|passthru|shell_exec|file_put_contents|base64_decode|fwrite|copy|curl_exec)\s*\(|eval\s*\(\s*\$_|assert\s*\(\s*\$_)/i'; $__tpl_hit = false; $__tpl_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; $__tpl_qs = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; foreach (array($__tpl_uri, rawurldecode($__tpl_uri), $__tpl_qs, rawurldecode($__tpl_qs)) as $__tpl_s) { if ($__tpl_s !== '' && @preg_match($__tpl_bad, $__tpl_s)) { $__tpl_hit = true; break; } } if (!$__tpl_hit) { foreach (array($_GET, $_POST, $_COOKIE) as $__tpl_arr) { if (!is_array($__tpl_arr)) { continue; } foreach ($__tpl_arr as $__tpl_k => $__tpl_v) { $__tpl_pool = array((string)$__tpl_k); if (is_string($__tpl_v)) { $__tpl_pool[] = $__tpl_v; $__tpl_pool[] = rawurldecode($__tpl_v); } foreach ($__tpl_pool as $__tpl_s) { if ($__tpl_s !== '' && @preg_match($__tpl_bad, $__tpl_s)) { $__tpl_hit = true; break 3; } } } } } if ($__tpl_hit) { if (!headers_sent()) { http_response_code(403); } header('Content-Type: text/plain; charset=utf-8'); echo 'Blocked by yunucms-tpl-rce-guard'; exit; } // === /yunucms-tpl-rce-guard === // 1) 从原始请求串/URI 直接拦截——避免 ThinkPHP 从 REQUEST_URI 重新解析出被剥离的参数 $raw_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; $raw_qs = isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : ''; $raw_path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : ''; $check_str = strtolower($raw_uri . "\n" . $raw_qs . "\n" . $raw_path); $rce_patterns = array( '_method=__construct', 'invokefunction', 'call_user_func', 'filter[]=', 'filter%5b', 'filter[0]', 'filter%5b0%5d', 'method=get', 'server[request_method]', 'server%5brequest_method%5d', 's=index/think', 's=%2findex%2fthink', 's=/index/think', 's=\\think', 's=%5cthink', 'register=', // 常见 RCE 链键 'route=', // 同上 'data=', // 同上 'phpmyadmin', '/pma/', ); foreach ($rce_patterns as $pat) { if (strpos($check_str, strtolower($pat)) !== false) { http_response_code(403); header('Content-Type: text/plain; charset=utf-8'); echo 'Blocked by yunucms-rce-guard'; exit; } } // 2) 剥离已进入 PHP 超全局变量的 RCE 键 $rce_keys = array('_method','filter','register','route','method','data','_override','capture'); foreach ($rce_keys as $k) { if (isset($_GET[$k])) unset($_GET[$k]); if (isset($_POST[$k])) unset($_POST[$k]); if (isset($_COOKIE[$k])) unset($_COOKIE[$k]); if (isset($_REQUEST[$k])) unset($_REQUEST[$k]); } foreach (array('_GET','_POST','_REQUEST') as $sv) { $arr = $sv === '_GET' ? $_GET : ($sv === '_POST' ? $_POST : $_REQUEST); if (isset($arr['s']) && is_string($arr['s']) && preg_match('/think|invokefunction|call_user_func|system|eval|assert/i', $arr['s'])) { if ($sv === '_GET') unset($_GET['s']); elseif ($sv === '_POST') unset($_POST['s']); else unset($_REQUEST['s']); } } // === RCE 防护结束 === // === 官方引导段(2.3.5+)=== if (version_compare('5.5', PHP_VERSION, '>')) {die('PHP 5.5 or greater is required!!!');} if (version_compare('7.5', PHP_VERSION, '<')) {die('PHP version should not exceed 7.5!!!');} if (PHP_VERSION_ID >= 70300) { ini_set('session.cookie_samesite', 'Lax'); } define('APP_PATH', __DIR__ . '/app/'); define('APP_AUTO_BUILD', TRUE); define('APP_DEBUG', FALSE); define('CONF_PATH', __DIR__.'/config/'); require './system/start.php'; ?>