文件上传漏洞
原理:
服务器端对用户上传的文件缺乏严格的验证或过滤机制,导致攻击者能够上传可执行的恶意脚本文件(如WebShell),并在服务器上执行这些文件,从而获取服务器权限。
前提条件
- 成功上传文件到服务器
- 文件能够被访问到
- 文件被解释器解析执行
检测方式:
前端检测:JavaScript验证
后端检测:
1.检测MIME类型
2.检测后缀名
3.检测文件内容
判断检测方式:

检测绕过方法
前端检测:
禁用JavaScript即可:打开F12,在设置中关掉JavaScript,重新上传文件。(上传完后注意重新打开)
后端检测:
MIME类型检测
用bp抓包后,再报文中找到Content-Type字段,修改其MIME类型,一般改为图片。
常见MIME类型
超文本标记语言.html文件:text/html
普通文本.txt文件:text/plain
PDF文档.pdf:application/pdf
PNG图像.png:image/png
GIF图像.gif:image/gif
MPEG文件.mpg、.mpeg:video/mpeg
后缀名检测
1.黑名单检测
(1)其他可解析后缀绕过
Apache服务器能够使用PHP解析.php3、.php5、.phtml。
可尝试将后缀名改为:
PHP:php2、php3、php5、phtml、pht
ASP: asa、cer、cdx
ASPX:ascx、ashx、asac
JSP:jspx、jspf
(2)配置文件绕过
.htaccess文件(或者分布式配置文件),全称是Hypertext Access(超文本入口)。提供了针对目 录改变配置的方法。即在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目 录及其所有子目录
1.上传.htaccess文件
<FilesMatch "木马文件名,如:as.png"
setHandler application/x-httpd-php
</FilesMatch>
2.上传木马文件(as.png)
2.白名单检测
00截断绕过:0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。系 统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。这个可以用在对文件类型名的绕过 上。
但要注意是文件的16进制内容里的00,而不是文件名中的00 !!!就是说系统是按16进制读取文件 (或者说二进制),遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x 开头表示16进制,也就是所说的0x00截断。%00是被服务器解码为0x00发挥了截断作用。 前提条件:PHP版本 < 5.3.29且php.ini文件的magic_quotes_gpc的值为Off。
文件内容检测
1.文件幻数绕过
文件格式幻数(Magic Number),它可以用来标记文件或者协议的格式,很多文件都有幻数标志来表 明该文件的格式。
png:89 50 4E 47 0D 0A
Gif:47 49 46 38 39 61