找回密码
 立即注册
首页 业界区 安全 文件上传漏洞

文件上传漏洞

驼娑 2025-6-11 14:25:48
文件上传漏洞

文件上传漏洞是Web应用程序中常见的一种安全漏洞,它允许攻击者上传可以执行的文件到服务器上,从而可能控制整个服务器

以下是文件上传漏洞的基本原理:

  • 正常的文件上传功能

    • 在很多Web应用中,如论坛、博客、在线编辑器等,都需要提供文件上传功能,允许用户上传图片、文档等文件

  • 文件上传漏洞的产生

    • 当Web应用没有正确处理用户上传的文件时,就可能产生安全漏洞。以下是几个常见的漏洞点:

      • 缺乏有效的文件类型检查:应用没有检查或错误地检查了上传文件的MIME类型或文件扩展名
      • 不正确的文件名处理:应用在保存上传文件时没有正确处理文件名,可能允许攻击者通过在文件名中插入恶意代码来改变文件类型
      • 文件内容未检查:即使限制了文件类型,攻击者也可能上传含有恶意代码的文件,如图片中嵌入的Webshell
      • 目录遍历:攻击者可能利用目录遍历漏洞,将文件上传到Web目录之外的位置,例如服务器的系统目录
      • 不安全的文件存储:文件存储在服务器上时,如果权限设置不当,攻击者可能通过上传的文件获得对服务器其他部分的访问权限


  • 利用文件上传漏洞

    • 攻击者通过上传一个可以执行的脚本文件(如PHP、ASP、JSP脚本)到服务器上
    • 如果服务器配置不当,允许执行上传的脚本文件,攻击者就可以通过该脚本执行任意命令,控制服务器
    • 攻击者可能会上传Webshell(一种网页形式的Shell),通过浏览器来执行系统命令

一句话木马
可执行脚本的文件后缀名,可被网站目录解析。以下是常见的后缀名
  1. asp
  2. asa
  3. cdx
  4. cer
  5. php
  6. aspx
  7. ashx
  8. jsp
  9. php3
  10. php.a
  11. shtml
  12. phtml
  13. 有些网站会对 asp 或者 php 进行过滤转成空可用这些后缀名。
  14. aspasp asaspp
  15. phpphp
复制代码
一句话木马可以让服务器执行入侵者指定的命令
  1. php的一句话木马: <?php @eval($_POST['pass']);?>
  2. asp的一句话是:   <%eval request ("pass")%>
  3. aspx的一句话是:  <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>
复制代码
木马文件的上传及绕过

绕过前端JS检测上传

​                文件上传时,用户选择文件时,或者提交时,有些网站会对前端文件名进行验证,一般检测后缀名,是否为上传的格式。如果上传的格式不对,则弹出提示文字。此时数据包并没有提交到服务器,只是在客户端通过 js 文件进行校验,验证不通过则不会提交到服务器进行处理
绕过JS检测方法


  • 按 F12 使用网页审计元素,把校验的上传文件后缀名文件删除,即可上传
  • 把恶意文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包,把后缀名改成可执行的脚本后缀如php 、asp、jsp、net 等,即可绕过上传
绕过contnet-type检测上传

​                有些上传模块,会对 http 的类型头进行检测,如果是图片类型,允许上传文件到服务器,否则返回上传失败。因为服务端是通过content-type 判断类型,content-type 在客户端可被修改。则此文件上传也有可能被绕过的风险
黑名单绕过上传

​                上传模块,有时候会写成黑名单限制,在上传文件的时获取后缀名,再把后缀名与程序中黑名单进行检测,如果后缀名在黑名单的列表内,文件将禁止文件上传
​                上传图片时,如果提示不允许 php、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。 在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net执行 可以上传 ashx 代替 aspx。如果网站可以 执行这些脚本,通过上传后门即可获取 webshell。 在不同的中间件中有特殊的情况,如果在apache可以开启application/x-httpd-php, 在 AddType application/x-httpd-php .php .php3 .phtml后缀名为.phtml、.php3均被解析成php,有的apache版本默认开启。 上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3
.htaccess重写解析绕过上传

上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess。htaccess文件的作用是可以帮我们实现包括文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。在.htaccess里写入<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>,则可以文件重写成php文件。 要 htaccess 的规则生效,则需要在apache开启rewrite 重写模块,因为apache是多数都开启这个模块,所以规则一般都生效
上传攻击
上传.htaccess到网站里,.htaccess 内容是
  1. <FilesMatch "jpg">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>
复制代码
再上传恶意的jpg到.htaccess相同目录里,访问图片即可获取执行脚本,当图片上传成功之后,即使格式是jpg的,也一样会被当成php脚本执行
大小写绕过上传

有的上传模块后缀名采用黑名单判断,但是没有对后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过
.user.ini绕过

自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果
.user.ini原理
.user.ini中两个中的配置就是_auto_prepend_file_和_auto_append_file_。这两个配置的意思就是:我们指定一个文件(如1.jpg),那么该文件就会被包含在要执行的php文件中(如index.php),相当于在index.php中插入一句:require(./1.jpg)。这两个设置的区别只是在于auto_prepend_file是在文件前插入,auto_append_file在文件最后插入。
利用.user.ini的前提是服务器开启了CGI或者FastCGI,并且上传文件的存储路径下有index.php可执行文件
利用.user.ini的环境
​                有时候我们进行文件上传的时候,站点不仅在前端做了白名单处理,还在后端做了黑名单处理以及文件类型的检验且服务器没有配置"AddType application/x-httpd-php .php .phtml",这时我们就不能通过简单的绕过前端验证修改数据包的 Content-Type 并将文件后缀改为 phtml 以此来利用文件上传漏洞
​                这时我们就需要利用.user.ini进行配合,使得我们上传的图片格式的webshell也能够被解析,以此成功利用漏洞拿到shell权限
  1. auto_append_file=demo.jpg
复制代码
该文件意思是无论访问当前目录下哪个 PHP 文件都会自动去包含 demo.jpg 这个文件
空格绕过上传

在上传模块里,采用黑名单上传,如果没有对空格进行去掉可能被绕过
利用 windows 系统特征绕过

在 windows 中文件后缀名的点“.”,系统会自动忽略。所以shell.php.和shell.php的效果一样。可以在文件名后面加上.绕过
NTFS 交换数据流:DATA 绕过上传

如果后缀名没有对:DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上传。 在window的时候如果文件名+:DATA会把:DATA之后的数据当成文件流处理,不会检测后缀名,且保持:DATA之前的文件名,他的目的就是不检查后缀名
例如:phpinfo.php:DATAWindows会自动去掉末尾的:DATA变成phpinfo.php
利用 windows 环境的叠加特征绕过

在Windows操作系统中,文件系统有一定的规则来处理文件名。当一个文件以特定的方式命名时,比如 phpinfo.php:.jpg,Windows可能会截断或忽略文件名中某些特殊字符后面的部分。这是因为 : 在Windows中是一个用于表示卷标或驱动器的特殊字符,而在文件名中通常不被允许。当你尝试上传一个名为 phpinfo.php:.jpg 的文件时,Windows可能会将文件名截断为 phpinfo.php,因为 : 后面的部分被视为对文件系统的指令,而不是文件名的一部分。这样,就会在目录下创建一个名为 phpinfo.php 的空白文件
Windows的文件系统中,以下符号在正则匹配时可能被视为相等:
<ul>双引号 " 等于 点号 .
大于符号 > 等于 问号 ?
小于符号
您需要登录后才可以回帖 登录 | 立即注册