webshell一般
一个php文件,内容就一行:。传上去,浏览器里敲个URL,密码一填,服务器就是你的了。这事儿听起来像电影桥段,但webshell的本质就这么朴素——一段能在目标机器上执行任意代码的脚本,通常藏在Web目录里,通过HTTP请求接收指令。它不是什么高级漏洞利用框架,就是一把钥匙,配好了锁孔就能开门。
我头一回接触webshell是帮朋友看一台被黑的WordPress站。攻击者留了个文件叫wp-config2.php,混在几十个正常文件里,名字看着像备份配置。打开一看,二十几行混淆过的代码,base64套三层,解出来是个功能齐全的后门面板:文件管理、命令执行、数据库导出、甚至带个简易的端口扫描。朋友问我这玩意儿怎么进来的,我查了访问日志,发现是某个插件目录下的上传接口没做类型校验,攻击者直接POST了一个伪装成图片的php文件。就这么简单。
webshell一般分两种路子。一种是大马,功能全,体积大,几十KB起步,带界面带按钮,适合长期控制;另一种是小马,往往就一行代码,上传即用,用完就删,隐蔽性极强。大马像在目标机器上开了个管理后台,小马更像在门缝里塞了把备用钥匙。实际攻防里,小马用得更多——先传小马,确认权限和环境,再通过小马落地大马,或者干脆只留小马,靠命令执行完成所有操作。
检测webshell这件事,传统杀软基本靠特征匹配,效果有限。攻击者随便改个变量名、加个注释、把eval换成assert或者create_function,特征库就失效了。更麻烦的是内存马,代码不落盘,直接注册到PHP-FPM或者Java的Filter链里,文件系统上根本找不到。我见过一个案例,管理员用find . -name "*.php" -mtime -1搜最近修改的文件,什么也没搜到,但网站就是不断往外发垃圾评论。最后查了进程内存,发现webshell挂在auto_prepend_file里,每次请求都自动加载,文件时间戳被改回了三个月前。
防守方也不是完全被动。流量层面看,webshell的HTTP请求往往有固定模式:POST参数名短且固定,响应内容包含命令输出特征,或者请求频率异常规律。主机层面,监控php进程的fork行为、system函数调用、以及Web目录下文件的inode变化,都能抓到蛛丝马迹。但说实话,大部分中小站点连基本的日志审计都没做全,webshell存活几个月甚至几年是常态。
有个细节挺有意思。很多webshell会主动清理痕迹:unset掉$_POST、$_GET,把error_log关掉,甚至修改.htaccess禁止特定IP访问。但攻击者往往忽略一点——Web服务器的access_log里,那个webshell文件的请求体大小和正常页面完全不同。正常页面响应几KB到几十KB,webshell执行ls可能只返回几百字节,执行cat /etc/passwd又突然飙到几KB。这种响应大小的剧烈波动,用简单的统计脚本就能筛出来。
说到底,webshell一般不是什么高深技术。它依赖的是目标系统某个环节的疏忽:文件上传没校验、目录权限过宽、框架版本老旧、或者管理员密码太弱。防御的核心也不复杂——把上传接口管住,把Web目录权限收紧,把日志看住。但现实是,这三件事里能同时做到两件的站点,已经算不错了。
(责任编辑:娱乐)














