当前位置:首页 > 百科

php一句话木马代码

一句话木马,话木英文叫 webshell one-liner,马代码核心就一行 PHP 代码。话木最经典的马代码那句:

<?php @eval($_POST['cmd']); ?>

把它存成 shell.php,扔到目标服务器上,话木浏览器或菜刀连上去,马代码POST 一个 cmd 参数,话木服务器就替你执行任意 PHP 代码。马代码就这十几个字符,话木能拿到整台机器的马代码控制权。

拆开看。话木@ 是马代码错误抑制符,防止报错暴露路径。话木eval() 是马代码 PHP 的语言构造器,把字符串当 PHP 代码跑。话木$_POST['cmd'] 接收外部传入的数据。三个东西拼一起,等于开了一扇后门——你发什么,它执行什么。

变种多得数不清。有人把 eval 换成 assert,PHP 7 之前 assert 也能执行字符串。有人用 $_GET 代替 $_POST,有人用 $_REQUEST 通吃。再隐蔽一点的:

<?php $a=$_POST['x'];$a($_POST['y']); ?>

这是动态函数调用,x 传函数名,y 传参数,灵活性更高。还有用 preg_replace 的 /e 修饰符(PHP 5.5 以下),用 create_function,用反引号执行系统命令——每种都对应不同版本的 PHP 特性和 WAF 的检测规则。

实际攻防里,原始的一句话木马早就被杀软和 WAF 盯死了。字符串匹配 eval($_POST 几乎是标配规则。所以有了各种变形:

<?php $a = str_replace('b','','abssbebrt'); $a($_POST['cmd']); ?>

先用字符串拼接绕过静态检测,再动态调用。还有用 base64 编码函数名的,用异或运算构造函数名的,甚至把代码藏在图片 EXIF 信息里配合文件包含漏洞使用的。花样翻新,本质不变:让外部输入进入执行函数。

防御端怎么看这件事。最根本的一条:永远不要相信用户输入。PHP 里 eval、assert、system、exec、passthru、popen、proc_open 这些函数,能禁用就禁用。php.ini 里的 disable_functions 加上它们。但要注意,disable_functions 不是万能的,有些绕过手法能突破限制。

文件上传是这类木马最常见的入口。前端校验靠不住,后端必须白名单校验扩展名、MIME 类型,上传目录禁止执行权限。Nginx 里加一条 location ~* /uploads/.*\.php$ { deny all; },Apache 用 .htaccess 限制。再配合 open_basedir 限制脚本访问范围,就算木马进来了,能碰的东西也有限。

日志审计别忽略。Web 访问日志里出现大量 POST 请求,参数名可疑,响应体异常大,都值得查。用杀毒引擎扫 webshell 是常规操作,但别只依赖特征库——混淆过的木马经常能绕过。定期比对文件哈希,监控新增和修改的 PHP 文件,比事后扫描管用。

说句实在的,一句话木马能活到今天,不是因为技术多高明,是因为总有服务器配置不当、代码写得随意的场景。一个没过滤的 include,一个没限制的上传点,一个权限过大的数据库账户,都能让这行代码变成突破口。写代码的人多留个心眼,比装十个 WAF 都强。

分享到: