文件上传漏洞简述

文件上传漏洞是常见的几大漏洞之一,也是非常重要的一种。下面对文件上传漏洞的概念、框架以及应用危害等进行简述,在学习一种漏洞之前要先深入理解它。

  • 首先,什么是文件上传漏洞,顾名思义,这个漏洞的产生是发生在文件上传的过程当中的,其实本质上它有些类似于存储型XSS漏洞,从结果上看都是通过漏洞向服务器数据库存储了一段恶意代码,而不同的是文件上传漏洞的利用是以“文件”为载体的。文件我们都知道有很多种类型,如:图片(.jpg,.png,.gif),文本(.txt),网页(.html)等,而文件有两个非常重要的属性:一是文件类型,二是文件名及后缀。文件上传漏洞就是在一些允许进行文件上传的网页(如百度网盘,更换用户头像,向学校的教务网提交自己的论文等)上传文件时,传入恶意代码文件,如果这些文件是可执行的脚本(如php)那么服务器就会执行它。

    文件上传漏洞简述_第1张图片

  • 那么文件上传漏洞是如何被利用的?简要的流程如下:
    1.编写恶意代码
    在这里插入图片描述
    2.对恶意代码文件进行伪装(例如用记事本写的代码,将其后缀改成.jpg),这里的伪装主要是通过文件后缀进行的,因为很多时候网页会限制文件类型,所以我们要通过修改后缀伪装成允许的类型。
    文件上传漏洞简述_第2张图片
    3.文件上传。这是最重要的一步,所有的准备工作都是为了我的恶意文件可以成功上传,在这一步中文件要经过重重防护的校验,如果对这些防御都能够通过,那么文件就可以被成功上传到服务器端了。这里有一个问题,上传的文件是jpg格式的,服务器并无法将其当做脚本来执行,因此我们还要想办法对其后缀做手脚,保证最后上传的文件为可执行脚本文件(如.php),如何做手脚呢?在下文再进行阐述。
    文件上传漏洞简述_第3张图片
    4.利用恶意文件。上传了恶意文件后,如果什么都不做,恶意文件没有被执行,那攻击动作就永远不会开始,因此攻击者会利用这些文件来达到一些恶意目的。其中最直接和富有效率的手段就是利用注明的“中国菜刀”软件,在第三步中上传“一句话木马”,也就是一句菜刀软件能够识别的简短代码,就可以获得管理员权限,在菜刀软件虚拟终端进行各种管理员操作,服务器的目录、框架、内容将变得完全透明,攻击者可以为所欲为。
    文件上传漏洞简述_第4张图片
    上传一句话木马脚本成功后,我们在中国菜刀软件中输入所上传文件的地址后,就可以通过上传的木马脚本来获取webshell(网站后门。相当于管理员远程操作)
    文件上传漏洞简述_第5张图片
    连接成功后,获取了webshell,利用菜刀软件的虚拟界面可以对被攻击的服务器做各种操作,这时候攻击者就相当于服务器的管理员了,webshell就成了管理终端。

  • 上面简述了利用文件上传漏洞的简要流程,那么这个漏洞为什么会产生?要回到第三步,文件上传,我们都知道如果不对文件进行重重把关和审核的话,什么内容和格式的文件都允许上传,服务器将变得无比脆弱,攻击者可以肆意上传各种恶意代码、脚本、垃圾内容等对服务器进行各种攻击,所以服务器会对上传来的文件进行各种扫描检查,就像我们坐火车和飞机的时候要过X光安检,不允许携带危险物品乘车,文件上传也是如此,服务器要尽可能保证我们上传的文件是安全和无害的。但验证毕竟不可能面面俱到,网站的所有者对验证的重视程度和验证级别的设置也不同,所以就有可能留下文件上传漏洞,也就是说利用验证手段的某种缺陷,对验证机制进行绕过,上传我的恶意文件。

  • 理解了文件上传漏洞的机制,我们就要回到核心点上来,如何对文件进行验证以及如何绕过这些验证,下面我们说一说常用的验证机制以及绕过手段。
    从大的层面来说,可以分为前端验证和后端验证。

  • 前端验证发生在浏览器端,一般是通过HTML文件中的脚本对上传的文件进行一个验证,例如通过一些表单验证,写一个前端JavaScript验证脚本,例如写一段JavaScript代码对文件的后缀进行验证,不允许上传常见的.php、.asp脚本文件,或者只允许上传.jpg后缀的文件等。前端验证有一个特点就是验证的机制和代码是在前端的,也就是说它对用户端完全透明,用户可以通过查看网页源代码就能够知道验证机制是什么。那么绕过相对来说就可以很有针对性。常见的绕过方法有两种,一种是对前端代码进行修改,直接删除、修改验证脚本使其失效。
    文件上传漏洞简述_第6张图片
    网页源代码中的js验证,可以清晰的看到前端验证只允许放行这3种图片格式的文件。

另一种是通过抓包绕过,这种绕过方法实际上并没有“绕过”前端验证,它是指通过前端验证,例如只允许上传.jpg文件,那么不管我想执行什么脚本,都把这个文件后缀改成.jpg,来通过前端验证,这样就会有一个问题,文件是可以上传成功,但是它是一个图片文件,服务器无法把它当成脚本来执行。而抓包实际上是在已经通过前端验证并放行的情况下,在前端与后端之间加的一个“哨卡”,通过修改包的信息,例如对已放行的jpg文件在request包中将文件名的后缀改成.php
文件上传漏洞简述_第7张图片
修改后点击Forward放行请求包,在后端没有验证的情况下,脚本文件就可以顺利上传到服务器端了。这样一来,就可以达到我们的目的,先将文件后缀改成允许的类型(但无法执行),再通过抓包将文件后缀改回脚本类型(可执行)。两种方法都可以进行前端绕过,只不过两种绕过方法不同,一种是直接针对验证机制的修改,另一种是先修改文件参数(如后缀)绕过前端验证后再通过抓包“打劫”将文件类型改回可执行脚本。

  • 后端验证发生在服务器端,也就是说验证的机制我们无法知晓(因为无法查看后端的验证代码),这样一来绕过后端的验证就比前端要难的多,因为验证发生在服务器终端,我们既无法对验证代码做手脚,也无法在文件传输的路上的对文件的参数做手脚。这样我们只能对常见的后端验证机制有比较全面的了解,并对每种验证进行相对应的绕过测试。常见的后端验证也可以分为几类:

    1.文件后缀检查,这种验证是最常见的,也是类型最多的,服务器端对文件的后缀验证又可以分为黑名单验证、白名单验证。
    黑名单验证是指黑名单中的后缀名不允许上传,绕过这种验证的方法是通过黑名单验证的疏漏进行(因为黑名单验证往往不会非常全面),那么就需要对黑名单验证的常见手段有所了解,常见的验证手段此处不再赘述,另开一贴进行详细阐述。
    文件上传漏洞简述_第8张图片
    黑名单验证的后端代码,可以看到验证的机制是不允许上传图示的几种后缀的脚本文件。那么如果通过抓包修改文件后缀,让其既为可执行的脚本文件又不在黑名单中,就可以绕过验证顺利上传了。
    2.文件内容验证,主要有文件头检查、突破getimagesize()、二次渲染等。
    3.条件竞争
    以上就是后端验证的常见手段,此处仅对整体思路和框架进行阐述,旨在对文件上传漏洞的机制有一个提纲挈领的了解,具体细分的验证手段此处不做赘述,对每种验证机制和各种绕过姿势有深入研究后,就可以较为全面的掌握基本的绕过方法了~
    前端验证较为简单,后端验证的类型就丰富很多了,后面再对两种验证机制和绕过方式进行详细举例和总结。

你可能感兴趣的:(文件上传漏洞,文件上传漏洞,脚本,前端验证,后端验证,漏洞原理)