From c60e4ebc9bd340ec4a151674b6be352c21e0ca3d Mon Sep 17 00:00:00 2001 From: youpaishidifu <1@ypshidifu.cn> Date: Sat, 10 Oct 2026 11:21:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=9B=BA-03(P0-02):=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E8=BF=9C=E7=A8=8B=E5=9C=A8=E7=BA=BF=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=93=BE=EF=BC=88=E4=BE=9B=E5=BA=94=E9=93=BE=20RCE=20=E5=90=91?= =?UTF-8?q?=E9=87=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - admin/ajax.php: checkupdate / downloadupdatepacks / unzippacks 三个 端点合并为统一禁用存根(返回 JSON "远程更新已禁用(安全加固)"); 原逻辑从作者第三方域 (download.wenquan6.cn / download.bwenquan.com) 下载 zip 并解压到 Web 目录、再引导浏览器访问 install.php, 攻击者控制该域即可向所有部署实例推送恶意代码(供应链 RCE)。 - 删除辅助函数 get_zip_originalsize() 与 getFile()(仅更新链使用)。 - admin/html/welcome.html 与 admin/welcome.html: 移除"检查系统更新" 按钮及 function update() 整段 AJAX 链,替换为静态说明文案。 - admin/ajax.php: HTTP_USER_AGENT 比较改用 ?? 回退,消除无 UAgent 客户端触发的 Notice(UAgent 会话锁定行为保持不变)。 验证: php -l 通过;登录态调用三端点均返回禁用 JSON; UAgent 锁定对无 UAgent 客户端正确拒绝(code:-3)。 --- admin/ajax.php | 98 +++++-------------------------------- admin/html/welcome.html | 102 ++------------------------------------- admin/welcome.html | 104 ++-------------------------------------- 3 files changed, 20 insertions(+), 284 deletions(-) diff --git a/admin/ajax.php b/admin/ajax.php index f44a552..fab7ec6 100644 --- a/admin/ajax.php +++ b/admin/ajax.php @@ -56,7 +56,7 @@ if ($_GET['mod'] === 'login'){ if (!$result = $db->select_first_row('sq_admin','*',array('username'=>$_SESSION['admin_username'],'password'=>$_SESSION['admin_password']),'AND')){ die(json_encode(array('code'=>-2))); } - if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['admin_HTTP_USER_AGENT']){ + if (($_SERVER['HTTP_USER_AGENT'] ?? '') !== $_SESSION['admin_HTTP_USER_AGENT']){ die(json_encode(array('code'=>-3))); }else{ die(json_encode(array('code'=>1,'username'=>$_SESSION['admin_username'],'adminqq'=>$_SESSION['admin_qq']))); @@ -73,7 +73,7 @@ if ($_GET['mod'] === 'login'){ header('Location: login.html'); die(); } - if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['admin_HTTP_USER_AGENT']){ + if (($_SERVER['HTTP_USER_AGENT'] ?? '') !== $_SESSION['admin_HTTP_USER_AGENT']){ echo '没有登录:code:-3'; header('Location: login.html'); die(); @@ -1062,31 +1062,15 @@ switch ($_GET['mod']){ break; case 'checkupdate': - die(-1); - $newver = curl_request('http://download.bwenquan.com/update/shouquanver.txt'); - - if ($newver > $G['siteinfo']['ver'] ){ - die('1'); - }else{ - die('-1'); - } - - break; case 'downloadupdatepacks': - set_time_limit(0); - if(!getFile('http://download.wenquan6.cn/upload/shouquan/'.$G['siteinfo']['ver'].'.zip','../update/',$G['siteinfo']['ver'].'.zip')){ - die(json_encode(array('code'=>'-1','msg'=>'下载文件失败!'))); - }else{ - die(json_encode(array('code'=>'1'))); - } - break; case 'unzippacks': - set_time_limit(0); - if (!file_exists('../update/'.$G['siteinfo']['ver'].'.zip')){ - die(json_encode(array('code'=>'-1','msg'=>'更新包文件不存在,无法解压'))); - } - get_zip_originalsize('../update/'.$G['siteinfo']['ver'].'.zip','../update/'); - die(json_encode(array('code'=>'1','updateurl'=>'../../update/'.$G['siteinfo']['ver'].'/install.php'))); + /* + * 安全加固 (P0-02):远程在线更新链整体禁用。 + * 原逻辑 = 从作者第三方域下载 zip 并解压到 Web 目录, + * 再引导浏览器访问 install.php —— 等同于供应链 RCE 入口。 + * 版本升级一律走 git 部署,不再保留在线更新端点。 + */ + die(json_encode(array('code' => '-1', 'msg' => '远程更新已禁用(安全加固)'))); break; case 'keylog': if (!$result = $db->select_limit_row('sq_log_kami','*','',0,array('keyid'=>$_POST['keyid']),'AND',"ORDER BY time DESC")){ @@ -1586,65 +1570,5 @@ switch ($_GET['mod']){ default: die('What the fuck'); } -function get_zip_originalsize($filename, $path) {//解压zip文件 - $resource = zip_open($filename); - while ($dir_resource = zip_read($resource)) { - if (zip_entry_open($resource,$dir_resource)) { - $file_name = $path.zip_entry_name($dir_resource); - $file_path = substr($file_name,0,strrpos($file_name, "/")); - if(!is_dir($file_path)){ - mkdir($file_path,0777,true); - } - if(!is_dir($file_name)){ - $file_size = zip_entry_filesize($dir_resource); - $file_content = zip_entry_read($dir_resource,$file_size); - file_put_contents($file_name,$file_content); - } - zip_entry_close($dir_resource); - } - } - zip_close($resource); -} - -function getFile($url, $save_dir = '', $filename = '', $type = 0) { - if (trim($url) == '') { - return false; - } - if (trim($save_dir) == '') { - $save_dir = './'; - } - if (0 !== strrpos($save_dir, '/')) { - $save_dir.= '/'; - } - //创建保存目录 - if (!file_exists($save_dir) && !mkdir($save_dir, 0777, true)) { - return false; - } - //获取远程文件所采用的方法 - if ($type) { - $ch = curl_init(); - $timeout = 5; - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); - $content = curl_exec($ch); - curl_close($ch); - } else { - ob_start(); - readfile($url); - $content = ob_get_contents(); - ob_end_clean(); - } - //echo $content; - $size = strlen($content); - //文件大小 - $fp2 = @fopen($save_dir . $filename, 'a'); - fwrite($fp2, $content); - fclose($fp2); - unset($content, $url); - return array( - 'file_name' => $filename, - 'save_path' => $save_dir . $filename, - 'file_size' => $size - ); -} +/* 安全加固 (P0-02):已删除远程更新链辅助函数 get_zip_originalsize() 与 getFile() + (原用于从第三方域下载 zip 更新包并解压到 Web 目录,供应链 RCE 向量) */ diff --git a/admin/html/welcome.html b/admin/html/welcome.html index 0819809..8660b6b 100644 --- a/admin/html/welcome.html +++ b/admin/html/welcome.html @@ -94,10 +94,8 @@