0x01 Webshell背后的故事
Webshell通常被攻击者用于远程控制和管理受害网站的服务器。这类文件通常是嵌入在目标服务器的脚本文件中,通过远程请求执行一些命令。这种攻击技术的原理是利用目标Web服务器的漏洞或者配置不当,使攻击者能够在服务器上上传一个Webshell,从而获取到远程控制权限。
一个常见的Webshell编写方式就是利用服务器支持的编程语言(如PHP、ASP、JSP等),编写一段可以执行系统命令或者操作文件的脚本。那么,为什么Webshell能够如此有效地绕过检测呢?
Webshell的成功在于:
- 伪装性强:攻击者可以通过修改特定关键字、混淆代码等方式,使Webshell看起来像正常的代码片段。
- 隐蔽性高:一些Webshell可以直接附着到常见的网页文件中,不易被发现。
- 可扩展功能强:攻击者可以通过植入特定代码,使Webshell具备与C2服务器通信等功能。

构建你的实验室
要深入研究Webshell免杀技术,首先需要搭建一个实验环境,既要能支持我们实验的各种技术,又要能确保操作安全。
软件和设备准备
- 操作系统:推荐使用虚拟机中的Linux,如Ubuntu或CentOS。这样可以在不影响主机环境的情况下自由配置。
- Web服务器:在沙盒环境中安装Apache或Nginx服务器。
- 编程语言:装好Python、PHP和C语言编译器。
为了更深入地理解Webshell技术,我们可以在虚拟机里运行一个有已知漏洞的Web应用,比如早期版本的WordPress或Joomla。这些平台由于历史遗留问题,可能存在某些代码注入或文件上传的漏洞,能为Webshell测试提供契机。
环境搭建步骤
- 安装虚拟机:使用VMware或VirtualBox安装Linux系统。
- 配置Web服务器:在Linux系统中安装Apache或Nginx,并确保PHP模块正常工作。
- 设置可访问的目录:设置一个Web目录供实验使用,并确保其权限设置为所有用户可写(仅用于测试)。
搭建好实验环境后,我们将着手于代码编写与免杀技术探讨。
编写POC - 从简单到复杂的Webshell
为了理解Webshell是如何工作的,我们从一个简单的POC开始。这个概念验证代码可以在上传后运行服务器命令。
一个基础的PHP Webshell
<pre><code class="language-php"><?php // 简单的Webshell,获取并执行客户端指定的命令 if(isset($_GET['cmd'])){ echo '<pre>'; $cmd = ($_GET['cmd']); system($cmd); echo '</pre>'; } ?></code></pre>
这个代码允许攻击者通过HTTP请求传入命令并在目标服务器上执行。尽管它的功能看似简单,但正是这种简单的shell容易被免杀技术隐藏。
Python与C 的合璧
下一步,我们可以结合Python和C语言制造一个更复杂的Webshell。C语言可以帮助我们更好地控制进程,而Python则可以执行系统命令并反馈结果。
<pre><code class="language-c">#include <stdio.h>
include <stdlib.h>
include <string.h>
// C代码,用来与Python Webshell进行交互 int main(){ char buf[256]; printf("Enter command: "); scanf("%255s", buf); printf("Executing command: %s\n", buf); system(buf); return 0; }</code></pre>

<pre><code class="language-python">import os
Python代码,执行系统命令
command = input("Enter your command: ") os.system(command)</code></pre>
这段C和Python融合的代码,在功能上与前面的PHP Webshell类似,能够执行输入的任意命令。
对抗的艺术:绕过与免杀策略
在现实世界中,为了绕过常见的杀毒软件和IDS/IPS设备,攻击者通常使用以下免杀技术:

代码混淆与加密
攻击者可以使用混淆技术改变代码中的关键字,使Webshell看起来像随机的字符序列,增加分析困难。
内存加载与伪装
通过将Webshell的代码在服务器内存中动态加载,而非直接写入磁盘,攻击者可以减少被文件扫描工具检测的风险。
自动化免杀工具
一些攻击者使用自动化工具来生成变形的Webshell,这些工具通常会随机修改代码结构以产生不同的shell变体。
探测与防御:如何识别Webshell
要有效识别Webshell,安全研究人员可以从以下几个方面入手:
文件分析与模式识别
定期扫描文件目录中的脚本文件,尝试识别清理过的或异常复杂的PHP代码。

动态监控可疑请求
通过设置Web服务器或WAF,在实时监控请求中的异常参数和行为模式。如发现持续的异常命令请求,则可能存在Webshell。
环境隔离与限制
实现隔离的PHP环境,限制执行外部命令的权限,并记录异常命令执行日志。
红队策略分享
经验1:在使用webshell时尽量避免使用常见的shell代码片段,设计shell时使用不规则的代码结构增加伪装性。
经验2:使用内存加载技术将恶意代码直接在进程空间运行,减少文件监控带来的麻烦。
经验3:在内网渗透测试中,结合本地提权工具与Webshell,同时保持攻击链的完整性。
通过理解Webshell的工作原理和免杀技术,安全研究人员可以更好地防御这类攻击,同时攻击者也能不断提升自己的技术水平,保持在对抗中的优势地位。这是一个不断进化的战争,攻防双方的技术都在不断提高。