您的当前位置:首页 > 娱乐 > webshell使用的函数 正文

webshell使用的函数

时间:2026-10-17 04:35:53 来源:网络整理 编辑:娱乐

核心提示

PHP 里能执行系统命令的函数多到数不清,但攻击者最爱的就那么几个。拿 `system()` 来说,它直接调用操作系统的 shell,把命令输出打到页面上。你写个 `system('whoami')`

PHP 里能执行系统命令的使用数函数多到数不清,但攻击者最爱的使用数就那么几个。拿 `system()` 来说,使用数它直接调用操作系统的使用数 shell,把命令输出打到页面上。使用数你写个 `system('whoami')`,使用数服务器当前用户是使用数谁立刻显示出来。这种直白程度,使用数几乎等于把 shell 递到对方手里。使用数

但 `system()` 有个麻烦——它会自动刷新输出缓冲。使用数有些场景下攻击者不想让输出立刻出现,使用数于是使用数 `exec()` 更受青睐。`exec()` 只返回命令的使用数最后一行,其余输出得靠第二个参数数组接住。使用数写 webshell 的使用数人常这么干:exec($_POST['cmd'], $output); print_r($output);。简单,安静,够用。

反引号运算符 ` 是另一个隐蔽选择。它等价于 shell_exec(),但长得像普通字符串,混在代码里不容易被静态扫描发现。$result = `ls -la`; 这行代码在语法高亮不敏感的环境里,跟赋值字符串几乎没区别。我见过一个被入侵的 WordPress 插件,里面就藏着反引号调用,安全插件扫了三遍才揪出来。

passthru() 用于直接输出二进制数据,比如让服务器传回一张图片或一个压缩包。攻击者拿它当文件下载器用,比读文件再 echo 更省事。popen() 则返回文件指针,配合 fread() 可以逐块读取命令输出,适合大结果集。这些函数各有脾气,选哪个取决于攻击者想干什么——是快速侦察,还是慢速搬运数据。

PHP 之外,ASP 的 WScript.Shell 对象、JSP 的 Runtime.getRuntime().exec() 也是老面孔。但真正让 webshell 防不胜防的,是那些看起来人畜无害的函数被组合起来用。比如 file_put_contents() 写个新文件,再用 include() 加载它,整个过程中没有出现任何“命令执行”关键词。日志里只看到文件写入,看不到 system 调用。

还有一种情况:assert() 在旧版 PHP 里可以执行字符串参数。攻击者把一句话木马写成 assert($_POST['x']),流量里全是 POST 数据,URL 干干净净。后来 PHP 7 把 assert() 改成语言结构,这条路才窄了。但 preg_replace() 的 /e 修饰符曾经更夸张——正则替换直接当代码跑。一个正则表达式就能变成后门,谁能想到?

说个具体案例。某次应急响应,我在一台服务器上发现 array_map('assert', $_GET)。没有 eval,没有 system,连 assert 都是字符串形式。安全设备没告警,因为流量里只有普通 GET 参数。但 array_map 把每个参数值传给了 assert,等于批量执行。这种写法绕过了大部分基于关键词的检测规则。

防御方看这些函数,就像看一把把没开刃的刀——单独放着没事,组合起来就能杀人。禁用函数列表能挡掉一部分,但攻击者总能找到漏网的。真正有效的还是权限控制:Web 进程不该有 shell,不该能写文件到可执行目录,不该能连外网。把这几条卡死,webshell 就算传上来了,也只是一段跑不动的死代码。

我个人的判断是:别指望靠过滤函数名解决问题。PHP 有超过 100 个能间接执行代码的函数,你列不完。不如换个思路——监控异常文件写入、限制进程创建、审计出站连接。这些行为层面的约束,比黑名单靠谱得多。