文件上传一些理解

文件上传漏洞

·一、文件上传漏洞

·1.文件上传漏洞

@概述:

    Web应用程序没有对用户上传的文件进行安全判断或者判断条件不够严谨,导致攻击者将恶意代码文件植入到服务器中从而去执行解析恶意代码。

    然而向用户提供的功能越多,Web应用收到攻击的风险越大,如果Web应用存在文件上传漏洞,那么恶意用户就可以利用文件上传漏洞将可执行脚本程序上传到服务器中,从而获取网站的权限,或者进一步危害服务器。

 

@风险点:

     1注册处(上传头像)

     2个人信息处(上传附件)

     3身份认证处(身份证照片)

     4商品评价处(上传商品)

     ......

 

@文件上传漏洞危害:

    非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器,这个恶意的脚本文件,又被称为WebShell,也可以将WebShell脚本称为一种网页后门,WebShell脚本具有非常强大的功能,比如查看服务器目录,服务器中的文件,执行系统命令等。

 

@文件上传修复建议:

  1通过白名单的方式判断文件后缀是否合

  2对上传后的文件进行重命名,例如rand(10,99).date(“YmdHis”).”.jpg”

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

·2.绕过攻击检测

·2.1 JS检测绕过攻击

    JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹框告知,此时上传文件的数据包并没有发送到服务器,只是在客户端浏览器使用JavaScript对数据包进行检测。

 

@有两种办法可以绕过客户端JavaScript的检测:

  >使用浏览器的插件,删除检测文件后缀的JS代码,然后上传文件就可以绕过。

  >首先把需要上传文件的后缀改成允许上传的,比如jpg、png等,绕过JS的检测,再进行抓包,将后缀名改为可执行文件的后缀即可上传成功。

 

>>JavaScript检测绕过攻击分析:

1客户端上传文件的HTML代码如下:

>>分析:

    在选择文件时,会调用JavaScript的selectFile函数,该函数的作用是先将文件名转换为小写,然后通过substr获取文件名最后一个点号后面的后缀(包括点号),如果后缀不是“.jpg”,则会弹框提示“请选择jpg格式的照片上传”。

toLowerCase():用于把字符串转换为小写

语法:stringObject.toLowerCase()

返回值:一个新的字符串,在其中stringObject的所有大写字符串全部被转换为小写字符。

    lastIndexOf:可以返回一个指定的字符串最后出现的位置,在一个字符串种的指定位置从后向前搜索。

语法::stringObject.lastIndexOf(searchvalue,fromindex)

其中searchvale:必须的,规定需要检索的字符串值

    fromindex:可选的整数参数。规定在字符串中开始检索的位置。

 

@通过以上的前端HTML代码中可知:

客户端上传文件的HTML中的JavaScript代码模块,具有检测文件格式的代码判断,if(mime! = “.jpg”),如果文件后缀不是jpg格式,则会弹框告知。所以可知在前端代码中是做了文件后缀检测的功能,所以需要使用绕过的方式。

 

2服务器处理上传文件的代码如下所示:

>>分析:

$_FILES专门用来存储用户上传的文件,判断文件的error是否大于(error属于$_FILES中的元素,如果等于0则代表文件上传成功没有出错,如果不等于0则代表文件上传是失败的代号)如果上传文件没有出错,再通过fiLe_exists判断在upload目录下文件是否存在,不存在的话就通过move_uploaded_file将文件保存到upload目录。

file_exists():检查文件或者目录是否存在,如果指定的文件或者目录存在则会返回true,否则返回false

语法:file_exists(path)

path:必需,规定要检查的路径

 

@在服务器端的PHP代码中没有像前端HTML代码一样对文件后缀名进行判断,所以只需要绕过前端JavaScript的校验就可以上传WebShell

 

·2.2 文件后缀绕过攻击

文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些Apache是允许解析其他文件后缀的,例如在httpd.conf中,如果配置了能够解析php和phtml文件的代码,例如:AddType  application/x-httpd-php  .php  .phtml

在Apache的解析顺序中,是从右到左开始解析文件后缀的,如果最右侧的扩展名不可识别,就继续往左判断,直到遇到可以解析的文件后缀为止,所以如果上传的文件名类似1.php.xxxx,因为后缀xxxx不可以被解析,所以继续向左解析后缀php。

(httpd.conf是Apache网络服务器软件中重要的一个配置文件,它存储着Apache中许多必不可少的配置信息,最常用的就是向里面添加建站网站信息)

 

@绕过服务端的检测:

   >上传一个后缀为phtml的WebShell

 

>>服务器处理上传文件的代码如下所示:

>>分析:

    通过函数pathinfo()获取文件后缀,将后缀转换为小写,判断是否为“php”格式的文件,如果上传文件的后缀是php格式,则不允许上传。

    pathinfo()函数:以数组的形式返回文件路径的信息

语法:pathinfo(path,options)

      path:必须。规定要检查的路径

      options:可选,规定要返回的数组元素。默认是all

          >可能的值:1PATHINFO_DIRNAME — 只返回dirname:目录路径

                 2PATHINFO_BASENAME — 只返回basename:文件名

                 3PATHINFO_EXTENSION — 只返回extension:文件后缀名

                 4PATHINFO_FIENAME — 只返回filename:不包含后缀的文件名

 

   @因此此处可以通过利用Apache解析顺序或上传phtml等后缀的文件绕过该代码限制。

 

·2.3 文件类型绕过攻击

在客户端上传文件时,通过Burp Suite抓取数据包,当上传一个php格式的文件时,可以看到数据包中Content-Type的值是application/octet-stream,而上传jpg格式的文件时,数据包中Content-Type的值是image/jpeg。

如果服务端是通过Content-Type的值来判断文件的类型,那么可以绕过。因为Content-Type的值是是通过客户端传递的,是可以任意修改的。所以当上传一个php文件时,在Burp Suite中将Content-Type修改为image/jpeg,就可以绕过服务端的检测。

 

>>服务端处理上传文件的代码如下:

>>分析:

服务端代码if判断$_FILES[“file”][“type”]是不是图片的格式(image/gif,image/jpeg,image/pjpeg),如果不是,则不允许上传文件。

 

这里$_FILES[“file”][“type”]是客户端请求数据包中的Content-Type,所以可以使用工具Burp Suite修改Content-Type的值从而绕过该代码限制。

 

@在PHP中还存在一种相似的文件上传漏洞,因为在PHP函数getimagesize()可以获取图片的宽、高等信息,比如如果上传的不是图片文件,那么getimagesize()函数就获取不到信息,那么久可以不允许上传。

>>getimagesize()漏洞代码如下:

>>分析:

     使用函数getimagesize()来获取图片的信息。

     getimagesize():用户获取图像大小以及相关信息,成功返回一个数组,失败则返回FALSE并产生一条E_WARNING级的错误信息。

 语法:getimagesize(string $filename [,array &$imageinfo])

 getimagesize()函数将测定任何GIF、JPG、PNG、SWF、PSD、TIFF、BMP、IFF、JP2、JPX、JB2、JPC、XBM或者WBMP图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。

 

@绕过getimagesize()检测方法:

   >将一个图片和一个WebShell合并为一个文件,例如使用以下命令:

    cat  image.png  webshell.php > image.php

这样getimagesize()函数就可以获取图片信息,且WebShell的后缀是php,也能被Apache解析为脚本文件,可以绕过getimagesize()函数的限制。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

>文件上传:

    在进行文件上传时候,先对文件上传进行判断,比如先是允许什么样的格式才可以上传,常见的文件格式:

php、php2、php3、php4、php5、phps、phtml、pht、phtm等等

 

>在进行文件上传第一步:

判断什么样的文件类型上传,有可能是白名单(只允许jpg,png,gif等格式上传),还是黑名单(不允许php,phtml,php3等格式上传)

比如在进行前端文件检测,如果上传文件的后缀不被允许的话,则会进行弹框告知,此时上传的数据包没有上传到服务器中,只是在客户端浏览器使用javascript对数据包进行检测。

绕过的方式就是使用Burpsuite进行抓包,修改文件的后缀:

    这里就是使用在1.txt中编写一句话木马,然后修改为1.jpg格式,上传文件后使用burpsuite进行抓包拦截,同时修改1.jpg的格式为1.php,在进行重放上传,这样就达到了对前端检测的绕过。

 

>在进行文件上传第二步:

如果使用绕过前端检测的方式没有上传成功,则继续判断是否存在MIME文件类型检测,比如在进行文件上传时,显示文件类型不正确,这里就是可以判断是对文件的类型做了过滤,所以这里是可以继续使用burpsuite来进行抓包修改:

     这里就是对文件类型的Content-type值application/octet-stream修改为image/jpg这种jpg的常规格式参数,这里就是实现了对MIME文件类型Content-type的绕过。

 

>在进行文件上传第三步:

如果在进行修改了文件的后缀名和文件的文件类型都无法上传成功,这里就是判断是否对文件的头部或者文件内容做了检测。

 

@对文件内容做了检测:比如回显不允许出现<?,?>等,那么则可以修改一句话在进行绕过上传:

 

@对文件头部做了检测文件内容检测就是文件头检测,不同的文件不同的文件头,服务端根据文件头部判断文件类型,如果检测的比较好,则攻击就比较困难:

GIF89a:一个GIF89a图形文件就是一个根据图形交换格式(GIF)89a版(1989年7 月发行)进行格式化之后的图形。在GIF89a之前还有87a版(1987年5月发行),但在Web上所见到的大多数图形都是以89a版的格式创建的。

 

@GIF89a是一种对文件头检测的绕过,还有一种就是使用图片合成木马的方式来绕过文件头的检测,图片合成为图片马,进入电脑CMD,输入:

C:\Users\xxx>cd  Desktop(进入桌面)

C:\Users\xxx\Desktop>copy  xxx.jpg/b  +  xxx.php/a  xxx1.jpg

    使用图片木马的方式是可以绕过文件头检测的,不过对于文件内容加载检测等就不起作用了,因为添加的php代码破坏了原有的png数据结构。

@例如:

删除图片中其他的二进制字符,上传的时候只保留文件头部和一句话木马即可。

 

>在进行文件上传第四步:

    如果以上方式都无法上传成功,则可以尝试上传 .htaccess 文件。

    如果这里上传 .htaccess 文件上传成功后,就可以继续写一句话木马上传,但是这里的一句话木马必须是 .jpg格式,因为 .htaccess 文件中的含义是服务端会将jpg格式文件来当做php程序来运行,所以这里就上传一句话木马jpg格式,就会被当成php代码来解析。

但是上面这种方式虽然好用,但是可能会误伤其他正常文件,也容易被查杀,所以这里可以使用第二种精确控制能被解析成php代码的文件:

    这里就是 .htaccess文件调用php解释器去解析一个文件中只要包含“test”这个字符串的任意文件,无论文件名是怎么样的,只要包含了test这个字符串,都可以以php的方式来解析,这种就可以精准控制。

 

@ .htaccess文件

.htaccess文件(或者"分布式配置文件",全称是Hypertext Access(超文本入口)。htaccess文件是Apache服务器中的一个配置文件,他负责相关目录下的网页配置。通过htaccess文件,可以帮助我们实现:网页301重定向,自定义404错误页面,改变文件扩展名,允许或组织特定的用户或者,目录的访问,禁止目录列表,配置默认文档等功能

 

>.htaccess文件上传解析漏洞:

    有一些服务器在上传认证的时候没有拦截 .htaccess文件上传,就会造成恶意用户利用上传 .htaccess文件解析漏洞,来绕过验证进行上传WEBShell,从而达到控制网站服务器的目的。

>当服务器没有禁止 .htaccess文件的上传,且服务商允许用户自定义 .htaccess文件:

@所以通过自己写的 .htaccess文件覆盖掉服务器上的 .htaccess文件,这样就可以解析定义名单了。

 

但是 .htaccess也有局限性,因为 .htaccess文件只能用于Apache服务器,所以还可以考虑另一种文件: .user.ini

上传 .user.ini文件后,就可以继续上传webshell一句话木马文件,但是文件名也必须是shell.jpg文件名。

 

可以借助 .user.ini文件来构造一个“后门”,PHP配置项中有两个比较有意思的项:

1auto_append_file   指定一个文件,自动包含在要执行得文件后。

2auto_prepend_file  指定一个文件,自动包含在要执行得文件前。类似在文件前调用了require()函数

    这里两个设置得区别是在于auto_prepend_file是在文件前插入,auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)

所以,可以借助 .user.ini轻松让所有php文件都“自动”包含某个文件,而这个文件可以是一个正常php文件,也可以是一个包含一句话的webshell。

 

>利用 .user.ini上传\隐藏后门

@条件:

    1服务器脚本语言为PHP

    2服务器使用CGI/FastCGI模式

    3上传目录下要有可执行的php文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值