1、什么是文件上传漏洞

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。即便很容易被攻击者利用漏洞,但是在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率。企业支持门户,给用户各企业员工有效地共享文件。允许用户上传图片,视频,头像和许多其他类型的文件。向用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的。

2、文件上传检测流程

一般情况下,一个文件以HTTP协议进行上传时,通常都是以POST请求发送至Web服务器的。Web服务器在接收到请求后,用户与Web服务器建立连接,并传输数据。Web服务器在接收文件上传时,一般会有如下检测流程:

①客户端javascript校验(一般只校验文件的扩展名)。 ②服务端文件头content-type字段校验。 ③服务端文件内容校验。 ④服务端目录路径检测。 ⑤服务端文件扩展名检测。 ⑥服务端后缀名黑白名单校验。 ⑦服务端自定义正则校验。

3、文件上传漏洞产生的原因和危害

由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。打个比方来说,如果你使用 windows 服务器并且以 asp 作为服务器端的动态网站环境,那么在你的网站的上传功能处,就一定不能让用户上传 asp 类型的文件,否则他上传一个 webshell,你服务器上的文件就可以被他任意更改了。因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

对于初学者而言,找漏洞最好是基于白盒审计进行,所谓白盒审计可以简单地理解为就是看着代码找漏洞,那么在正式挖洞前,我们先看看开源的DVWA给出的四种级别的文件上传的源代码。

4、DVWA—文件上传(low)

查看源码文件

basename(path,suffix) : 函数返回路径中的文件名部分,如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名。

可以看到,服务器对上传文件的类型、内容没有做任何的检查、过滤,存在明显的文件上传漏洞,生成上传路径后,服务器会检查是否上传成功并返回相应提示信息

漏洞利用: 文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。不幸的是,这里三个条件全都满足。

我们先上传一个一句话木马:

可以看到上传成功并且返回了路径 再用蚁剑工具进行连接,得到服务器控制权

5、DVWA—文件上传(Medium)

先看下代码和low级的有什么区别

增加了对上传文件大小和类型的限制。文件大小限制问题不大,但是类型现在只允许上传jpeg和png的图片了。同样继续找办法绕过去。

方法一

因为只允许上传jpeg和png文件所以php文件类型一定被过滤了,通过burp抓包分析,在客户端上传页面这一侧,没有做限制,限制主要是服务器这边做的。而且服务器限制类型也不是通过后缀名,只是通过" Content-Type"这个属性来判断。

因此我们用burp将截取的报文修改一下

将Content-Type: application/octet-stream改为Content-Type:image/jpeg

执行

上传成功并且返回了文件路径 然后使用蚁剑工具尝试连接

连接成功,在蚁剑工具里可以任意上传下载甚至删除

方法二

上传文件名是"123.jpeg"的文件,随后在burp里面修改文件名,而不用修改" Content-Type "的内容,也可以实现文件上传。 成功!

方法三

%00截断

在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断。

可选方法举例如下:

更改文件后缀为123.php.jpg,设置代理并上传。抓包并将php.jpg中的字符“.”(十六进制0x2e)更改为00。 更改文件后缀为123.php.jpg,设置代理并上传。抓包并在php.jpg中的字符“.”(十六进制0x2e)前右键选择insert byte,增加一个0x00字节。 更改文件后缀为123.php%00.jpg,设置代理并上传。抓包并选中%00,右键url-decode。

先删掉low级别上传的木马以免影响操作结果

文件改名并写入一句话木马

上传文件burp抓包

执行

上传成功

连接成功

6、DVWA—文件上传(High)

方法一

初学者先看代码

重点看下红色框部分,改进了两个很重要的地方: ①提取了后缀名进行判断,这样就不大好改名了。

②"getimagesize"虽然是用来获取图片文件大小的函数,但如果上传文件的文件头不是图像类型的话,会返回false。

第二条其实有办法绕过,我们可以在文件头部加上了jpg格式的GIF89

然后将文件名后缀改为.jpg

文件可以上传成功,但是改名就比较麻烦了,无法在上传文件这个漏洞搞定,只能借助其他漏洞。 利用DVWA中的Command Injection(命令注入),将123.jpg改名成123.php 在这里我犯了个低级错误Windows下的文件改名用的是move,Linux才是mv,感谢大佬涛

|move ../../hackable/uploads/123.jpg../../hackable/uploads/123.php

改名成功! 接下来蚁剑获取webshll

方法二

创建一个图片马,直接上传,一句话木马藏在图片末尾 虽然我们的一句话木马上传成功了,但是他是以jpg为后缀的,蚁剑不能直接连接,必须让他作为php解析。

蚁剑的原理是向上传文件发送包含参数的post请求,通过控制参数来执行不同的命令,而这里服务器将木马文件解析成了图片文件,因此向其发送post请求时,服务器只会返回这个“图片”文件,并不会执行相应命令。

那么,怎么才能让我们的图片以 php 格式运行呢? 文件包含!我们可以利用DVWA的文件包含漏洞,让我们的图片格式的一句话木马以php格式运行。 我们访问该URL:

http://127.0.0.1/vulnerabilities/fi/?page=file:///D:/phpstudy_pro/WWW/DVWA-master/hackable/uploads/666.jpg

把该图片当成php文件执行 然后我们就可以用中国菜刀进行连接了 因为这个网站是要登录的,所以我们在蚁剑中右键,然后浏览网站,然后登录就可以在蚁剑中保持我们的session。然后就可以获取Webshell了。

不知道什末原因我的浏览器一直显示解析错误,我尝试解析.txt/.php文件都可以成功解析, 问题应该出在了file协议上查一下file协议也没搞懂

浏览器通过file://访问文件和http://访问文件的区别:

file协议用于访问本地计算机中的文件,好比通过资源管理器中打开文件一样,需要主要的是它是针对本地的,即file协议是访问你本机的文件资源。

http访问本地的html文件,相当于将本机作为了一台http服务器,然后通过localhost访问的是你自己电脑上的本地服务器,再通过http服务器去访问你本机的文件资源。

再简单点就是file只是简单请求了本地文件,将其作为一个服务器未解析的静态文件打开。而http是在本地搭建了一个服务器再通过服务器去动态解析拿到文件。

其他区别:

file协议只能在本地访问 本地搭建http服务器开放端口后他人也可以通过http访问到你电脑中的文件,但是file协议做不到 file协议对应有一个类似http的远程访问,就是ftp协议,即文件传输协议。 file协议无法实现跨域

http://127.0.0.1/hackable/uploads/666.jpg

7、DVWA—文件上传(Impossible)

先看下代码的主要部分

①使用了"imagecreatefromjpeg"和"imagecreatefrompng"对上传的文件重新生成为图片,去掉了不属于图片的部分。

②给文件重命名成随机字符串,可以去掉一些asp或者php等脚本属性,就是完全无法执行了。 基本上上面这两点限制做完,只能上传图片了。

精彩链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: