小迪安全03 - 文件上传漏洞绕过方法

本文探讨了前端JS文件格式验证及其可能的绕过方法,包括修改文件后缀和禁用JS脚本。同时,介绍了后端验证中的MIME类型与文件头检查,以及如何通过文件头篡改和利用Apache文件解析漏洞进行绕过。此外,还讨论了大小写绕过、服务器白名单绕过中的文件截断技巧,特别是针对PHP的00截断漏洞。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 前端:

JS检测绕过:

前端网页JS对文件格式进行验证:

<script type="text/javascript">
    function checkFile() {
        var file = document.getElementsByName('upload_file')[0].value;
        //获取到文件名
        if (file == null || file == "") {
            alert("请选择要上传的文件!");
            return false;
        }
       
        var allow_ext = ".jpg|.png|.gif";
         //定义允许上传的文件类型
        
        var ext_name = file.substring(file.lastIndexOf("."));
        //提取上传文件的类型。
        //通过lastIndexOf取到“.”的索引,再使用substring函数截取 .后缀名
       
        if (allow_ext.indexOf(ext_name) == -1) {
        //如果 allow_ext 中没有 ext_name字符串,则返回-1
            var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
            alert(errMsg);
            return false;
        }
         //判断上传文件类型是否允许上传
    }
</script>

绕过方法:

1.抓包将原“合法”文件后缀名改回 php再forward就可以上传WebShell到服务器。

2.禁用浏览器JS脚本(浏览器插件)。

后端验证:

1.服务端MIME绕过:

相关概念:Content-Type,即互联网媒体类型,也叫做MIME类型。在互联网中有成百上千中不同的数据类型,HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签,用于区分数据类型。

在HTTP协议消息头中,使用Content-Type来表示请求和响应中的媒体类型信息。它用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析并展示html等等。

常见的content-type有:

  • HTML文档标记:text/html;
  • 普通ASCII文档标记:text/html;
  • JPEG图片标记:image/jpeg;
  • GIF图片标记:image/gif;
  • js文档标记:application/javascript;
  • xml文件标记:application/xml;

 burp抓包,将报文中的Content-Type改成允许的类型即可

2.文件头绕过:

相关概念:文件均有一个特殊的、可识别的文件头(又称文件幻数)。图片格式往往不是根据文件后缀名去做判断的。文件头是文件开头的一段二进制,不同的图片类型有不同的文件头。

常见的文件头:


JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E

 绕过方法:
在脚本文件开头补充图片对应的头部值,或在图片后写入脚本代码。

3.服务器扩展名黑名单绕过:

1.大小写绕过:

服务端没有对后缀名转化为统一格式进行对比,导致可以上传后缀为pHp的文件,又因为windows对大小写不敏感,所以.pHp扔回被当成PHP文件解析。

2.Apache文件解析漏洞:

2.1黑名单不允许上传.asp,.aspx,.php,.jsp后缀的文件,apache的httpd.conf中如果配置如下代码,就可以上传.phtml .phps .php5 .pht文件。

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

2.2  .htaccess这个文件作为一个配置文件,可以用来控制所在目录的访问权限以及解析设置。如下,所有的jpg后缀会被当做php执行。

 - AddType application/x-httpd-php.jpg

4.服务器白名单绕过:

绕过方法:文件截断

00截断利用的是php的一个漏洞。在 php<5.3.4>版本中,存储文件时处理文件名的函数认为0x00是终止符。于是在存储文件的时候,当函数读到 0x00(%00) 时,会认为文件已经结束。

比如,当我们上传一个1.php%00.jpg 的文件时,前端检测的后缀名检查结果为jpg,可以绕过前端的检测;后端判断文件名后缀的函数会认为其是一个.jpg格式的文件;但是保存的时候,处理文件名的函数在遇到%00字符认为这是终止符,于是1.php%00.jpg文件被保存为1.php储存在服务器里。

### 绕过文件上传安全检测机制的技术分析 在处理文件上传漏洞时,攻击者通常会尝试利用服务器端的安全配置缺陷来实现恶意目的。以下是几种常见的绕过方法及其技术细节: #### 1. **文件名伪装** 许多应用程序会对上传的文件扩展名进行验证,以防止执行脚本类型的文件(如 `.php` 或 `.jsp`)。然而,某些情况下可以通过修改文件名的方式绕过这些限制。例如: - 使用双扩展名:将文件命名为 `test.php.jpg` 可能会让系统将其视为图片文件,但实际上仍会被解释为 PHP 脚本[^1]。 - 添加多余的点号:命名方式如 `file...jpg` 可能在某些解析器中被错误解读。 #### 2. **MIME 类型伪造** 除了文件扩展名外,Web 应用程序还可能依赖 MIME 类型来进行安全性检查。可以尝试发送与实际内容不符的 MIME 头部数据。例如,在 HTTP 请求头中设置如下字段: ```http Content-Type: image/jpeg ``` 即使上传的是可执行脚本文件,只要其头部声明为合法图像格式,则有可能通过初步筛选[^2]。 #### 3. **零字节截断 (Null Byte Injection)** 部分老旧版本的服务软件存在对路径字符串处理不当的问题,允许注入 NULL 字符 (`\0`) 来终止读取操作。这意味着当提交名为 `shell.php%00.jpg` 的文件时,存储过程中可能会只保留前半部分内容作为最终保存名称从而暴露潜在风险。 #### 4. **利用临时目录特性** 对于 Linux 平台上的应用而言,“/tmp” 是常用的临时工作区之一。如果有能力向此位置写入任意代码片段比如 shell script ,那么就可以进一步探索提权可能性 。具体法包括但不限于先期植入工具脚本来辅助后续动作 . #### 示例代码展示 下面给出一段简单的 Java 程序用于演示基本概念而非实战用途 : ```java public class FileUploadBypass { public static void main(String[] args){ String fileName="example..php"; System.out.println("Attempting to bypass with filename:"+fileName); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值