网站日志里面老是出现{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22.....

这段日志里出现的代码很像一次典型的 PHP 后门(Web‑Shell)注入

下面先拆解一下它的大致含义,再给出 排查、清理、以及防御 的完整步骤,帮助你把站点恢复到安全状态。


1️⃣ 代码拆解(帮你快速定位问题)

复制代码
{pboot:if((\x22file_put_co\x22.\x22ntents\x22)(\x22temp.php\x22,
        (\x22base6\x22.\x224_decode\x22) ... )}
片段 实际意义
\x22 十六进制的双引号 ",所以 \x22file_put_co\x22.\x22ntents\x22 实际是 "file_put_co"."ntents",即 file_put_contents
\x22temp.php\x22 "temp.php",目标文件名
\x22base6\x22.\x224_decode\x22 "base6"."4_decode"base64_decode
...(后面省略) 通常会跟一段 base64 编码的恶意 PHP 代码 ,它被解码后写入 temp.php,从而在服务器上留下后门文件。

示例恶意 URL(解码后)

复制代码
/index.php?pboot:if(file_put_contents('temp.php',base64_decode('PD9waHA...')));

完整的攻击思路

  1. 利用某个漏洞(模板标签、上传漏洞、SQL 注入等) 触发 pboot:if(可能是 PbootCMS 的模板标签)。

  2. 调用 file_put_contents('temp.php', base64_decode('...')) 把攻击者的 PHP 代码写入网站根目录。

  3. 攻击者随后访问 temp.php 即可执行任意命令、下载数据库、植入更多后门等。


2️⃣ 快速应急处理(先把危害止住)

目标:阻止后门继续运行、恢复网站基本功能、避免数据进一步泄露。

步骤 操作 说明
① 立刻下线 在防火墙或云平台上把站点切换到 Maintenance / 只读 模式,或临时关闭 HTTP/HTTPS 端口。 防止攻击者继续利用后门。
② 更改所有凭证 - FTP / SFTP / SSH 密码<br>- 数据库(MySQL)账号<br>- 后台管理(CMS)账号 使已经泄露的凭证失效。
③ 暂时禁用 PHP 在站点根目录(或受影响的子目录)放置 php_flag engine off(Apache)或 disable_functions = exec,shell_exec,system,passthru,proc_open,show_source(php.ini) 让已写入的 temp.php 失去执行能力,给排查争取时间。
④ 备份当前文件 复制全站(包括隐藏文件)到安全的离线存储,不要直接覆盖到生产环境。 供后续法务取证、对比分析。
⑤ 查杀已写入的后门文件 - 搜索 temp.php*.php 中出现 base64_decode(eval(assert(preg_replace('/e' 等关键字的文件。<br>- 常用命令(Linux):<br>grep -RIl "base64_decode" .<br>find . -type f -name "*.php" -exec grep -l "eval(" {} + 先把已知后门删掉或改名(最好直接删除)。
⑥ 暂停所有自动化脚本 如 CI/CD、计划任务(cron)等,防止它们在清理期间把后门重新写回。

注意 :在 关闭 PHP 前,请先确保站点仍能提供必要的静态资源(HTML、CSS、JS)。如果站点依赖 PHP 渲染页面,您可以先把站点切换到 维护页面(静态 HTML),以免用户看到错误信息。


3️⃣ 深度排查(找出根因并彻底清理)

3.1 检查入口点

可能的漏洞来源 检查要点
模板标签/自定义标签 (如 {pboot:if(...} - 搜索所有 .html.htm.tpl.php 中出现 pboot: 的地方。<br>- 确认是否有未过滤的用户输入直接拼接到 eval()include()file_put_contents() 中。
文件上传功能 - 检查上传目录是否有执行权限(chmod 755/chmod 700),是否限制文件后缀。<br>- 确认是否对上传的文件做了 MIME 类型文件头 检查。
数据库注入 - 搜索所有 INSERT/UPDATE 语句是否使用了预处理(PDO/prepare)或严格过滤。
旧版或未更新的插件/模块 - 列出所有第三方插件的版本号,对比官方安全公告。
弱口令 / 默认账号 - 检查 adminrootpboot 等常见用户名是否仍在使用默认密码。
服务器配置 - 确认 allow_url_fopenallow_url_include 已关闭。<br>- open_basedir 是否限制了 PHP 脚本的访问范围。

3.2 代码审计

  1. 全局搜索(Linux):

    复制代码
    # 关键函数
    grep -RIl "file_put_contents" .
    grep -RIl "base64_decode" .
    grep -RIl "eval(" .
    grep -RIl "preg_replace" .
    grep -RIl "assert(" .
  2. 审计可疑文件

    对每个返回的文件,打开查看是否有 拼接字符串 (如 "file_put_"."contents")或 十六进制转义\x22)的写法,这正是攻击者用来规避审计的手法。

  3. 检查日志

    • 访问日志access.log): 查找对 temp.php/upload//admin/ 等路径的异常请求,尤其是 POSTGET 含有 base64eval<?php 等关键字的请求。

    • 错误日志error.log): 看是否有 PHP Warning: file_put_contents(): 的报错,这说明后门写入尝试被阻止或失败。

3.3 对比文件完整性

如果你之前有 文件完整性校验工具 (如 md5sumsha1sumtripwireintegrity-checker),可将当前文件与已知安全基线进行比对,快速发现被篡改的文件。

没有基线?

可以从官方发布的源码包(对应相同版本)解压,对比 diff -rrsync --dry-run -c

3.4 数据库检查

有时候攻击者会把恶意代码写进数据库(例如 CMS 内容字段中),并在页面渲染时直接输出。执行以下查询:

复制代码
SELECT id, title, content
FROM   your_table
WHERE  content LIKE '%base64_decode%' OR content LIKE '%eval(%';

如果发现异常记录,立刻 清理重新生成 正常内容。


4️⃣ 完整清理方案(恢复到安全状态)

步骤 操作 备注
① 重新部署干净代码 - 从官方源码包或 Git 仓库检出 全新 代码。<br>- 用 版本控制系统(Git)对比本地与官方代码,确保没有额外文件。

已经检查了,没发现temp.php文件,有影响么?

1️⃣ 先别慌------没有 temp.php 并不等于"一切安全"

可能的情况 说明 下一步建议
文件已被删除代码仍在其它位置 攻击者往往会把后门写入 多个文件,或把真正的恶意代码埋在已有业务文件里(index.php、config.php、theme‑xxx.php 等)。 继续全站搜索关键函数(见下文)。
写入的文件名被改了 攻击者常用随机名字(temp123.php、a1b2c3.php、uploads/xxxx.php)来躲避检测。 通配符hash 检索所有可执行 PHP 文件。
后门不是 PHP 文件 有时会利用 .phtml、.inc、.txt、.asp、.js 等后缀,配合服务器的 AddHandler 配置让它们能被当作 PHP 解释。 所有文本类文件(*.php, *.phtml, *.inc, *.txt, *.js)都列出来检查。
后门已被 chmod 000 或放在不可访问的目录 攻击者可能先写入后门,随后把文件权限调为不可读,等到后面再切换回来。 find /path -type f -perm -u=x -o -perm -g=x -o -perm -o=x 查找 任何可执行 的文件。
后门通过 .htaccess web‑server 配置 执行 例如 AddHandler application/x-httpd-php .txt,把 .txt 当成 PHP 运行。 检查站点根目录、子目录以及服务器配置(.htaccessnginx.confhttpd.conf)。

结论 :仅凭"没有 temp.php"不能说明系统已被彻底清理,仍需要一次 全局、细粒度的安全审计


2️⃣ 推荐的 全站扫描清单(一步步执行)

先在维护模式/仅本地访问下 完成,防止误删导致业务中断。

2.1 基础文件定位(Linux 示例)

复制代码
# ① 只列出所有 php、phtml、inc、txt、js、html(所有可能被当成脚本的后缀)
find /var/www/your_site -type f \( -iname "*.php" -o -iname "*.phtml" -o -iname "*.inc" -o -iname "*.txt" -o -iname "*.js" -o -iname "*.html" \) > /tmp/all_files.txt

# ② 过滤出可能的恶意关键字(大小写不敏感)
grep -i -E "base64_decode|eval\(|assert\(|preg_replace\(|shell_exec|system\(|passthru|phpinfo|proc_open|chmod\(|chmod\(|ini_set|php://input|php://filter|php://memory|php://temp|exec\(|popen\(|dl\(|ob_start|ob_get_contents|file_put_contents|fopen\(|fwrite\(|include\(|require\(|require_once|include_once" -f /tmp/all_files.txt > /tmp/suspect_candidates.txt

提示

  • -i:不区分大小写。

  • 正则里用 | 列举常见后门函数。

  • grep -E 支持扩展正则,配合 -f 从文件读取待检查路径,避免一次性把所有文件名直接塞进命令行(可能超出字符长度限制)。

2.2 高阶检测(把"混淆/十六进制/Unicode"也抓出来)

复制代码
# 十六进制字符(\x??)或 Unicode \u??
grep -i -E "(\\x[0-9a-fA-F]{2})|(\\u[0-9a-fA-F]{4})" -f /tmp/all_files.txt >> /tmp/suspect_candidates.txt

# base64 长串(通常 > 30 字符)+ eval/exec 组合
grep -i -E "eval\((base64_decode|gzinflate|str_rot13|strrev|str_replace|preg_replace).{30,}\)" -f /tmp/all_files.txt >> /tmp/suspect_candidates.txt

2.3 进一步细化------对每个嫌疑文件做人工审计

步骤 操作 检查点
打开文件 vim -c "set nowrap" 或使用 IDE(VSCode、PHPStorm) 让长行不会自动换行,防止混淆隐藏。
搜索关键字 :g/base64_decode:g/eval( 确认是否是 单行分块 (比如 $a="ba". "se64_". "decode";)。
检查字符串拼接 常见技巧:$f="file_put_". "contents";${"_".'GET'}["a"] 这种代码在普通业务里很少出现。
看是否有 obfuscation(压缩、加密) gzinflate(base64_decode(...))str_rot13(... )preg_replace("/.*/e", ...) 这类组合几乎都是后门。
确认是否有写文件/执行系统命令 file_put_contents, exec, system, shell_exec, passthru, proc_open, popen 只要出现,就需要重点检查。
审计入口变量 $GLOBALS, $_GET, $_POST, $_REQUEST, $_COOKIE, $_SERVER["HTTP_..."] 看是否直接把外部数据喂给 evalbase64_decode
审计文件权限 ls -l <file> 权限过宽 (777) 需要立刻收回。

2.4 在线/离线工具(可选)

工具 适用场景 快速安装/使用方式
ClamAV 病毒/木马扫描(有针对 PHP WebShell 的规则) apt-get install clamav; clamscan -r --detect-pua=yes /var/www/your_site
rkhunter 主机层面的 rootkit 检测 apt-get install rkhunter; rkhunter --checkall
LMD (Linux Malware Detect) 专门针对 Linux + WebShell `wget -O - http://www.rfxn.com/downloads/maldetect-current.tar.gz
PHPStan / Psalm 静态代码分析,能发现未使用的 evalinclude 等风险 composer require --dev phpstan/phpstan; vendor/bin/phpstan analyse src/
Git‑Diff 对比官方源码 git clone https://github.com/pbootcms/pbootcms.git; diff -r pbootcms/ /var/www/your_site/

强烈建议 :先在 测试机(或 Docker 容器)里跑一次完整的 LMD / ClamAV 扫描,确认结果再在生产机上执行删除操作。


3️⃣ 进一步排查 日志(找出攻击路径)

3.1 访问日志(nginx/Apache)

复制代码
# ① 查找包含 base64、eval、shell、pboot:if 的请求
grep -iE "base64|eval|shell|pboot:if|php%5C" /var/log/nginx/access.log > /tmp/log_suspect.txt

# ② 聚合出现次数最高的 URL
awk '{print $7}' /tmp/log_suspect.txt | sort | uniq -c | sort -nr | head -20

常见攻击载体

攻击手法 典型载体(出现频率高的入口) 常见关键字 / 代码片段(搜索关键词) 说明
SQL Injection URL 参数、POST 表单、JSON、XML、GraphQL UNION SELECT, ' OR '1'='1, /**/, /*, sleep(, benchmark(, pg_sleep( 利用未过滤的用户输入拼接到 SQL 语句,常见于登录、搜索、分页、过滤接口。
LFI / RFI(本地/远程文件包含) ?file=, ?page=, ?template=, ?inc= ../, ..\\, /etc/passwd, php://, data://, http://, https://, expect:// 通过 include/require 加载用户可控路径的文件,实现代码执行或信息泄露。
文件上传漏洞 上传接口 multipart/form-data(图片、文档、Excel) .php, .phtml, .php5, .phar, .inc, .txt, .js<?php, eval(, base64_decode( 上传后文件被放置在 webroot,或在服务器临时目录通过 move_uploaded_file 移动后仍能执行。
命令执行(Command Injection) ?cmd=, ?action=, ?run=, 任何系统调用参数 system(, exec(, shell_exec(, ```, passthru(, proc_open(, popen(, cmd.exe, bash -c 用户输入直接拼接到系统命令,常见于 "ping"、 "traceroute"、 "whois" 等工具的后端实现。
代码注入(PHP code injection) 模板标签、CMS 自定义字段、URL 参数、POST 参数、HTTP Header、Cookie eval(, assert(, create_function(, preg_replace('/e', base64_decode(, gzinflate(, ${_GET}, ${_POST}, ${_REQUEST} 通过 evalassertpreg_replace(/e)等执行用户提供的 PHP 代码。
WebShell / Backdoor 任意 .php, .phtml, .inc, .txt, .js, .asp, .aspx 等文件 <?php, shell_exec, base64_decode, gzinflate, $_REQUEST, $_POST, $_FILES,常配合 混淆\x..chr()str_rot13 攻击者写入可以执行系统命令的脚本,一旦访问即可完全控制服务器。
跨站脚本(XSS) 反射型 URL 参数、表单输入、评论、富文本编辑器、HTTP Header <script>, onerror=, javascript:, src=href=<svg/onload= 可劫持用户会话、执行任意前端代码,亦可配合 CSRF+XSS 发起内部请求。
跨站请求伪造(CSRF) 任意 POST/GET 请求,尤其是 状态修改 接口 csrf_token 缺失、Referer 不检查、SameSite=None 利用受信任用户的浏览器向目标站点发起恶意请求。
文件包含/读取漏洞(File Disclosure) ?download=, ?view=, ?file= ../, ..\\, /etc/passwd, php://filter, php://input 读取服务器敏感文件,泄露源码、配置、密钥。
反序列化(Object Injection) ?data=, POST body, Cookie, Header(如 X-Auth-Token O:(PHP 序列化)、__PHP_Incomplete_Class_Name, unserialize(, yaml_load( 触发魔术方法 __wakeup/__destruct 执行恶意代码。
目录遍历(Path Traversal) 任何接受路径的参数 ../, %2e%2e%2f, %2e%2e%5c, ..%2f 跳出预设目录读取或写入任意文件。
服务器端请求伪造(SSRF) ?url=, ?host=, ?target=, curl, file_get_contents http://, https://, ftp://, gopher://, dict://, ldap://, file:// 诱导服务器去请求内部网络资源,常用于探测内网、读取 metadata(如 AWS metadata)或执行端口扫描。
业务逻辑漏洞 任意业务流程(优惠券、订单、充值) price=0, discount=100, balance= 绕过业务校验,获取非法利益。
暴力破解 / 帐号枚举 登录接口、密码找回、API 密钥查询 username=admin, login=, reset= 高频失败请求、返回不同错误码或时延差异。
爬虫/信息泄露 公开目录、robots.txt、.git、.svn、.env、.htaccess、readme.html Authorization: Basic, api_key, AWS_ACCESS_KEY_ID, DB_PASSWORD 攻击者利用公开文件收集信息后发动精准攻击。
相关推荐
阿巴斯甜5 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴8 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
BingoGo9 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack9 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android