Bu44er's blog

文件上传漏洞

Mou.webp
Published on
/
4 mins read
/
––– views

漏洞原理


概述

通过上传一句话木马,根据服务器返回的文件位置,向该路径传递POST参数,控制服务器。

  • 即webshell
<?php eval($_POST['a']); ?>

常见绕过

文件头绕过

文件类型文件头HEX文件头内容
PNG89504E47.PNG
GIF474946383961GIF89a
JPEGFFD8FF...
  • . 表示不可见内容

给php等文件添加文件头绕过

  • php、asp、jsp等文件只要任意部位有解析标签就可以,文件头加上一串字符不影响解析。

拓展名绕过

发现php后缀被拦截,可用其他的后缀在进行绕过。

  • phtml、pht、php、php3、php4、php5
  • 还有:大小写绕过、点号绕过(win)、空格绕过(win)

::$DATA 绕过

(WIN)如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,效果就是不检查后缀名。

  • 如:a.php::$DATAa.php 等价

<? 绕过

<script language="php">
  eval($_POST['zj'])
</script>

MIME

MIME类型用于HTTP协议,以告知服务器接收到的文件的类型。

可以通过抓包修改MIME类型,绕过验证。

  • 注意:对于图片上传可能白名单只有jpeg,导致png也被禁用,测试注意不要只测png

条件竞争绕过

有些网站是先允许任何文件上传,在上传之后再验证,如果验证不通过再删除文件。

但是,攻击者可以利用上传后和删除前的时间大量发送请求,有可能能访问到webshell

文件解压绕过

通过修改压缩包二进制文件,使其在解压时出现错误,通过出错前已经解压出的一部分文件获取webshell。

原理是:在发生解压错误时,网站逻辑会进入异常处理的分支,而开发人员往往会忽视对已经解压的文件进行检验。


解析为php

.htaccess

  • 适用于Apache

上传一个.htaccess文件将指定文件内容解析为php程序

<FilesMatch "zj.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

.user.ini

  • 适用于Nginx

指定一个文件(如zj.jpg),将该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:include(zj.jpg);

上传的图片文件的地址其实指向了一个php文件:

  • 例如 http://d2e89e76-3d3c-43ce-97ab-5a7db5826f78.node5.buuoj.cn/uploads/065831472858248584ff4993846d5065/index.php
  • zj.jpg 在 index.php 的页面中,蚁剑也要连这个index.php
GIF89a

auto_prepend_file=zj.jpg

前端验证

网页弹窗显然是前端验证,直接抓包是没有用的,因为前端验证是在发送数据包给后端之前的,前端验证发生错误直接return了,不会发包给后端。

解决:F12,删除前端相应检测代码;假如是js脚本,(似乎chrome中删了也没用)可以直接在f12设置中,==禁用js功能!!!==


题目

  • [极客大挑战 2019]Upload
← Previous postPHP 一句话木马
Next post →PHP代码审计