文件上传漏洞理解

(一)文件上传漏洞简介

  • 文件长传漏洞是指攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马、病毒、恶意脚本或这Webshell等

(二)客户端检测绕过

  • 一般都是在网页上写一段 javascript 脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包。

绕过方法:

  • 通过禁用浏览器的中JS脚本;
  • 删除对js验证脚本的调用;
  • 修改脚本JS,将自定义的文件类型后缀添加进去;
  • 将上传的恶意代码文件类型改为允许上传的类型,例如将shell.asp改为shell.jpg上传,在上传时使用Burp拦截数据,将其中的扩展名改为php,就可以绕过客户端验证;

(三)服务端检测绕过

3.1、黑、白名单扩展名过滤

  • 黑名单:找到Web开发人员忽略的扩展名,如: asa 和 cer 之类的;

  • 可能存在大小写绕过漏洞,比如:phP 之类;

  • 在win系统下,如果文件名是以".“或者空格结尾,系统会自动去除”.“与空格,可以绕过黑名单验证,如: 上传”asp." or "asp "的扩展名程序;

  • 白名单:比黑名单拥有更好的防御机制,但不能完全防御,存在Web容器文件解析漏洞,是可以顺利通过验证。

3.2、MIME 验证绕过

MIME的作用:web客户端使用 MIME 来说明希望接收到的数据种类,web服务器使用 MIME 来说明发送数据的种类,它是服务器用来判断浏览器传递文件格式的重要标记项。

  • 配置Burp Suite代理进行抓包,更改Content-Type修改为image/gif,或者其他允许的类型,然后在对应目录生成shell.jpg

3.3、文件头校验绕过

  • 有些通过正则匹配,判断文件头内容是否符合要求,文件头过滤主要是通过验证图片的文件头的方式来判断是不是图片文件。
  • 比如:GIF图片的文件头就是GIF89a。构造:GIF89a<?php phpinfo(); ?>,即可绕过。

3.4、目录验证的绕过

  • 在文件上传时,有时开发人员运行如果目录存在,就在目录写入文件,不存在则先建立目录,再写入文件。
  • 如果Web容器为 IIS 6.0,在提交的表单里存在文件上传目录,将其值修改为不存在的目录,如:1.asp,并上传一句话图片木马文件1.jpg。程序在接受文件后,对目录判断,因为服务器不存在 1.asp 目录,则会创建,此目录下的1.jpg会当作asp解析。

3.5、%00截断上传绕过

  • 在许多语言的函数中,0x00被认为是终止符,无论0x00还是%00,最终被解析:chr(0),返回的是ASCII码对应的字符,而 0 对应的就是NUT字符(NULL),也就是空字符。当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。

  • 比如:程序只允许上传 JPG 图片,那么可以构造文件名为xxx.php%00.JPG,.JPG绕过了应用的上传文件类型判断;但对于服务器来说,此文件因为0x00字符截断的关系,最终却变成了xxx.php。

3.6、htaccess上传

  • 条件:
    (1). apache服务器
    (2). 能够上传.htaccess文件,一般为黑名单限制。
    (3). AllowOverride All,默认配置为关闭None。
    (4). LoadModule rewrite_module modules/mod_rewrite.so #模块为开启状态
    (5). 上传目录具有可执行权限。

  • .htaccess文件,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

  • .htaccess文件内容:AddType application/x-httpd-php .jpg,上传后,在上传 .jpg ,apache 服务器会将所有.jpg为后缀的文件作为 php 文件解析。

(四)解析漏洞

4.1、IIS 解析漏洞

在 IIS5.x/6.0 中,在网站下建立文件夹的名字为 *.asp、*.asa、*.cer、*.cdx的文件夹,那么其目录内的任何扩展名的文件都会被IIS当做asp文件来解释并执行。例如创建目录 test.asp,那么 /test.asp/1.jpg 将被当做asp文件来执行。假设黑客可以控制上传文件夹路径,就可以不管上传后你的图片改不改名都能拿shell了。

  • 当文件为 *.asp;1.jpg时,同样会以asp脚本执行。原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了。

4.2、Apache 解析漏洞

  • phtml、pht、php3、php4和php5都是Apache和php认可的php程序的文件后缀。
  • Apache 解析文件的规则:从右到左开始判断解析,如果遇到不能识别的扩展名就再往左判断则跳过,直到碰到认识的扩展名为止, 比如test.php.AAA.BBB中 “.AAA”和”.BBB” 这两种后缀是apache不可识别解析,最终apache就会把test.php.AAA.BBB解析成php。

4.3、Nginx 解析漏洞

  • php的配置文件 php.ini 文件中开启了 cgi.fix_pathinfo,一般默认是开启的

例子: http://www.xxx.com/1.jpg/1.php

  • Nginx一看后缀是.php,便认为该文件是php文件,于是转交给php去处理。php一看 /1.jpg/1.php 不存在,便删去最后的/1.php,又看/1.jpg存在,便把/1.jpg当成要执行的文件了,攻击者可以上传图片木马,然后在url加上/xxx.php 就可以获得网站的 Webshell,在新版本的php引入了security.limit_extensions ,限制了可执行文件的后缀,默认只允许执行.php文件。(IIS7.0也存在此漏洞)

Nginx 空字节漏洞 如:xxx.jpg%00.php 这样的文件名会被解析为php代码运行
Nginx 0.5.*、 Nginx 0.6.*、Nginx 0.7 <= 0.7.65、 Nginx 0.8 <= 0.8.37

4.4、Windows文件命名

在windows环境下,xx.jpg[空格] 或 xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除。

  • 在文件名后面留一个空格,然后上传上去后空格会被自动的省略。所以可以先上传 .php 文件,然后抓包在文件名后面加一个空格进行绕过即可。
  • windows有一个特性,会自动去掉后缀名最后的 . ,所以可以先上传 .php 文件,然后抓包在文件名后面加 . 即可绕过。

(五)漏洞利用总结

条件: 寻找一个上传点,查看上传点是否可用。
利用:

  1. 首先判断是前端写的上传点,还是服务器端验证上传功能
  2. 如果是前端写的上传点
    2.1. 上传一个正常的jpg图片 查看上传点是否可用
    2.2. 上传一个正常的jpg图片,burp拦截,修改后缀为php (可以检测前端验证 MIME检测 文件内容检测 后缀检测)
    2.3. 上传一个正常的jpg图片,burp拦截, 00截断 1.php%00.jpg
  3. 如果是服务器端验证上传功能,搜索当前服务器的漏洞
  4. 获取服务器的指纹信息,判断服务器是什么类型,web服务器程序,是什么类型,版本号多少
    利用解析漏洞

(六)漏洞防御

  • 上传文件的存储目录禁用执行权限
  • 文件后缀白名单,注意0x00截断攻击(PHP更新到最新版本)
  • 不能有本地文件包含漏洞
  • 及时修复Web上传代码(重要)
  • 升级Web Server

猜你喜欢

转载自blog.csdn.net/qq_43307937/article/details/123632933