漏洞简介

文件上传,顾名思义就是上传文件的功能行为,之所以会被发展为危害严重的漏洞,是程序没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。文件上传漏洞是漏洞中最为简单猖獗的利用形式,一般只要能上传获取地址,可执行文件被解析就可以获取系统WebShell。

漏洞原理

网站WEB应用都有一些文件上传功能,比如文档、图片、头像、视频上传,当上传功能的实现代码没有严格校验上传文件的后缀和文件类型时,就可以上传任意文件甚至是可执行文件后门。

漏洞危害

恶意文件传递给解释器去执行,之后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理,服务器命令执行等恶意操作。根据网站使用及可解析的程序脚本不同,可以上传的恶意脚本可以是PHP、ASP、JSP、ASPX文件。

文件上传检测方式

  1. 客户端javascript检测(检测文件扩展名)
  2. 服务端MIME类型检测(检测content-type 内容
  3. 服务端目录路径检查(检测跟path参数相关的内容
  4. 服务端文件扩展名检测(检测跟文件extension相关的内容
  5. 服务端文件内容检测(检测是否合法是否含有恶意代码

Webshell介绍

Webshell就是以asp、php、jsp或者CGI等网页文件形式存在的一种命令执行环境,也可以将其称为一种网页后门。入侵者通常会将这些asp或php后门文件与网站web服务器目录下正常的网页文件混在一起,然后使用浏览器来访问这些后门。

常用一句话木马

1
2
3
4
5
<?php
@eval($_POST[a]);
?>
<%evalrequest("value")%>
<%@ Page language="Jscript"%><%eval (Request.Item["value"])%>

文件上传的绕过脑图

image-20240517180815112

image-20240517180751671

1)JS检测绕过

前端代码;

1.修改前端代码

2.抓个正常的包 修改

2)服务端检测

通常三个方向:MIME,文件内容,文件后缀。

MIME绕过:修改Content-Type字段

文件后缀名绕过:一般是黑名单,或者直接白名单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
黑名单策略:以.php为例
1.大小写 (.Php)
2.空格 在后缀名后加空格(.php )
3.点绕过 .php.
4.::$DATA绕过 (.php::$DATA)
5.配合Apache解析漏洞。后面有专门介绍
6.htaccess文件 将图片解析为木马
<FileMatch "yuan.png">
setHandler application/x-httpd-php
</FilesMatch>
白名单策略:

%00截断:
url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。

0x00截断:
系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而不是文件名中的00。

3)绕过文件内容检测

1.通过上传文件内容开始处的文件幻数来判断。

一般通过判断前10个字节,基本就能判断出一个文件的真是类型

绕过jpg文件

1
2
Value = FF D8 FF E0 00 10 4A 46 49 46
ÿØÿà%00àJFIF

绕过gif文件幻数

1
2
Value = 47 49 46 38 39 61
GIF89a

绕过png

1
2
Value = 89 50 4E 47
‰PNG

2.文件加载检测

一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,甚至二次渲染。

图像处理软件对一张图片进行代码注入

原理是:在不破坏文件本身的渲染情况下找一个空白区进行填充代码,一般是图片的注释区

二次渲染的攻击方式-攻击文件加载器本身

溢出攻击对文件加载器进行攻击

4)解析漏洞

Apache解析漏洞

形式:test.php.qwe.asd 任意不属于Apache解析黑名单且也不属于白名单的名称

原理:Apache解析文件的规则是从右往左开始判断解析,如果后缀名为不可识别文件解析,就往左判断。

条件:apache通过mod_php来运行脚本,其2.4.0-2.4.29中存在apache换行解析漏洞,在解析php时xxx.php\x0A将被安装PHP后缀进行解析,导致绕过一些服务器的安全策略

www.xxx.com/test.php.qwe.asd

以moudel方式连接,配置文件httpd.conf中LoadMoudle rewrite_module

modules/mod_rewrite.so前的注释去掉,寻找关键词:AllowOveride,并把后面的参数从None全部改成All。

Ngnix解析漏洞

形式:任意文件名/任意文件名.php

一个在任意文件名后面加/任意文件名.php的解析漏洞

原理:Ngnix《0.8.37默认是以CGI的方式支持php解析的,普遍的做法是在Ngnix通过正则匹配设置SCRIPT_FILENAME。当访问www.xx.com/phpinfo.jpg/1.php这个URL时,$fastcgi_script_name会被设置为phpinfo.jpg1.php,然后构造成SCRIPT_FILENAME传递给PHP CGI,但是PHP如果开启fix_pathinfo这个选项。就会将SCRIPY_FILENAME是phpinfo.jpg,而1.php是PATH_INFO,所以就会将phpinfo.jpg作为php文件来解析

1
2
3
4
5
漏洞形式:

www.xxxx.com/UploadFiles/image/1.jpg/1.php
www.xxxx.com/UploadFiles/image/1.jpg.php
www.xxxx.com/UploadFiles/image/1.jpg/ \0.php

IIS 6.0解析漏洞

1.目录解析

形式:www.xxx.com/xx.asp/xx.jpg

原理:服务器默认会吧.asp目录下的文件都解析成asp文件

2.文件解析

形式:www.xxx.com/xx.asp;.jpg

原理:服务器默认不解析;后面的内容

1
2
3
4
默认的可执行文件除了asp还包含
/test.asa
/test.cer
/test.cdx

IIS7.0/7.5解析漏洞

形式:任意文件名/任意文件名.php

原理:对任意文件只要在URL后面追加上字符串/任意文件名.php就会按照php的方式去解析

文件上传漏洞防御

1.文件上传的目录设置为不可执行

2.判断文件类型

3.使用随机数该写文件名和文件路径

4.单独设置文件服务器的域名

[!NOTE]

svg文件

pdf文件

上传存储型xss