博客 (182)

今天早上同事反映论坛某管理账号无法登录,于是我尝试用创始人账号登录,也不行,第一反应就是中招了。

于是进阿里云控制台,发现云安全中心有许多安全警告,类型是网站后门,幸好 nginx 中设置了仅部分文件可执行 PHP,这些后门文件无法被执行。

尝试在 config_global_default.php 文件中添加创始人,但账号必须是副站长等管理账号才能成为创始人。

于是借用一个小号,从表 pre_ucenter_members 中将这个小号的 password 和 salt 复制到创始人账号中,这样创始人账号就可以用这个小号的密码登录了。

进入论坛后台,在 工具-运行记录-系统记录-后台访问 中查看入侵时间段的记录(操作、时间、IP 等),可搜索。

发现基本上在操作模板管理和专题管理。

对比时间,发现进入后台操作在先,上传后门在后。

查询 web 访问日志,通过访问文件路径或 IP 查询,在进入论坛后台之间,他进入了 UCenter 的后台,但是再往前就没有记录了。

因此基本可以确定:

黑客从 UCenter 修改了某管理员账号的密码(可能是利用漏洞),然后登录论坛后台修改了创始人的密码(可能也是用 UCenter 改的),通过模板管理和专题管理功能的上传功能上传了后门文件。

索性他没有对数据进行破坏性处理,也没有挂马,只是发现后门文件无法执行就放弃了。

xoyozo 1 年前
868

本文记录于 2024 年 11 月。



升级前期望(最新正式版)最终选择
操作系统Alibaba Cloud Linux 3Alibaba Cloud Linux 3Alibaba Cloud Linux 3
管理面板宝塔面板 Linux 版 9.2.0宝塔面板 Linux 版 9.2.0宝塔面板 Linux 版 9.2.0
Web 服务nginx 1.24nginx 1.24nginx 1.24
脚本语言PHP 7.4PHP 8.2PHP 8.2
数据库
PolarDB MySQL 5.6RDS MySQL 9.1PolarDB MySQL 8.0
论坛程序
Discuz! X3.4 GBKDiscuz! X5.0Discuz! X3.5 UTF8


版本选择原因:

  • Discuz! X5 刚刚发布,生态尚未成熟,考虑到是老论坛升级,所以选择 X3.5。

  • Discuz! X3.5 目前最高支持 PHP 8.2、MySQL 8.0。


完整升级步骤:

  1. 购买新的 ECS、PolarDB,具体环境配置步骤参此文

  2. 安装宝塔面板并配置;

  3. 安装 nginx 及 PHP;

  4. 创建网站、配置 SSL、伪静态、防盗链、可写目录禁执行仅允许部分入口文件执行等(.conf);

  5. 配置 hosts;

  6. 如果是正式升级阶段,关闭论坛,防止产生新数据。

  7. 备份原网站程序、PolarDB 数据库;

  8. PolarDB 创建快照。

    测试阶段:从快照还原到新实例(MySQL 5.6 不能直接恢复到 MySQL 8.0),然后从 5.6 迁移到 8.0.x;

    正式阶段:全量模式直接从原实例迁移到 8.0.x,若增量模式且存在触发器,建议从快照还原;

  9. 上传原网站程序到新的站点目录下;

  10. 按 Discuz! X 升级文档升级 X3.4 至 X3.5;详情见下文 ↓;

  11. 升级完成后切换到 PHP 8;

  12. 配置 OSS、Redis、更新缓存等;

  13. 测试论坛基本功能是否正常;检查附件是否能够正常上传检查附件是否正常显示;全面检查控制台配置;

  14. 逐个开启插件并检查兼容性(短信通、马甲引擎等);

  15. 按二开备忘录逐个按需进行二开;

  16. 逐个修改调用论坛接口的项目及直接调用论坛数据库的项目;

  17. 调试 MAGAPP 接口;

  18. 尝试强制 https 访问;

  19. 将以上所有修改后的程序保留备份;发布升级公告并关闭论坛;重复以上步骤;修改域名解析;开启论坛;

  20. 配置 IP 封禁、定时器、日志、自动备份、配置其它 ECS 的 hosts 等;

  21. 查看搜索引擎中收录的地址,是否有无法访问的情况;

  22. 尝试将历史遗留的本地附件全部转移到 OSS;

  23. 建议 在新服上创建 3 个网站:

    1. 第 1 个用来尝试迁移、升级、二开,并测试所有功能

    2. 第 2 个用来再次重复这些步骤,最终保留程序代码及 UGC 文件,作为最终的网站程序,以正式域名作为网站根目录路径;

    3. 第 3 个用来正式升级,主要功能是升级最新数据库。完成后修改第 2 个网站的数据库连接指向到最新的数据库,差异化同步新增的 UGC 文件到第 2 个网站。


Discuz! X 升级步骤及注意点:

  • 因 PolarDB MySQL 不支持压缩,所以应移除 Discuz! 和 UCenter 代码中所有的 MYSQLI_CLIENT_COMPRESS,将 , MYSQLI_CLIENT_COMPRESS 替换为 /*, MYSQLI_CLIENT_COMPRESS*/

  • 升级前务必先修改 ./config/ 目录下的数据库/缓存连接信息,以防出现新站连接老库的情况;

  • 官方文档进行升级,升级前先修改一下:

  • 【UC】先升级 UCenter 1.6 至 1.7。

    将 /uc_server/data 权限改为 777 并递归。

    打开 update_ucenter_adult.php 修改 $limit 值为 10000 以免执行超时

    因通信失败的“发送通知失败”可以直接改 URL 参数跳过就完成了,原因可能是因数据量大,发送改名通知执行改名时超时。等DZ升级完成后UC会自动重试改名通知,或单独写个 php 文件将 UCenter 的用户名同步到应用的数据库。

  • 【DZ】运行到 /install/update_adult.php?step=innodb&table=pre_common_member_grouppm 时报错:Duplicate key name 'gpmid' ALTER TABLE common_member_grouppm ADD INDEX gpmid(gpmid);

    解决方法:先删除索引,因保存时提示失败,应同时取消 gpmid 字段的自增,转换成功后再设置自增。

  • 【DZ】运行到 /install/update_adult.php?step=file 一片空白而停止

    正在解决

  • 【问题】common_menber 表用户名字段编码转换失败

    原因是部分用户名包含特殊字符(如全角空格),用以下语句查看两个表同一 uid 的不同用户:

    SELECT 
        u.uid, 
        u.username AS ucenter_username, 
        c.username AS common_username
    FROM 
        pre_ucenter_members u
    JOIN 
        pre_common_member c ON u.uid = c.uid
    WHERE 
        u.username <> c.username

    Discuz! 用户登录都是以 UCenter 中的用户名为主,所以可以写个小程序直接将 pre_ucenter_members 的用户名同步到 pre_common_member 中,另外 pre_ucenter_members 的用户数少于 pre_common_member 是正常的。若 pre_common_member_archive 表遇到错误同理。

  • 如果用户登录慢,或打开 UCenter 慢,是因为 UC 正在通知 DZ 改用户名,每次打开一个页面会更改一个用户名,具体可以查看 pre_ucenter_notelist 中 closed 为 0 的队列,或进入 UC 后台-数据列表-通知列表 查看。

  • 【问题】发布主题遇到错误:(1062) Duplicate entry '*' for key 'pid'

    【原因】forum_post 中的 pid 不是自动增长的,而是由表 forum_post_tableid 中自动增长的 pid 生成的。如果生成的 pid 值已在 forum_post 表中存在,则会出现此错误。

  • 【解决】迁移数据库时应关闭论坛,以防止 forum_post 表有新数据插入。

  • 【问题】打开帖子页面 ./thread-***-1-1.html 显示 404 Not Found,而 ./forum.php?mod=viewthread&tid=*** 可以正常打开

    【原因】未配置伪静态(可在宝塔面板中选择)

  • 【问题】打开 UCenter 时报错:UCenter info: MySQL Query Error SQL:SELECT value FROM [Table]vars WHERE name='noteexists'

    【解决】打开文件 ./uc_server/data/config.inc.php 配置数据库连接

  • 【问题】打开登录 UCenter 后一片空白

    【解决】将目录 ./uc_server/data/ 设为可写

  • 需要将原来安装的插件文件移回 ./source/plugin/ 目录,并设置可写;

  • 界面-表情管理,界面-编辑器设置-Discuz!代码


后续 Discuz! X3.5 小版本升级注意事项:

  1. 确认插件是否支持新版本(如短信通)

  2. 先创建一个新网站测试二开代码

  3. 保留 /config/、/data/、/uc_client/data/、/uc_server/data/、/source/plugin/,其它移入 old

  4. 上传文件

  5. 移回其它需要的文件,如:

  6. -- 勋章/loading/logo/nv 等:/static/image/common/

  7. -- 表情:/static/image/smiley/

  8. -- 水印:/static/image/common/watermark.*

  9. -- 风格:/template/default/style/t2/nv.png 等

  10. -- 默认头像:/uc_server/images/noavatar_***.gif

  11. -- 根目录 favicon.ico 等

  12. -- 及其它非 DZ 文件

  13. 再次检查可写目录的写入权限和禁止运行 PHP 效果。


xoyozo 1 年前
1,382

截止 2024 年 9 月,CZDB 数据已支持 JAVA、PHP、C、Node.js、Python 语言解析,但官方迟迟未推出 C# / ASP.NET 的版本,于是我参照前面几种语言版本写了 C# 版,支持 IPv4 与 IPv6,实测查询速度,CZDB 版的 MEMORY 模式比原来的 DAT 版数据库快数百倍(具体要看磁盘和内存的读写速度)。能够有效降低 CPU 的使用率,特别是在需要频繁查询 IP 属地的应用场景(譬如每个 HTTP 请求都要判断 IP 属地来决定是否允许访问)。

我要试试→

源代码已提交给纯真官方,相信很快就会有官方版本的 SDK。

xoyozo 1 年前
2,292

要将一个服务公开给外部访问,必须开放端口,例举一些场景的端口映射:

  • VMware 实现宿主机端口映射到虚拟机端口:

    打开 VMware 的菜单中的 编辑 - 虚拟网络编辑器,

    在弹出窗口中表格中的选中“NAT”项,点击下方的“NAT设置”(若无法操作需要先点击“更改设置”允许)

    在“NAT设置”中“添加”,填写主机端口和虚拟机端口、虚拟机IP地址。

    这样,宿主机就能访问到虚拟机中的服务了。

  • 在 Windows 11 的防火墙中允许端口:

    在“设置”或“控制面板”中打开防火墙,“高级设置”

    在“入站规则”中“新建规则”

    选择“端口”并填写,完成。

    这样,局域网的其它电脑就能访问到这台 Windows 的服务了。

  • 小米路由器:

    登录路由器,进入“高级设置”,

    切换到“端口转发”,添加规则,

    这样,外网就能通过路由器的外网IP来访问局域网中的内网服务了。

  • 华为路由器 AX3 Pro:

    登录路由器,进入“更多功能”,

    展开“安全设置”,选择“NAT服务”,

    点击“+”号设置端口映射。

    这样,外网就能通过路由器的外网IP来访问局域网中的内网服务了。

  • H3C ER3200G2 路由器:

    登录路由器,展开“高级设置”,“地址转换”,

    切换到“虚拟服务器”,“新增”,

    填端口和内部服务器IP,完成。

    这样,外网就能通过路由器的外网IP来访问局域网中的内网服务了。

xoyozo 1 年前
985

例子:IPAddress.Parse("27.184.49.031")

Parse 方法认为 031 是八进制数,所以最终的结果是 27.184.49.25。

例子:IPAddress.Parse("27.184.49.081")

同理,“0”开头的数会按八进制数处理,那么这个转换将抛出异常:提供了一个无效的参数。An invalid IP address was specified.

xoyozo 1 年前
843

实例化方法一:DbSearcher(String dbFile, QueryType queryType, String key)

实例化方法二:DbSearcher(InputStream is, QueryType queryType, String key)


  • 方法一通过传入文件路径来实例化,方法二通过传入文件流来实例化;

  • 当 queryType 为 MEMORY 时,方法一和方法二只有在实例化时有性能差别,差别在于将指定路径的文件读到内存中保存;在执行 Search 方法时无性能差别,因为都是在内存中执行查找;

  • queryType 为 MEMORYBTREE 的差别在于前者是在内存中查找,速度快但占内存,后者是在文件中查找,速度慢但省内存


错误:Padding is invalid and cannot be removed.

原因:可能是数据库文件与密钥不一致。

xoyozo 1 年前
1,872

宝塔面板中-安全-系统防火墙 功能非常丰富,特别是“地区规则”用来屏蔽来自国外的请求非常有用,那些通过 URL 来找网站漏洞的恶意请求大多来自国外。但是添加规则经常无反应

image.png

于是找到这个功能对应的配置文件:/etc/firewalld/zones/public.xml

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <port protocol="tcp" port="80"/>
  <port protocol="tcp" port="443"/>
  <masquerade/>
  <rule family="ipv4">
    <source address="43.131.232.135"/>
    <drop/>
  </rule>
  <rule family="ipv4">
    <source address="103.150.11.45"/>
    <drop/>
  </rule>
  <rule>
    <source ipset="US"/>
    <drop/>
  </rule>
  <rule>
    <source ipset="GB"/>
    <drop/>
  </rule>
</zone>

修改完成后重启防火墙。

但是看到的效果好像并不一致,甚至有时候服务器重启后防火墙是关闭的,但是有时候又是生效的。

关键的问题是CPU占用异常高。

反正宝塔的系统防火墙功能挺好挺强大,但是用起来不稳定不顺手,有些暴殄天物了。

相关阅读:

系统防火墙添加规则转圈卡死

2024年8月30日补充 :宝塔面板中配置禁用IP等规则时,提示保存成功或未提醒是否成功,但效果是未成功。其实在宝塔自己的配置里已经记录了(包含备注),但在系统防火墙配置文件中未更改成功,手动修改系统防火墙配置文件就能完全修改成功。(系统防火墙配置文件中没有备注信息,根据IP地址等规则与宝塔自己的配置文件里的记录关联后,在宝塔面板安全模块中展示出来就有备注了。)

2024年8月30日下午补充:在宝塔的软件商店找到这个应用,看到红色的说明,啥都明白了:

image.png

于是果断关闭了系统防火墙,开始研究其它替代方案。

xoyozo 1 年前
1,056

今天忘了带鼠标,正巧笔记本电脑的触摸板驱动坏了,一时也用不了,所以想到用 iPhone 当作电脑的触控板来用。电脑操作系统是 Windows。


一、电脑上下载并安装 Remote Helper(此步需要会使用纯键盘来操作电脑,常用的键是 TAB、方向键、回车键)

二、手机上 App Store 中搜索并获取 鼠标·键盘


电脑和手机需要连接同一局域网,如果没有局域网,可以将电脑连接 iPhone 的热点。

打开 App,搜索 PC,授权,就可以控制光标了。

如果电脑未显示光标,尝试双击 CTRL 键来确定当前光标的位置,前提是安装了 PowerToys

xoyozo 1 年前
3,778
  1. 购买 ECS

  2. 解析域名(非网站域名)、修改实例名称、主机名

  3. 设置阿里云(重要)

  4. 远程连接进入 ECS(若解析未生效可以先用 IP)(若新服默认使用 22 端口,可在阿里云控制台登录系统,或先在安全组临时放行 22 端口)

  5. 修复系统漏洞

  6. 将磁盘挂载到目录(fdisk、df 命令参考:https://xoyozo.net/Blog/Details/SSH

  7. 安装宝塔面板(本文以宝塔面板方案为例,选择任何你喜欢的环境部署方案都行)。可以在阿里云控制台ECS实例页安装扩展程序

  8. 临时放行宝塔面板端口,进入宝塔面板(http方式),或用命令更改宝塔面板端口

  9. 配置面板 SSH、添加新的安全端口、面板设置

  10. 更改 SSH 默认端口(参:https://xoyozo.net/Blog/Details/change-default-port

  11. 安装 nginx、PHP 等

  12. 通过 lua 接入 WAF

  13. 配置 PHP 扩展(Redis、sqlsrv(注意选择兼容的版本)、memcached 及端口)

  14. 创建网站,配置网站(路径、伪静态等)

  15. 迁移网站文件(参:https://xoyozo.net/Blog/Details/SSH

  16. 仔细对比新旧网站的配置文件(特别是 .php 的访问权限,参:https://xoyozo.net/Blog/Details/nginx-location-if

  17. 设置写入目录(使用 rsync 同步的文件会同步用户和权限)

  18. 解析域名(先改 hosts 测试网站功能)

  19. 更改内网其它 ECS 上的 hosts

  20. 关闭原 ECS(能马上发现问题,不然等运行一段时间才发现问题就麻烦点)

  21. 设置 FTP

  22. 迁移“计划任务”

  23. 所有网站和软件的配置文件都要使用 WinMerge 进行对比

  24. 移除“宝塔面板-安全”和“阿里云-ECS-安全组”中不用的端口

  25. 再次检查阿里云设置

  26. 私网中若有 ECS 的 hosts 中域名直接绑定到私网 IP 的,做相应更改

  27. 其它:ERP 添加到期提醒、WAF 增加该 ECS、备份工具增加该 ECS


更多文章:

从零搭建一台阿里云 ECS(Windows Server)并迁移网站

xoyozo 2 年前
3,045

* 本文信息仅供参考,以设备最新产品说明为准!


网关型号角色蓝牙蓝牙 MeshZigbeeWi-Fi端口其它
小米中枢网关ZSWG01CM中枢网关支持 100 个
支持 200 个不支持2.4G / 5G网口四核,4G存储
小米多模网关ZNDMWG03LM从网关支持 100 个支持 100 个

Zigbee 3.0

支持 32 个(中继 128 个)

2.4G支持 HomeKit
小米多模网关2DMWG03LM从网关支持 100 个
支持 100 个

Zigbee 3.0 

支持 32 个(中继 128 个)

2.4G / 5G网口双核128M
绿米 Aqara 网关M1SZHWG15LM从网关不支持不支持

Zigbee 3.0

支持 32 个(中继 128 个)

2.4G

支持 HomeKit

支持夜灯、报警

绿米 Aqara 网关M1S 2022款(第二代)ZHWG20LM从网关不支持不支持

Zigbee 3.0

 支持 32 个(中继 127 个)

2.4G

双核64M

还支持 matter、Apple Home

支持夜灯、报警

绿米 Aqara 网关 M2 2022款ZHWG19LM-不支持不支持Zigbee 3.02.4G网口

不支持米家 App

支持红外

绿米 Aqara 方舟智慧中枢 M3ZHWG24LM中枢网关支持Aqara设备
支持2.4G / 5G
不支持米家 App,支持 Aqara Home app、Apple Home、matter,支持红外,8G存储
易来 Yeelight 网关(mesh 版)YLWG01YL白色盲网关支持支持不支持2.4G网口支持 HomeKit
易来 Yeelight Pro S20 蓝牙 Mesh 网关YLWG01YL灰色从网关支持支持不支持2.4G

支持 Yeelight Pro 和 HomeKit 3

未原生接入米家,但可通过“其它平台”接入米家

青萍蓝牙网关
CGSPR1盲网关支持不支持不支持2.4G
小米智能家庭面板
XMZHP01LM从网关支持 100 个
支持 100 个不支持2.4G / 5G86型墙壁开关
小米智能中控屏 Max
中枢网关支持支持不支持2.4G / 5G网口双86底盒,尺寸292x160mm
小米路由器 BE6500 ProDR08中枢网关支持支持不支持2.4G / 5G4个Wi-Fi 7 路由器,四核1G
Xiaomi路由器BE10000 Pro
中枢网关支持 300 个不支持2.4G / 5.2G / 5.8G网口无线有线双万兆、支持两条宽带同时接入、IPTV/游戏网口自定义
其它带 Pro 的小米路由器

中枢网关





Sound 2 Max

中枢网关






-> 查看目前可以做中枢和从网关的产品中枢网关 / 从网关

-> 网关是什么?网关怎么选?

xoyozo 2 年前
6,442