文件上传漏洞成功的根本原理

本质

  • 其本质就是欺骗服务器对文件后缀的解析,让一个后缀名被修改了的包含可执行恶意代码的文件可以被上传到服务器文件中使用户可以使用如中国蚁剑这样的工具去发送POST请求让服务器结构得到呈现从而实现黑进服务器的效果。

黑入成功的关键

  • 首先要让文件能够被成功上传:

    • 后缀名修改:
      许多服务器仅通过文件后缀名验证文件类型。将.php改为.jpg/.png可欺骗服务器认为这是合法图片文件,从而允许上传。

    • 代码关键字的修改:
      有些服务器会对文件源码进行筛查,比如会过滤掉<?这样的符号,需要人为使用代码特性进行绕过。

    • 文件头和MIME类型的修改:

      服务器可能会验证报单内容(文件头和MIME类型),从而使恶意文件难以被成功上传到服务器中。
      (文件头是和被上传的文件源码紧挨着的,写入时请不要和上方的参数挨着)。

  • 其次就是让文件被成功解析:

    • 目前所遇到的情况:服务器会根据URL后缀名选择解析方式,使得文件得到解析后让恶意代码执行

和文件上传有关服务器报单参数

  • Content-Disposition参数:
    该参数形如:

    该参数对服务器如何解析该文件没有任何影响,它只会影响文件保存的后缀名,如以pngjpg格式进行保存。
    这里我虽然说对如何解析该文件没有任何影响,但是你若是在bp的repeater页面反复修改该参数并使用send操作,那会在服务器储存文件的目录下储存不同的文件。
    如图:

    我们可以看到,每改一次Content-Dispositionfilename后缀,进行一次send操作,就会在该路径下创建一个后缀名不同的文件。

  • url中的文件后缀名:
    该参数形如:

    /upload/demo.phtml
    在一些服务器的配置中,修改后缀名才是可能让服务器改变对文件的解析方式的途径,从而使得恶意代码可以被成功执行。
    但是我这里做一个补充:

    想利用修改URL后缀对文件强行解析的局限性

    • 多数Web服务器(如Apache/Nginx)依据物理文件后缀决定MIME类型
    • 除非特殊配置(如Apache的multiviews选项),否则/uploads/1.png/xxx.php不会解析为PHP
    • 服务器优先检查文件系统真实存在的文件名,URL伪路径无法改变实际解析逻辑

关于冲突的方法

1
2
3
<script language="php">
@eval($_POST['cmd'])
</script>
  • 然而在ctfshow web151中写入这样运行php代码的js代码却无法正常被蚁剑连接
    原因就是:**PHP 5.x 环境 + 宽松的解析配置,允许 .png 中的 <script language="php"> 执行。**在PHP 7.x后,移除该语法。

  • 所以不如直接写<?php @eval($_POST['cmd']);?>