网站日志里面老是出现{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 攻击者利用公开文件收集信息后发动精准攻击。
相关推荐
阿拉丁的梦40 分钟前
教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)
开发语言·python
木宇(记得热爱生活)1 小时前
一键搭建开发环境:制作bash shell脚本
开发语言·bash
Cisyam^1 小时前
Go环境搭建实战:告别Java环境配置的复杂
java·开发语言·golang
IAR Systems2 小时前
在IAR Embedded Workbench for Arm中实现Infineon TRAVEO™ T2G安全调试
开发语言·arm开发·安全·嵌入式软件开发·iar
xzkyd outpaper3 小时前
Android中APK包含哪些内容?
android
jayzhang_3 小时前
SPARK入门
大数据·开发语言
fured3 小时前
[调试][实现][原理]用Golang实现建议断点调试器
开发语言·后端·golang
大翻哥哥3 小时前
Python地理空间数据分析:从地图绘制到智能城市应用
开发语言·python·数据分析
NPE~3 小时前
[手写系列]Go手写db — — 第二版
开发语言·数据库·golang·教程·db·手写系列