今天,我们这篇文章来讲文件上传/下载漏洞的原理以及危害,这篇文章从四个方面来讲,

1 文件上传漏洞产生的原因

2 文件上传合法性的检测方法

3文件上传漏洞20种绕过姿势

4 文件下载漏洞

文件上传漏洞介绍

​ 文件上传在我们的平时生活和工作中,是很常见的,比如,我们要上传个图像,上传个资料,上传一些其它文件和内容

​ 文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限,向服务器上上传可执行的动态脚本文件

控制不足或者处理缺陷这点跟我们的SQL注入和XSS没有区别,都是对一些上传和传递没有做一些严格检验

动态脚本文件就是,我们传递的时候,传递一个txt、jpg,是没有办法去执行,我们这些特殊命令的,那我们一定是要传一个像php文件,java文件、python文件,这样动态的一些脚本文件,能够让我们去执行一些,系统的命令

这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的

WEB漏洞里面,有很多的漏洞,像注入、XSS、CSRF,还有一些命令执行,在所有的漏洞当中,文件上传是最为直接和有效的,因为,我们所有的漏洞,像XSS,SQL注入,还有一些其它,所有的漏洞,它的其中某一个目的,就是能够获取我们服务器的一些权限,文件上传能够上传一个WEB的后门,也就是WEBshell,能够获取一个WEB权限,所以,说它是非常直接和有效的

“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果

严重的后果,上传木马、病毒这些严重的后果

WebShell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称之为一种网页后门

也就是我们的网页木马

攻击者在入侵了一个网站后,通常会将这些asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门,得到一个命令执行环境

命令执行环境,可以执行我们操作系统的命令

以达到控制网站服务器的目的(可以上传下载或者修改文件,操作数据库,执行任意命令等等,这些操纵的都可以实现)

所以WEBshell是我们文件上传的一个目的,通过文件上传来获得一个WEBshell,简单来讲,就是我们文件上传的第一个目的,我这边放了两种类型的WEBshell

上边这个叫一句话木马,一句话木马就是一句话的木马,它这里边是php的代码,

<?php

是php文件的一个开头,固定用法,后边

?>

结尾是php文件的结尾,固定用法@eval可以执行我们里边的参数,当作我们的php代码来执行,$_POST[margin]),这个是获取我们的POST参数,这样把代码保存成php文件,就是一句话木马,就是我们的WEBshell,这样就可以通过访问php文件,传参给margin参数,来执行我们的系统命令

这个也是WEBshell,只不过它是叫大马,一句话木马叫小马,小马就是比较小的马,大马是功能比较强的木马,所以木马是分大马和小马的,这是它的部分代码的截图

代码里面有一些密码验证,访问木马之前需要输密码,要不然,任何人都可以访问这个木马,那我们做的一些操作,就是给别人做了,因为别人也可以连接,也可以对这个服务器进行操作,它可以做一些身份验证,验证你的木马是否正确,可以下载文件,备份数据库,通过mysql下载文件,一些非常多的功能,接下来演示一下他的具体用法

我们输入密码连接木马

登录之后,我们会发现非常多的功能

第一个功能叫File Manager,File Manager能够展现它所有的目录,就是一个文件管理,它的权限,能够点Rename,重命名

能够列目录,能够copy、edit,Rename、down,都可以,上传,下载,修改

还可以查询文件

还有一个功能是mysql manager,能够连接数据库,我们连接一下当前数据库,我们不选,直接connect

connect选择一个数据库,比如,我们选择information_schema

它能够帮我们列出information_schema库里面,所有的信息,我们也可以在里面去执行很多的查询,select version(),query

它能够把我们把结果返回过来,也就是能够做一个数据库的管理功能

mysql_upload & download,将我们一些数据库的信息,下载下来

还有execute_command,就是我们输入命令,执行,whoami,

我们输入ipconfig,很多命令都可以执行,非常方便

php variable,还有php的一些运行的环境,php的版本

是不是允许,url open,是不是,enable_dl,一些配置环境的信息,都会被显示出来

post scan,做一个端口扫描,扫描,我们本地的端口,当然,扫一些其他服务器的端口,也可以,用来做内网渗透用的

我们扫本地,scan,

扫完之后,红色是close,绿色是open,open,就代表端口开放,3306是mysql,1433是sqlserver,帮助,我们去查看本地服务器以及服务器所在内网的一些其它服务器的端口开放情况

security information,能够看当前服务器的一些内容

像支持的数据库,当前系统的版本

还有当前的用户、IP,非常多的一些运行环境,能够看到

eval php code,这能够执行php的代码

这个就不演示了,这是我们大马的功能,大马的作用对于我们来说,是能够更好的去控制这台服务器,小马的作用在下一篇文章演示,它主要是一个php文件,传到服务器上之后,我们通过菜刀,对它进行一个连接就可以了

文件上传漏洞的原因

1、对于上传文件的后缀名(扩展名)没有做较为严格的限制

就是说,我们本来是要上传jpg、png,上传一些其他图片形式的头像的功能,但是你没有做一个严格校验,你传了个php上去,我们在返回图片路径的时候,把这个php路径返回了,导致,我们使用,我们的后门连接工具,连接上,我们就能够获取服务器权限

2、对于上传文件的MIMETYPE(content-type)(用于描述文件的类型的一种表述方法), 没有做检查

3、权限上没有对于上传的文件目录设置不可执行权限

任何文件它的权限都是读、写、执行,三个权限,如果,我们对上传的文件只有只读的权限,没有执行,那我们上传php也没法去执行,所以说,我们要把可执行的权限给禁掉,

4、web server对于上传文件或者指定目录的行为没有做限制

这个就是对上传文件的目录,它的一些包括权限,包括它后续的一些上传和下载、删除,对它的操作,没有做一些限制,它过于权限宽松了,没有遵守我们权限最小化的一个原则

所以说,这四个是我们文件上传漏洞产生的原因

在 WEB 中进行文件上传的原理是通过将表单设为 multipart/form-data,同时加入文件域,而后通过 HTTP 协议将文件内容发送到服务器,服务器端读取这个分段 (multipart) 的数据信息,并将其中的文件内容提取出来并保存的。

​ 通常,在进行文件保存的时候,服务器端会读取文件的原始文件名,并从这个原始文件名中得出文件的扩展名,比如原始文件名加一个时间戳,什么什么时间,而后随机为文件起一个文件名 ( 为了防止重复 ),并且加上原始文件的扩展名来保存到服务器上。

第一个content-type是要标记我们当前的HTTP请求,是一个form表单请求提交的一个内容,第二个content-type是表示,我们当前文件上传的类型,这里是image的类型,还有可能是jpeg、jpg、png不同文件的压缩包,不同文件上传的类型是不一样的,压缩包的时候,可能是.rar,文件的时候,可能是txt、html、xml,图片我们是image/jpeg、image/png这样的格式,通过content-type来表示上传文件的类型

上传漏洞的危害

1、上Web木马文件,控制Web服务器文件、远程命令执行等。

2、上传系统病毒、木马文件进行挖矿,然后形成一个僵尸网络。

挖矿,比如说现在的虚拟货币,挖矿软件,像我们控制服务器软件之后,我们把挖矿软件传上去,能帮我们日夜不停的挖矿

僵尸网络属于执行一些APT攻击、DDOS攻击,这些操作

3、上传系统溢出程序进行权限提升。

windows下面的exe文件,比如说,我们之前的永恒之蓝,这些文件

当我们获取WEBshell权限之后,这些权限应该是WEB服务,所运行的用户同级的权限,比方说,我们的Apach服务是在,Apach这个用户下面去运行的,那我们获取WEBshell之后,权限就是Apach用户运行的权限,所以说,我们要去上传一些溢出程序,来获取管理员的权限

4、修改Web页面实现钓鱼、挂马、暗链等操作。

当我们获取WEBshell之后,对后台这些文件,我们就已经有修改的权限了,当然,也不一定,比如说,后台有一些防护,权限控制的比较严格的话,比方说我们当前用户,没有办法去修改这个文件,或者是加一些网站文件防篡改的产品,我们都无法去修改WEB页面,如果说,能修改的话,我们去修改html页面,去给他加一些钓鱼的页面,加一些木马的代码,加一些暗链,比如说,赌博的,博彩的,这些色情的,这些都可以去操作

5、内网渗透。

比如说,当我们获取WEBshell之后,我们已经有内网一台服务器权限,我们通过这台服务器权限,做一个跳板,对内网所有的机器,做一个内部的渗透,其实内网渗透,要比外网渗透要稍微简单一些,我们对内网机器,做一个加固扫描,弱口令扫描,我们对域控做一个渗透,做一些内网渗透的事情

6、在权限得到提升的情况下,想做什么就做什么。

比如说,当我们得到管理员权限之后,我们基本上就是为所欲为,相当于这台机子就是我们的,除了,我们摸不到这台物理设备之外,服务器上,所有的事情都能干,这就是上传漏洞的一个危害,它是最直接,危害最大的一个漏洞

文件上传合法性检测方法

1、前端Js验证。

当我们在上传的时候,用js来验证后缀类型,可以就通过,不可以就提示你,文件的后缀名是不合法的

2、MIME类型验证

content-type的校验,我们在代码里面写到,如果是jpeg、png、gif,我们就上传,如果不行,直接返回

3、黑名单/白名单

现在黑名单用的比较少,主要用的是白名单,黑名单容易绕过,比如一些后缀名,限制不能够上传php,有些人就上传php5,后缀名是.php5、.php4,或者.phtml,很多这种方式进行绕过,比方说,上面这个截图里面是Appconfig的配置文件,AddType application/x-httpd-php .php .phtml,这个地方就是说,能够允许,一些当作php来运行的文件后缀类型,比方说,我们加了这个.phtml,代码里面没有限制这个类型,那这个时候,它传上去之后,就能够执行这个phtml,能够把它当作php的文件来执行

4、检查文件内容(在php里面用getimagesize() 函数用于获取图像信息、检验关键字)

用getimagesize() 函数用于获取图像信息,看看是不是一个正常的图像

检验关键字,看我们image文件里面,有没有一些php代码的关键字,如果有的话,你这个image文件,肯定不正常,正常的图片文件里面,怎么可能会有php代码呢

5、禁止本地文件包含漏洞

这个是联合使用的一个漏洞,比方说,你文件上传image,image里面包含了php代码,它没法执行,因为它是个image后缀,那我们用一个文件包含的话,那么包含这个image文件,包含进来的话,image文件里面的代码就可以被成功执行,这就是文件包含的一个特性,这个我们要禁止

6、使用安全的Web 服务(apache、nginx(/test.png/xxx.php)、IIS解析漏洞(1.php;jpg))

比方说,我们的代码是一点漏洞,都没有了,但是apache、nginx、IIS,它本身就有一些漏洞,apache解析漏洞、nginx解析漏洞,IIS解析漏洞

比方说,apache会传一个a.什么什么文件,它的文件校验,是从最后一个后缀名开始,a.php.aaa,aaa在apache里面,是不识别的,我们往前推一个,推一个是.php,可以识别,把它当成一个php文件来解析

nginx比方说,传一个文件,访问路径是/test.png/xxx.php,这个时候,也会把它当成一个php文件来解析

IIS比方说,文件名是1.php;jpg,那么这个时候,就会把它当成一个php文件,来解析,或者说这个地方,我们1.exe;jpg,它会把它解析成exe的文件,所以说,保证,我们的代码,没有问题,不够的,我们要使用一些更加安全的WEB服务,保证我们WEB服务没有漏洞,安全是个整体,只保证某个点的漏洞,是不能够保证我们的安全的,所以说,要全面的去考虑我们的安全问题

文件上传漏洞20种绕过方法

1、前端Js绕过

js前台验证绕过

2、MIME类型绕过

3、后缀名大小写绕过/后缀名php4、php5绕过

4、00截断

5、覆盖.htaccess这个文件

6、Windows文件流特性绕过

7、双写文件名绕过

8、条件竞争

这里,我列举了8个,这8个是比较常见的8个,剩下的会在实验里面,给大家一一讲解20个绕过的方法,及对应的后台代码的一些产生的原理,我们一起读一读代码,它的一些常见漏洞代码,长什么样,做一个简单的代码审计

文件下载漏洞概念

1、一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞

比如说,你本来是要查看一些doc、txt,ppt的一些内容,但是,它能够绕过我们这个路径,查看一些比较敏感的文件,比方说,linux的password文件

2、下载服务器任意文件,如脚本代码、服务及系统配置文件等,可用得到的代码进一步代码审计,得到更多可利用漏洞

这个能够下载,你网站的整个源代码,把你的码,下下来之后,能够分析,你的代码这些漏洞,因为分析代码需要做一个代码审计,它是一个白盒测试,白盒测试实际上比黑盒测试的效率或准确率更高一些

文件下载和上传漏洞,同属于文件操作类型的漏洞

通过文件下载漏洞读取服务端文件的方法

我们举一个DVWA的例子

Ø 查找漏洞点:

http://www.margin.com/dvwa/vulnerabilities/fi/?page=file3.php

这个地方是读取file3的内容

Ø 把文件更改为要查看的文件

http://www.margin.com/dvwa/vulnerabilities/fi/?page=/etc/passwd

那我们把路径改一改,改成/etc/passwd这个文件,能够读取,我们password的文件

Ø 返回:

我们通过截图,能够看到正常去读取,这就是我们任意文件下载漏洞的演示

如何查找任意文件下载漏洞

Ø 查找传入文件名的参数:

​ Ø 导入文件等参数,要是直接输入文件名,就有可能有注入点

就是说,你这个文件名可控,这个文件名是用户能够指定的,这个时候,我们就能够输入特定的字符,加一些路径,能够绕过这些文件读取的限制

Ø 注意如下几个参数名:

​ Ø RealPath,FilePath,filepath,Path,path,inputFile,url,urls,Lang,dis,data,readfifile,filep

​ Ø src,menu,META-INF,WEB-INF

这些特殊的参数名,能够帮我们快速找到文件读取和文件操作函数的位置

Ø 代码中如何查找漏洞:

​ Ø PHP为例,有如下等代码,就有可能存在任意文件下载漏洞

​ Ø readfile

​ Ø fopen

​ Ø file_get_contents

因为这三个函数是文件操纵功能,readfile、fopen读取文件,file_get_contents,读取文件里面的一些内容,当这三个函数出现的时候,有可能出现,任意文件读取或下载的漏洞

Windows敏感文件路径

​ Ø Windows:

​ Ø C:\boot.ini //查看系统版本

​ Ø C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件

​ Ø C:\Windows\repair\sam //存储系统初次安装的一些密码

​ Ø C:\Program Files\mysql\my.ini //Mysql配置文件

​ Ø C:\Program Files\mysql\data\mysql\user.MYD //Mysql的一些user配置文件

​ Ø rootC:\Windows\php.ini //php配置信息

​ Ø C:\Windows\my.ini //Mysql配置信息

我们要知道,那些文件对我们是有用的,我们在读的时候,可以尝试读这些路径,但是我们需要注意的是,这些路径,有可能发生变化,比方说,它会随着管理员安装的路径不同,而发生变化,这些路径,只是默认的路径,如果找不到,也没有关系,因为路径变了,我们可能也,非常难猜

Linux敏感文件路径

Ø Linux:

​ Ø /root/.ssh/authorized_keys

authorized_keys的配置文件或一些内容

​ Ø /root/.ssh/id_rsa

​ Ø /root/.ssh/id_ras.keystore

也是我们一些authorized_keys的配置文件

​ Ø /root/.ssh/known_hosts

是我们在远程连接的时候,当我们要yes或no的时候,说明,我们的主机不在known_hosts的里面

​ Ø /etc/passwd

​ Ø /etc/shadow

这个是用户名和密码相关的一些配置文件

​ Ø /etc/my.cnf

数据库的配置文件

​ Ø /etc/httpd/conf/httpd.conf

apache的配置文件

​ Ø /root/.bash_history

​ Ø /root/.mysql_history

是关于命令执行的历史记录

​ Ø /proc/self/fd/fd[0-9]*(文件标识符)

​ Ø /proc/mounts /porc/config.gz

当我们在渗透测试的时候,一定要注意把这些配置文件,都去弄一下,看一下敏感信息,看不到,也没关系,它改路径,也没办法

修复文件下载漏洞

Ø PHP为例:

​ Ø 过滤.(点),使用户在url中不能回溯上级目录

因为读取文件的时候,很有可能过滤斜杆,我们过滤的斜杆,要用…/去绕过,去读取上一级目录,和上上级目录的文件,因为,我们读取的时候,只读取当前文件内容,肯定是读取不到一些敏感信息的,将我们刚刚学的/etc/password,它是在根目录下面,那我们可以指定/etc/password路径,如果不行的话,我们可以用…/…/的方式,去看我们上一级的目录,一直到根目录下面的,某一些文件,去读取

​ Ø 正则严格判断用户输入参数的格式

读取文件名的时候,尽量不要让用户控制你文件的名称,因为一旦控制文件名称之后,是比较有风险的,所以,我们要严格的校验用户,输入文件名的格式

​ Ø php.ini配置open_basedir限定文件访问范围

你在通过代码,访问文件的时候,我们可以通过open_basedir限制,你能够访问的目录,这样一些,敏感的目录,你就访问不了了

我们通过这三种方式来修复,文件下载漏洞

1-1 【理论】01-文件上传/下载漏洞的业务场相关推荐

  1. SRC挖洞之文件上传/下载漏洞的实战案例

    文章目录 前言 任意文件下载 案例1 某OA系统任意文件下载 案例2 某登录页面任意文件下载 案例3 某金融网站任意文件下载 案例4 服务端过滤 ../ 绕过下载 案例5 %00截断后下载任意文件 文 ...

  2. ASP.NET中常用的文件上传下载方法

    ASP.NET中常用的文件上传下载方法 文件的上传下载是我们在实际项目开发过程中经常需要用到的技术,这里给出几种常见的方法,本文主要内容包括: 1.如何解决文件上传大小的限制 2.以文件形式保存到服务 ...

  3. struts2教程--实现文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  4. struts2教程(8)--文件上传下载

    Struts2文件上传下载 一.Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截 ...

  5. spring boot基础教程之文件上传下载

    一文件上传 文件上传主要分以下几个步骤: (1)新建maven java project: (2)在pom.xml加入相应依赖: (3)新建一个文件上传表单页面; (4)编写controller; ( ...

  6. java上传文件到ftp_java实现文件上传下载至ftp服务器

    以前做的一个项目,用到了文件上传下载至ftp服务器,现在对其进行一下复习,比较简单,一下就能看明白. 环境:首先,先安装ftp服务器,我是在win8本地用IIS配置的, 百度一下就可以找到安装文档. ...

  7. 文件上传下载—servlet API实现

    servlet API实现文件上传下载需要的jar包: UploadServlet.java package com.ymw.web.servlet;import java.io.File; impo ...

  8. httpclient base64 文件上传_文件上传下载

    说道文件上传下载,这个业务需求并不是很复杂思想如下 1.将文件上传到 某台服务器上的指定的路径下也可以这样理解 文件上传就是将本地图片发送到别的地方,下载就是将别的地方的图片放在本地 2.将路径同文件 ...

  9. maven 文件上传下载_使用Maven将文件上传和下载到S3

    maven 文件上传下载 多年来,我已经看到许多团队以许多不同的方式使用Maven. Maven可用于许多ci / cd任务,而无需使用额外的管道代码,或者可用于在运行某些测试之前准备开发环境. 通常 ...

  10. 文件上传表单 上传文件的细节 文件上传下载和数据库结合

    1 文件上传表单    1)上传文件的本质是文本复制的过程    2)技术层面,在Java中一定会用到IO操作,主要以二进制方式读写    3)传统方式下,对于上传文件字段不同的浏览器有着不同的解析方 ...

最新文章

  1. centos7 升级openssh7.4之后 报错
  2. C++知识点46——类继承中的类型转换与访问权限控制(中)
  3. OI常用的常数优化小技巧
  4. sql like 多个值_用于数据分析的8个SQL技术
  5. Spark DataFrame 添加自增id
  6. 经验 | 没有导师的指导,研究生如何阅读文献、提出创见、写论文?
  7. QA:阿里云K8s启动容器后无法访问网络
  8. 人人开源(快速搭建项目)
  9. 去除WINRAR的广告
  10. HTML单选框-多选框-按钮
  11. fstab文件详解,mount挂载参数
  12. cdr添加节点快捷键_【CDR干货】常用cdr快捷键命令汇总,快来收藏!
  13. mysql先进后出_栈、队列中“先进先出”,“后进先出”的含义
  14. 支付宝相关服务申请入口
  15. 【连载】draft伦理
  16. MuJoCo及mujoco_py安装(以及troubleshooting)
  17. ADS(Authenticated data structure)
  18. vs如何设置在Release下进行调试
  19. ResNet深度残差网络
  20. 使用FMDB进行数据库操作

热门文章

  1. 51单片机篮球记分牌设计
  2. 基于TI AM335x创龙开发板U-Boot编译
  3. 【UV打印机】RYPC打印软件教程(四)-任务选择
  4. python获取本月天数_如何获得本月的所有天数?
  5. 马哥python培训靠谱吗马哥教育python课程再次革命性升级
  6. 【python爬虫错误】Max retries exceeded with url
  7. mac拓展显示屏睡眠或锁屏后启动黑屏,mac typeC不支持4K 60HZ
  8. 漫画:互联网人的十二时辰
  9. 第37期Datawhale组队学习——数据可视化(Matplotlib)
  10. Wrt 网络共享U盘,Daphile链接NAS