首页 > 其他分享 >文件上传解析漏洞,以及检测方式的绕过

文件上传解析漏洞,以及检测方式的绕过

时间:2024-01-14 16:01:24浏览次数:28  
标签:文件 php 漏洞 服务器 解析 上传

Web安全-文件上传漏洞


Webshell概念


Webshell是一种利用Web服务器的漏洞或弱点,通过远程上传恶意代码到服务器上(实质上是一种网页后门),并执行命令或控制服务器的一种攻击方式。在上传过后,该文件与网站服务器web目录下的正常网页文件混在一起,然后就可以通过该文件得到一个命令执行环境


攻击者可以通过Webshell获取服务器的高权限,进而进行非法操作,例如修改服务器文件、数据库操作、执行系统命令等。Webshell具有隐蔽性高、操作方便等特点,常被用于非法攻击、入侵行为或用于进行系统安全评估和渗透测试。通常为jsp,asp,php写成的脚本文件


攻击者入侵服务器,使用webshell,无论传文件或者修改文件,必然会有一个文件包含webshell代码,我们有以下检测方式:


   1.寻找静态特征,从文件代码入手检测


   2.webshell通常以HTTP交互,我们可以在HTTP的请求与响应中找寻痕迹


文件上传漏洞的原因


在普通的Web程序中,用户可以上传文件,而上传的文件可以被Web应用解析。假如未对用户上传文件进行检测或者检测不严格,一旦用户上传的恶意文件(甚至是Webshell)被服务器解析后(即文件上传与解析同时出现才能利用),将造成安全问题,即有两个条件:


   1.用户可以绕过服务器检测上传恶意文件


   2.恶意文件可以在一定条件下被解析


常见的上传漏洞


文件解析漏洞


这类漏洞通常是伴随着Web容器解析文件(文件已经在服务器上)而产生。常见的有:IIS,Nginx,Apache,Tomcat等


IIS解析漏洞


在IIS6.0版本中有两个常见漏洞:


   1.当建立起*.asa,*.asp的文件夹时,其中的任意格式文件都可以被解析为ASP脚本


   2.当文件格式为*.asp;1.jpg时,该文件仍然会被当做ASP脚本被解析


Apache解析漏洞


只要是.php.结尾,且“.”无法被Apache解析,就会被Apache服务器解析成php文件,问题是apache如果在mime.types文件里面没有定义的扩展名在诸如x1.x2.x3的情况下,最后一个x3的没有定义,他会给解析成倒数第二个的x2的定义的扩展名。所以xxx.php.rar或者 xxx.php.111这些默认没在mime.types文件定义的都会解析成php的。

用法:在一个有文件上传漏洞的有apache与php搭建的服务器上上传一个一句话木马的文件,这个文件后缀名为.php.111,我们在访问这个文件时就会被解析成php执行


PHP CGI解析漏洞


Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为“phpinfo.jpg/1.php”,然后构造成SCRIPT_FILENAME传递给PHP CGI,并将phpinfo.jpg作为PHP文件解析。如果开启了fix_pathinfo这个选项,那么就会触发在PHP中的如下逻辑:PHP会认为SCRIPT_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为PHP文件来解析了。

      用法:在一个有文件上传漏洞的Nginx与php搭建的服务器上上传一个一句话木马的图片,当我们在上传的图片的路径下一级添加上1.php,那么图片木马就可以被解析成php语言。


文件上传漏洞


导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。


   1.在客户端使用JavaScript进行文件校验,即在本地验证


   2.服务端通过检测文件的Mime类型进行核验,检测出文件是否符合白名单或黑名单(部分会检测是否含恶意代码)


客户端检测


客户端检测


相较于服务端验证来说,客户端检测是非常好处理的,我们可以在客户端使用工具修改文件验证的JavaScript,也可以重新构造文件上传的HTML文档或者使用抓包软件截取报文来绕过


   客户端使用工具修改文件验证的JavaScript:使用工具将报文中的表单中验证文件的对应事件删除即可

   重新构造文件上传的HTML文档:通常情况下只需要删除form表单中的验证事件,将其他部分保留作为HTMl文档即可

   使用抓包软件截取报文来绕过:我们可以将脚本修改成符合客户端检测的文件类型进行上传,然后进行抓包,将文件修改回原本的文件格式,这里需要注意Connect-Length的值,在修改后文件名可能会有字符长度的改变,所以为了防止可能发生的上传失败,我们需要将其修改成合适的长度


服务端检测


   1.文件扩展名白名单检测:即只允许一种或几种文件类型允许被服务器接收


   2.文件扩展名黑名单检测:处于黑名单中的文件类型不允许被服务器接收


   3.文件重命名:即使文件上传成功,经过重命名后攻击者找到自己的脚本进行执行可能性下降


   4.文件类型验证:基于MIME的验证等


绕过文件类型黑名单检测:


  1. 找到不在黑名单中的文件类型,并利用该类型的文件


  2. 针对于对字符大小写转换不敏感的平台,转换大小写绕过


  3.windows平台中文件扩展名后存在 .或空格时,会自动去除,进行解析

标签:文件,php,漏洞,服务器,解析,上传
From: https://blog.51cto.com/u_15651751/9240886

相关文章

  • Feign源码解析5:loadbalancer
    背景经过前面几篇的理解,我们大致梳理清楚了FeignClient的创建、Feign调用的大体流程,本篇会深入Feign调用中涉及的另一个重要组件:loadbalancer,了解loadbalancer在feign调用中的职责,再追溯其是如何创建的。在讲之前,我先提个重点,本文章的前期是引用了nacos依赖且开启了如下选项,启用......
  • 性能篇:深入源码解析和性能测试arraylist和LinkedList差异!
    嗨,大家好,我是小米!今天我们要谈论的是Java中两个常用的集合类:ArrayList和LinkedList。大家都知道,这两者在新增和删除元素的操作上有一些差异,那么它们究竟在性能上有何表现呢?我们通过深入源码解析和性能测试来一探究竟!ArrayList新增元素到末尾这是最常见的新增元素操作,我们使用......
  • Python教程(24)——全方位解析Python中的装饰器
    Python装饰器是一种特殊的函数,它接收一个函数作为参数,然后返回一个新的函数,用于扩展或修改原始函数的行为。装饰器提供了一种便捷的方式来在不修改被装饰函数源代码的情况下,增加、修改或包装函数的功能。通俗点说就是尽量不修改原有功能代码的情况下,给原有的功能添加新的功能。装......
  • 再议Linux中一些发行版中默认下载或上传工具curl的使用
    在目前的CentOS最小化安装发行版中,系统默认的下载/上传工具为:curl。curl支持包括HTTP、HTTPS、ftp等众多协议,还支持POST、cookies、认证、从指定偏移处下载部分文件、用户代理字符串、限速、文件大小、进度条等特征。我们先来大概看一下curl工具的各选项的大概含义。-a/–append......
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
    在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样查找单个文档要从MongoDB的集合中选择数据,我们可以使用find_one()方法。find_one()方法返回选择中的第一个文档。示例查找customers集合中......
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析
    在MongoDB中,我们使用find()和find_one()方法来在集合中查找数据,就像在MySQL数据库中使用SELECT语句来在表中查找数据一样查找单个文档要从MongoDB的集合中选择数据,我们可以使用find_one()方法。find_one()方法返回选择中的第一个文档。示例查找customers集合......
  • Asp.Net怎么上传图片-基础教程
    aspx页面script方法内用于判断用户上传的文件是否为自己要求的格式和展示图片的方法body内定义一个图片框用于预览用户上传的图片一个上传文件的控件一个提交按钮代码如下Script代码:$(function(){$('#uploadImage').on('change',function(){var......
  • WAF绕过-漏洞利用篇-sql注入+文件上传-过狗
    目前安全狗已更新到4.0版本,来学习下bypass绕过方法1.文件上传绕过Content-Disposition–用于接受表单数据,一般可以任意修改,甚至删除name–接受到的表单名,不可修改filename–上传文件名,可以修改Content-Type–MIME类型,视情况定,需要考虑网站上传验证是否处理像之前的插入脏数......
  • Django客户端应用1向服务端应用2发送POST请求并接收解析数据
    一、应用1发送post请求deflogin(url,data):response=requests.post(url,json=data)ifresponse.status_code==200:result=response.json()print(result)returnresultelse:returnNonetry:url="htt......
  • AQS源码解析
    AQS结构特性内部包含Node、ConditionObject静态内部类,Node用来存储没竞争到锁的线程状态、CondidtionObject是对条件变量的封装;volatileintstate变量记录锁的状态,1表示锁被持有、0表示锁被释放,同时对应三个方法来更改/获取锁的状态:getState()、setState(intnewState......