这段日志里出现的代码很像一次典型的 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...')));
完整的攻击思路:
-
利用某个漏洞(模板标签、上传漏洞、SQL 注入等) 触发
pboot:if
(可能是 PbootCMS 的模板标签)。 -
调用
file_put_contents('temp.php', base64_decode('...'))
把攻击者的 PHP 代码写入网站根目录。 -
攻击者随后访问
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)或严格过滤。 |
旧版或未更新的插件/模块 | - 列出所有第三方插件的版本号,对比官方安全公告。 |
弱口令 / 默认账号 | - 检查 admin 、root 、pboot 等常见用户名是否仍在使用默认密码。 |
服务器配置 | - 确认 allow_url_fopen 、allow_url_include 已关闭。<br>- open_basedir 是否限制了 PHP 脚本的访问范围。 |
3.2 代码审计
-
全局搜索(Linux):
# 关键函数 grep -RIl "file_put_contents" . grep -RIl "base64_decode" . grep -RIl "eval(" . grep -RIl "preg_replace" . grep -RIl "assert(" .
-
审计可疑文件
对每个返回的文件,打开查看是否有 拼接字符串 (如
"file_put_"."contents"
)或 十六进制转义 (\x22
)的写法,这正是攻击者用来规避审计的手法。 -
检查日志
-
访问日志 (
access.log
): 查找对temp.php
、/upload/
、/admin/
等路径的异常请求,尤其是POST
、GET
含有base64
、eval
、<?php
等关键字的请求。 -
错误日志 (
error.log
): 看是否有PHP Warning: file_put_contents():
的报错,这说明后门写入尝试被阻止或失败。
-
3.3 对比文件完整性
如果你之前有 文件完整性校验工具 (如 md5sum
、sha1sum
、tripwire
、integrity-checker
),可将当前文件与已知安全基线进行比对,快速发现被篡改的文件。
没有基线?
可以从官方发布的源码包(对应相同版本)解压,对比
diff -r
或rsync --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 运行。 |
检查站点根目录、子目录以及服务器配置(.htaccess 、nginx.conf 、httpd.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_..."] |
看是否直接把外部数据喂给 eval 、base64_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 | 静态代码分析,能发现未使用的 eval 、include 等风险 |
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} |
通过 eval 、assert 、preg_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 |
攻击者利用公开文件收集信息后发动精准攻击。 |