首先我们来分析一下代码:

  1. 定义了两个字符串变量 $a 和 $b;
  2. 通过 for 循环对 $a 进行异或运算;
  3. 通过 ${$a['a']} 获取变量名称;
  4. 通过 eval 执行 base64 解码后的字符串。

我们可以看到,这里的关键点在于获取变量名称,而变量名称是通过 ${$a['a']} 获取的。那么我们需要找到 $a['a'] 的值,以及 ${$a['a']} 对应的变量。

我们可以先输出 $a 和 $b 的值,发现 $a 的值是 '~+d()', $b 的值是 '!{+{}', 两个字符串的长度是相同的(6)。然后通过 for 循环对 $a 进行异或运算,得到的结果是:

$ a[0] = chr(ord('~') ^ ord('!')) = '\x1d' $ a[1] = chr(ord('+') ^ ord('{')) = '\x1d' $ a[2] = chr(ord('d') ^ ord('+')) = '\x1f' $ a[3] = chr(ord('(') ^ ord('{')) = '\x1f' $ a[4] = chr(ord(')') ^ ord('+')) = '\x1d' $ a[5] = chr(ord('') ^ ord('{')) = '\x1c'

所以,$a['a'] 的值就是 '\x1d\x1d\x1f\x1f\x1d\x1c',我们可以通过 ${$a['a']} 获取对应的变量。根据 PHP 的变量命名规则,变量名称只能包含字母、数字和下划线,所以 '\x1d\x1d\x1f\x1f\x1d\x1c' 不是一个合法的变量名。但是,我们可以将其解码成 base64 编码后的字符串,然后将第一个字符替换成 'n',再通过 eval 执行,就可以绕过 WAF 了。

综上,完整的代码如下:

PHP WAF绕过技巧:Eval 后门代码分析及实现

原文地址: https://www.cveoy.top/t/topic/lPrC 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录