无文件 WebShell攻击分析
无文件 WebShell 不是指具体的一款 WebShell 攻击工具,而是一种攻击技术。通过动态注入恶意代码到内存中,避免文件落地,从而绕过传统安全检测手段。无文件 WebShell 一般比较广泛用于 JAVA 应用漏洞攻击,尤其是通过 JAVA 反序列化漏洞攻击注入无文件 WebShell 尤为常见。
比较常见 的无文件 WebShell 实现方式:
研判分析
无文件 WebShell 通常通过动态注册 Servlet 或 Filter 实现,攻击者可自定义 URL 匹配模式,使指定 URL 由恶意 Servlet 或 Filter 处理。因此这类 WebShell 的 URL 不再受限于特定后缀,甚至可以无后缀。
当告警事件提示可能存在 WebShell 通讯流量但服务器上未发现对应文件时:
先采用排除法确认是否为误报:
检查历史告警记录,查看该告警是否持续出现
回溯历史流量,确认该 URL 访问是否长期存在
若为近期新增流量,则需考虑内存 WebShell 的可能性;若长期存在,则可能是正常业务流量导致的误报
排查方法
内存马排查:
1. 如果是jsp注入,日志中排查可疑jsp的访问请求。filter或者listener类型,可能会有较多的404但是带有参数的请求
2. 如果是代码执行漏洞,排查中间件的error.log,查看是否有可疑的报错,判断注入时间和方法
3. 根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在过webshell,排查框架漏洞,反序列化漏洞。
4. 如果是servlet或者spring的controller类型,根据上报的webshell的url查找日志(日志可能被关闭,不一定有),根据url最早访问时间确定被注入时间。
5. 如果是filter或者listener类型,可能会有较多的404但是带有参数的请求,或者大量请求不同url但带有相同的参数,或者页面不存在但返回200
使用java-memshell-scanner工具排查
通过jsp脚本扫描并查杀各类中间件内存马,比Java agent要温和一些。
使用该脚本非常简单:只需将 java-memshell-scanner 放置在可访问的 Web 路径下,直接访问即可获取扫描结果。
我们直接点击 kill 即可把它杀掉,或者点击dump下载下来进行人工分析。kill掉发现内存马已经不能连接。
使用 Arthas 工具排查



dump 已加载类的 bytecode 到特定目录
dump org.apache.coyote.type.PlaceholderForType
classloader查看classloader的继承树,urls,类加载信息
使用 copagent 工具排查


防御建议
加强 JAVA 反序列化漏洞防护
部署内存 Webshell 检测工具
定期审查 Servlet/Filter 注册情况
限制高危类加载和反射调用