Reference

文件上传漏洞 | 狼组安全团队公开知识库 (wgpsec.org)

客户端校验

最简单的校验方法即在客户端浏览器对上传的文件进行校验

我们可以将木马修改为允许的后缀,然后使用bp拦包修改后缀名

当然也可以直接修改客户端代码的逻辑,以允许上传php文件

服务端校验

MIME校验/文件内容头校验(GIF89a)

MIME类型是用来标识文件的格式,确保数据能够正确地被互联网应用程序理解和处理

MIME类型通常在HTTP请求和响应中使用两个主要的HTTP头部字段Content-TypeAccept来传输,字段值决定了传输的文件类型

例如:

  • text/html:HTML文档
  • application/json:JSON格式的数据
  • image/jpeg:JPEG图像

遇到MIME校验时,我们可以在上传php文件后抓包,修改Content-Type 的值为允许的类型

针对文件内容头校验,可以在恶意脚本前添加GIF89a标识,一句话前后加图片数据混淆

文件扩展名校验

一般检查文件扩展名时会使用黑名单或白名单来限制文件后缀

黑名单绕过

  1. 找漏网之鱼:cer、php3、php4

  2. 大小写绕过:AsP、pHP

文件后缀复写绕过:.phphpp

针对Windows系统:

上传不符合windows文件命名规则的文件名

1
2
test.php:1.jpg
test.php::$DATA

会被windows系统自动去掉不符合规则符号后面的内容

会被windows系统自动去掉不符合规则符号后面的内容

白名单绕过

%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合服务器中间件解析漏洞绕过

.htaccess

.htaccess 文件是Apache HTTP Server(以及一些兼容Apache的Web服务器,如LiteSpeed)特有的配置文件。它允许在不需要访问主服务器配置文件的情况下,对单个目录及其子目录应用特定的配置规则。

如果目标服务器允许用户修改.htaccess文件我们就可以通过它改变文件拓展名或者访问功能来getshell

如果可上传修改 .htaccess 文件 (还能用于隐藏后门)

例如下面的配置会将特定文件按php解析

1
2
3
4
<FilesMatch "shell.jpg">
 SetHandler application/x-httpd-php
</FilesMatch>
//上传shell.jpg文件,将解析为php运行

当然我们也可以针对一类后缀,如.png

1
AddType application/x-httpd-php .png   //png文件解析为php文件

.user.ini

.user.ini 文件用于PHP应用,是自PHP 5.3.0版本引入的一种配置文件,可以在运行时改变PHP的配置设置。这些文件只影响其所在目录及子目录中的PHP文件。

1
2
auto_prepend_file=a.jpg //在页面顶部加载文件
auto_append_file=a.jpg //在页面底部加载文件

auto_prepend_fileauto_append_file用于自动地在每个PHP脚本执行前后包含指定的PHP文件,即使该文件不是php后缀,也会执行其中的PHP代码

文件内容检测

过滤

一种情况是对文件内容中某些关键字进行过滤

我们可以使用二分法来判断过滤了一句话木马中的哪些部分

文件头

文件内容加幻术头GIF89a

图像检测

常见的是对图像进行二次渲染,一般是调用PHP 的GD库

我们可以使用绕过GD库的webshell生成器

例如getimagesize()函数,它是php提供的,通过对目标文件的16进制进行读取,通过该文件的前面几个字符串,来判断文件类型。

要绕过该函数的检测,我们可以伪造图片的16进制头部字符串,当然更简单的方法是将图片和php文件合成为一个图片

1
copy test.jpg + test.php synth.jpg

竞争条件攻击

一些网站允许上传任意文件,然后检测文件是否包含Webshell,如果有则删除该文件。

服务器端在处理不同用户的请求时是并发进行的

如果并发处理不当或相关操作逻辑顺序设计的不合理时,将导致条件竞争漏洞

如这样一段代码

1
2
3
4
5
6
7
<?php
if(isset($_GET['src'])){
copy($_GET['src'],$_GET['dst']);
sleep(2);
unlink($_GET['dst']);
}
?>

它先把文件保存在本地,再检查,然后删除

在上传完成和安全检查删除它的间隙,攻击者用多线程不断的发起访问请求该文件

该文件就会被执行从而生成一个恶意shell

漏洞防御

1、使用白名单限制可以上传的文件扩展名

2、注意0x00截断攻击(PHP更新到最新版本)

3、对上传后的文件统一随机命名,不允许用户控制扩展名

4、上传文件的存储目录禁用执行权限