文件上传漏洞攻防解析:从Webshell上传到服务器沦陷的实战指南

📅 2026/6/30 18:07:26
文件上传漏洞攻防解析:从Webshell上传到服务器沦陷的实战指南
1. 项目概述从“上传”到“沦陷”的惊险一跃在网络安全的世界里文件上传功能就像一扇连接内外网络的门。对于普通用户它是分享照片、提交作业的便捷通道但对于渗透测试人员和安全研究者这扇门背后可能隐藏着一条直通服务器核心的“高速公路”。我从业十多年处理过无数起由文件上传漏洞引发的安全事件小到网站被篡改首页大到整个内网被渗透、数据被勒索加密。很多开发者在实现这个功能时往往只关注了“能用”而严重忽略了“安全”这就给攻击者留下了巨大的操作空间。“文件上传漏洞”的本质是应用程序未能对用户上传的文件进行充分、有效的安全校验导致攻击者能够上传恶意文件最常见的是Webshell并最终在服务器上执行任意代码。这绝不是危言耸听在OWASP Top 10榜单中与之相关的“注入”和“失效的访问控制”长期位居前列。本篇“上篇”我们将深入认识文件上传漏洞的庐山真面目剖析其巨大的危害性并初步探讨攻击者是如何利用这一漏洞的。理解攻击是为了更好的防御。无论你是刚入门的安全新手还是想巩固基础的从业者掌握文件上传漏洞的攻防都是你“百日筑基”路上必须夯实的关键一环。2. 核心认知文件上传漏洞究竟是什么要理解漏洞首先要理解正常流程。一个设计良好的文件上传功能其逻辑链条应该是清晰且严谨的。用户从客户端浏览器选择文件提交到服务器端服务器端接收文件后会进行一系列“安检”检查文件大小是否超限、文件类型是否允许、文件内容是否安全、文件名是否合规最后才会将文件存储到指定的目录并可能重命名最终将存储路径返回给用户。而文件上传漏洞就发生在这个“安检”环节的失效或疏漏上。攻击者通过构造特殊的HTTP请求欺骗或绕过服务器的安全检查机制成功将一个包含恶意代码的文件如.php,.jsp,.aspx等动态脚本文件上传到服务器可访问的目录。一旦这个文件被上传攻击者就可以通过浏览器直接访问该文件的URL从而触发其中恶意代码的执行获取对服务器的控制权。2.1 漏洞产生的根本原因漏洞的产生并非偶然它通常是多种因素叠加的结果前端校验形同虚设很多应用只在用户浏览器端JavaScript进行文件类型检查例如只允许选择.jpg,.png。然而攻击者完全可以禁用浏览器JS或通过Burp Suite等工具直接拦截修改HTTP请求包将文件扩展名改为.php从而轻松绕过。记住任何客户端校验都只能提升用户体验绝不能作为安全凭据。后端校验漏洞百出这是主战场。后端校验的常见问题包括仅检查Content-Type这个字段来自HTTP请求头例如image/jpeg同样可以被攻击者随意篡改。黑名单策略失效服务器禁止上传.php,.asp等扩展名。但攻击者可以尝试.php5,.phtml,.phps,.php7不同PHP版本配置可能解析甚至利用操作系统特性如Windows下的.php.末尾点、.php空格、.php::DATA等。未校验文件内容仅通过文件扩展名或MIME类型判断不检查文件的实际内容。攻击者可以将PHP代码嵌入到一个正常的图片文件末尾俗称“图片马”然后利用其他漏洞如文件包含漏洞来执行其中的代码。解析漏洞这是服务器或中间件自身的问题。例如古老的IIS 6.0目录解析漏洞/upload/test.asp;.jpg会被当作.asp执行、Nginx的畸形解析漏洞/upload/test.jpg/.php等。虽然老旧但在一些未及时更新的系统中仍可能存在。路径与文件名可控允许用户自定义上传文件的存储路径或文件名可能导致目录穿越../../../shell.php或覆盖关键系统文件。配置与权限不当上传目录有执行权限这是最致命的。Web服务器配置不当导致上传文件的目录如/uploads/同样具有执行脚本的权限。安全的做法是上传目录应严格设置为仅能读写不能执行。返回了完整的可访问路径上传成功后服务器将完整的URL路径如http://target.com/uploads/shell.php返回给客户端相当于给攻击者递上了一把现成的钥匙。2.2 漏洞的常见危害场景文件上传漏洞的危害绝不仅仅是“传个木马”那么简单它的影响是链式的、扩散的网站篡改与挂马攻击者上传一个Webshell后可以轻易修改网站首页插入赌博、色情等非法内容或恶意跳转代码俗称“挂马”。这直接损害企业形象导致用户流失。数据泄露与篡改通过Webshell攻击者能够读取、下载甚至篡改数据库内容。用户信息、交易记录、商业机密等敏感数据面临极大风险。服务器沦陷与内网渗透获得Webshell相当于在服务器上打开了一个命令执行窗口。攻击者可以以此为跳板利用服务器权限和网络位置进一步探测和攻击内网的其他系统实现“纵向穿透”。作为持久化后门即使网站源码修复了漏洞已上传的Webshell如果未被清理攻击者仍可随时访问形成持久化控制。发起进一步攻击攻击者可以在受控服务器上部署扫描器、爆破工具或将其作为DDoS攻击的傀儡机肉鸡发起对其他目标的攻击。实操心得在真实的渗透测试中文件上传漏洞常常不是一个孤立的点。它经常与信息泄露如通过源码泄露找到未授权上传点、目录遍历定位上传路径、逻辑漏洞绕过权限检查等结合形成组合拳。找到它往往就意味着测试取得了重大突破。3. 利用链条剖析从上传到GetShell的完整路径理解攻击者的利用链条能帮助我们更好地在防御中设置关卡。一次成功的利用通常包含以下几个环节3.1 信息收集与定位上传点攻击不会凭空开始。首先攻击者需要找到目标网站的上传功能入口。这可以通过人工浏览寻找“上传头像”、“提交附件”、“发布作品”等明显功能点。目录扫描使用工具如dirsearch,gobuster扫描/upload,/admin/upload,/file等常见路径。源码分析如果存在.git、.svn等源码泄露或通过其他途径获取到部分源码可以直接在代码中搜索move_uploaded_file、file_put_contents、multipart/form-data等关键词。JS文件分析查看前端JavaScript代码有时会暴露上传接口的API地址。3.2 绕过前端校验这是最简单的第一步。如果网站只依赖JavaScript校验打开浏览器开发者工具F12切换到“网络(Network)”选项卡勾选“保留日志(Preserve log)”。然后正常选择一张图片上传在请求发出前你会看到被拦截的请求。此时可以直接修改请求体中的文件名和内容或者更简单直接使用Burp Suite代理浏览器流量在Burp中修改filename参数和后缀名即可绕过。3.3 探测与绕过后端校验机制这是最核心、最体现技术含量的环节。攻击者会像侦探一样通过多次尝试和反馈推测服务器端使用了哪种校验方式并寻找其弱点。测试黑名单尝试上传一些非常规的后缀名进行探测。大小写绕过Php,pHp,PHP某些系统对大小写不敏感但黑名单可能只列出了小写php。特殊后缀php3,php4,php5,phtml,phps。点号空格绕过shell.php.Windows会自动去除末尾的点、shell.php末尾有空格。双写绕过如果过滤逻辑是删除字符串中的php那么shell.pphphp在删除php后可能变成shell.php。配合解析漏洞shell.php.jpg配合IIS6.0或某些错误配置的Nginx/PHP。测试白名单如果黑名单走不通说明可能是白名单只允许jpg, png, gif。这时思路需要转变%00截断在旧版本PHP中5.3.4且magic_quotes_gpcoff可以在文件名中注入空字符%00。例如上传路径参数可控时path/var/www/uploads/shell.php%00.jpg服务器在解析时%00会被当作字符串结束符最终保存的文件名将是shell.php。注意此方法在现代环境中已很少见但作为知识需要了解。结合文件包含漏洞这是“图片马”的经典场景。上传一个内容为?php phpinfo();?但文件名为shell.jpg的文件。然后寻找网站是否存在文件包含漏洞如index.php?fileuploads/shell.jpg通过包含这个“图片”其中的PHP代码就会被执行。竞争条件攻击有些系统会先允许文件上传到临时目录然后进行安全检查不通过再删除。攻击者可以同时发起两个请求一个快速上传Webshell另一个在安全检查完成前快速访问/执行这个Webshell打一个时间差。测试内容校验服务器可能检查文件头Magic Bytes。制作图片马在Linux下可以使用命令copy /b normal.jpg shell.php webshell.jpgWindows或cat normal.jpg shell.php webshell.jpgLinux将PHP代码附加到正常图片的末尾。图片可以正常显示但被包含时代码会执行。修改文件头在一个纯文本的PHP文件开头添加图片的文件头字节例如GIF的GIF89a。这可能会欺骗简单的文件头检查。3.4 上传后的利用与连接成功上传Webshell后攻击者需要知道文件的访问路径才能连接。路径可能通过响应包返回也可能需要结合目录遍历等漏洞进行猜测。常用的Webshell工具包括中国菜刀已老旧、蚁剑(AntSword)、冰蝎(Behinder)、哥斯拉(Godzilla)等。这些工具提供了图形化界面可以方便地进行文件管理、数据库操作、命令执行等。注意事项在渗透测试或合法授权的安全评估中上传Webshell后应避免进行任何破坏性操作如删除文件、篡改数据。你的目标是证明漏洞存在和危害而非造成实际损害。通常执行一个whoami、ipconfig或ls命令来证明代码执行权限即可。4. 实战环境搭建与基础绕过演示“纸上得来终觉浅绝知此事要躬行。”学习文件上传漏洞绝对不能停留在理论。我们需要一个安全的、隔离的环境来进行实验。这里我推荐使用Docker快速搭建DVWADamn Vulnerable Web Application或Upload-Labs这类专为学习Web漏洞设计的靶场。4.1 使用Docker搭建Upload-Labs靶场Upload-Labs是一个集成了各种文件上传漏洞场景的PHP靶场非常适合循序渐进地学习。使用Docker部署是最简单的方式。# 1. 拉取Upload-Labs的Docker镜像这里以一个流行的镜像为例 docker pull c0ny1/upload-labs # 2. 运行容器将容器的80端口映射到本地的8080端口 docker run -d -p 8080:80 --name upload-labs c0ny1/upload-labs # 3. 访问靶场 # 在浏览器中打开 http://localhost:8080如果拉取镜像较慢也可以直接下载源码部署到PHP环境中。部署成功后你会看到一个包含20个关卡的界面每一关都代表一种不同的服务器端校验机制。4.2 第一关前端JS绕过 - “障眼法”进入Upload-Labs第一关。页面是一个简单的上传表单。我们直接尝试上传一个.php文件会发现页面立刻弹出提示“请选择图片文件”甚至没有发生网络请求。这明显是前端JavaScript校验。绕过步骤打开浏览器开发者工具F12进入“网络(Network)”面板勾选“保留日志(Preserve log)”。选择你准备好的Webshell文件例如一个内容为?php phpinfo();?的shell.php。在点击“上传”按钮前在开发者工具的“网络”面板里你会看到即将发出的请求。右键点击这个请求选择“编辑并重发(Edit and Resend)”。或者更常用的方法是使用代理工具。这里我们使用更专业的Burp Suite配置浏览器代理指向Burp如127.0.0.1:8080。在Burp中开启拦截Intercept is on。在网页上先选择一个正常的图片文件如test.jpg点击上传。Burp会拦截到这个POST请求。在Burp的拦截界面找到请求体Body部分其中会有Content-Disposition: form-data; nameupload_file; filenametest.jpg。将filenametest.jpg修改为filenameshell.php。同时你需要将文件内容部分也替换成你PHP Webshell的原始代码。你可以将整个multipart/form-data中关于文件的部分替换为你的PHP文件内容。更简单的方法是在Burp的Proxy - Options中找到Match and Replace添加规则自动修改但首次学习建议手动在拦截界面修改体会过程。点击“Forward”放行请求。观察服务器响应如果返回了上传文件的路径如../upload/shell.php则绕过成功。访问该路径即可看到phpinfo页面。核心原理前端校验完全在用户浏览器中运行服务器收到的只是最终的HTTP请求包。攻击者通过代理工具直接构造和发送一个“合法”的恶意请求就完全绕过了前端的阻拦。这告诉我们安全逻辑必须放在服务器端。4.3 第二关Content-Type绕过 - “换件马甲”第二关通常禁用了前端JS但服务器端会检查HTTP请求头中的Content-Type字段。当你上传一个.php文件时其Content-Type通常是application/octet-stream或text/php服务器如果只允许image/jpeg,image/png,image/gif就会拒绝。绕过步骤使用Burp Suite拦截上传.php文件的正常请求。在请求头中找到Content-Type: application/octet-stream这一行。将其修改为Content-Type: image/jpeg。放行请求。如果服务器只做了这一项检查那么文件就会被成功上传。核心原理Content-Type是客户端告诉服务器“我发送的是什么类型数据”的声明但它极易被篡改。将其改为图片类型就是为了伪装成一张图片欺骗服务器的简单校验逻辑。防御方绝不能仅依赖此字段进行判断。4.4 第三关黑名单扩展名绕过 - “七十二变”从这一关开始挑战升级。服务器端采用了黑名单机制禁止上传.asp,.aspx,.php,.jsp等危险扩展名。我们的任务是找到不在黑名单上但依然能被服务器解析执行的扩展名。常见绕过手法大小写混合尝试Php,pHp,PHP。某些系统如Windows对文件名大小写不敏感Shell.PHP和shell.php是同一个文件。如果黑名单只写了小写php就能绕过。特殊后缀.php3,.php4,.php5,.php7这些是PHP不同版本或配置下的可执行扩展名。需要在服务器PHP配置中php.ini有对应的AddType或AddHandler指令。.phtml历史上也被当作PHP文件处理。.phps通常用于展示PHP源码但在某些配置下也可能被执行。操作系统特性Windows末尾点号shell.php.。Windows API在创建文件时会自动去除文件名末尾的点号最终文件名为shell.php。但Web服务器如IIS/APACHEPHP在解析时可能会将shell.php.整体作为文件名而扩展名.不被识别从而绕过基于扩展名的检查。需要具体测试。末尾空格shell.php有一个空格。原理类似点号。流特性shell.php::$DATA。这是Windows NTFS文件流特性::$DATA是默认数据流。在文件检查时部分代码可能只取$之前的部分shell.php进行校验而保存时完整的shell.php::$DATA会被Windows系统存为shell.php。此方法对代码处理逻辑要求苛刻成功率不高但需知晓。双写绕过如果过滤逻辑是查找并删除字符串中的php。那么上传文件名为shell.pphphp删除中间的php后剩下的部分拼起来正好是shell.php。实战操作 在Upload-Labs对应关卡我们可以使用Burp的Intruder模块进行批量测试。先拦截一个上传请求发送到Intruder。攻击位置将文件名filenametest.php中的扩展名部分php标记为载荷位置。载荷设置使用简单的列表载荷为[Php, pHp, PHP, php3, php5, phtml, php., php , php::$DATA]等。开始攻击观察哪个载荷的响应包长度或状态码与其他不同如返回了上传成功的路径则说明该扩展名可能绕过了检查。实操心得黑名单永远有漏网之鱼。它依赖于维护者对所有危险扩展名的认知是全面的而这几乎不可能。随着服务器软件、中间件、编程语言的更新新的可执行扩展名或解析方式可能出现。因此白名单机制只允许明确安全的类型在安全性上远胜于黑名单。5. 中级绕过技巧文件头、内容与条件竞争当简单的扩展名和MIME类型绕过失效后攻击者会转向更深入的检查层面。5.1 文件头Magic Bytes校验与绕过许多应用会检查文件内容的开头几个字节即魔数来判断文件真实类型这比检查扩展名更可靠。例如JPEG:FF D8 FF E0PNG:89 50 4E 47GIF:47 49 46 38如果服务器只允许上传图片并进行了文件头检查直接上传纯文本的PHP文件会被拦截。绕过方法制作图片马准备阶段准备一个正常的图片文件如normal.jpg和一个Webshell文件shell.php内容为?php eval($_POST[‘cmd’]);?。合成图片马Windows打开命令提示符使用copy命令的二进制合并功能。copy /b normal.jpg shell.php webshell.jpgLinux/Mac使用cat命令。cat normal.jpg shell.php webshell.jpg这样生成的webshell.jpg用图片查看器打开时显示的是正常图片因为图片查看器只读取前面部分但文件末尾附加了PHP代码。上传与利用直接上传webshell.jpg文件头检查会通过。但此时直接访问这个.jpg文件服务器会把它当作图片处理不会执行PHP代码。关键在于后续利用配合文件包含漏洞这是图片马最经典的利用场景。如果网站存在本地文件包含(LFI)漏洞例如index.php?file./uploads/webshell.jpg那么服务器在包含这个文件时会将其内容作为PHP代码解析从而执行末尾的木马。配合解析漏洞某些特定服务器配置错误如Apache的AddType误配、Nginx的畸形解析可能导致.jpg文件被当作PHP执行但这种情况较少。防御方视角仅检查文件头也是不够的因为攻击者可以伪造。更安全的方式是使用服务器端语言的图像处理库如PHP的GD库或ImageMagick对上传的图片进行重绘re-render。即打开图片再重新保存成一个新图片。这个过程会剥离所有非图像数据包括我们附加的PHP代码从根本上杜绝图片马。5.2 条件竞争攻击Race Condition这是一种利用“检查-使用”时间窗口TOCTOU漏洞的攻击手法。逻辑如下服务器收到上传文件后先将其保存到一个临时位置。然后对临时文件进行安全检查病毒扫描、内容校验等。检查通过后才将文件移动到最终的公开访问目录。如果检查不通过则删除临时文件。问题在于第2步检查和第3步移动不是原子操作中间存在一个微小的时间差。攻击者可以利用这个时间差在文件被删除前访问并执行它。攻击模拟概念性步骤编写一个特殊的Webshell其代码逻辑是一旦被访问就立即将自己复制一份到另一个安全、持久的目录。例如?php if (isset($_GET[‘run’])) { file_put_contents(‘/var/www/html/persistent_shell.php’, ‘?php eval($_POST[“cmd”]);?’); echo “Done!”; } ?编写一个自动化脚本同时做两件事线程A上传线程持续快速地向目标上传点发送这个Webshell文件。线程B访问线程持续快速地去访问可能存在的临时文件URL这个URL可能需要猜测或通过错误信息泄露。由于服务器并发处理可能会出现一种情况线程A上传的文件刚刚被保存到临时目录例如/tmp/upload_xxxxxx线程B就立刻访问了http://target.com/tmp/upload_xxxxxx?run1。此时安全检查可能还未完成或刚完成文件被执行在持久化目录生成了新的Webshell。之后即使临时文件被删除攻击者仍可通过持久化Webshell控制服务器。防御方法先检查后保存在文件内容完全接收进内存或缓冲区后先进行所有安全检查只有全部通过才将其写入最终目录。避免使用“先存临时位置”的模式。使用不可预测的临时文件名让攻击者难以猜测临时文件的访问路径。最终目录无执行权限这是根本即使文件被误传也无法执行。5.3 二次渲染与内容校验绕过这是针对“重绘”防御的高级绕过。有些应用在上传图片后会用图像库重新生成一张新图。简单的图片马在文件末尾附加代码会被清洗掉。但攻击可以更进一步将代码嵌入到图片的元数据如EXIF信息中或者更复杂地利用图像渲染库本身的漏洞。例如曾经著名的ImageMagick漏洞CVE-2016-3714 Ghost但命令注入攻击者可以构造一个特殊的图片文件当服务器使用有漏洞的ImageMagick版本进行处理时会触发远程代码执行。这已经超出了普通文件上传的范畴属于供应链攻击。对于普通的内容校验如检查文件中是否包含?php等标签可以通过编码、混淆来绕过使用短标签?。使用script language”php”echo ‘test’;/script在特定PHP版本中有效。利用PHP的动态函数执行$a ‘assert’; $a($_POST[‘cmd’]);。使用Base64等方式编码eval(base64_decode(‘…’));。防御方对策内容校验可以作为一道辅助防线但不能作为唯一依赖。最有效的还是白名单重绘无执行权限的组合拳。6. 靶场实战DVWA文件上传漏洞全难度解析DVWADamn Vulnerable Web Application是另一个经典的漏洞练习平台其文件上传模块设置了从低到高四个安全等级非常适合系统性地学习绕过技巧。6.1 Low难度毫无防护场景服务器端几乎没有任何校验。绕过直接上传.php文件即可成功。这展示了最原始的危险状态。核心教训没有校验的文件上传功能是极度危险的。6.2 Medium难度初级黑名单与MIME类型校验场景代码中有一个黑名单[‘.php’, ‘.php4’, ‘.php5’, ‘.phtml’]并且检查$_FILES[‘uploaded’][‘type’]是否属于[‘image/jpeg’, ‘image/png’]。绕过分析MIME类型绕过使用Burp将Content-Type改为image/jpeg。黑名单绕过黑名单里没有.php3也没有考虑大小写。因此上传一个名为shell.php3或shell.PHP的文件并修改MIME类型即可绕过。防御缺陷黑名单不全面且依赖可被篡改的客户端信息。6.3 High难度进阶黑名单与文件头校验场景黑名单更加全面几乎包含了所有常见的可执行扩展名。同时使用getimagesize()函数检查文件头判断是否为真实图片。绕过方法这正是“图片马文件包含”的经典场景。制作一个包含Webshell代码的图片马shell.jpg。在DVWA High难度下上传该文件getimagesize()会成功读取图片信息校验通过。单独访问shell.jpg不会执行代码。此时需要利用DVWA另一个模块——“文件包含(File Inclusion)”漏洞。进入文件包含模块难度也需设为High或以下构造URLhttp://dvwa/vulnerabilities/fi/?pagefile:///var/www/html/hackable/uploads/shell.jpg路径需根据实际情况调整。通过文件包含漏洞服务器会将shell.jpg的内容包含进来并作为PHP代码解析从而执行其中的Webshell。核心原理将文件上传漏洞与文件包含漏洞结合形成攻击链。防御时需要堵住所有可能的入口点。6.4 Impossible难度近乎完美的防御Impossible级别的代码展示了最佳实践白名单校验只允许.jpg,.jpeg,.png扩展名。文件头校验使用getimagesize()确保是真实图片。重绘图片使用imagecreatefromjpeg()/imagecreatefrompng()和imagejpeg()/imagepng()函数将上传的图片数据重新生成一张全新的图片。这个过程会彻底剥离所有非像素数据。随机重命名使用md5(uniqid())等方式生成随机文件名防止被猜测或覆盖。数据库记录将文件信息存储在数据库中而非直接暴露路径。在这个级别下传统的绕过方法几乎全部失效。攻击者除非能发现图像处理库本身的0day漏洞否则无法通过文件上传功能攻破系统。7. 常见问题排查与防御措施梳理在渗透测试中你可能会遇到各种奇怪的情况。以下是一些常见问题的排查思路Q文件上传成功了但访问返回404或403A首先确认完整路径。可能是路径拼接错误或者文件被重命名了查看响应包。其次检查上传目录的权限。403错误通常表示目录有读取权限但无执行权限这是安全的配置你需要结合其他漏洞如文件包含来利用。404则可能是路径不对或文件被安全软件即时删除。Q上传时总是返回“文件类型不正确”但已经尝试修改了扩展名和Content-TypeA服务器可能在做更严格的检查。尝试制作图片马并确保文件头正确。使用file命令Linux或十六进制编辑器检查文件头。也可能是服务器端使用了更复杂的库进行文件类型检测需要更精细的绕过。Q如何判断服务器是黑名单还是白名单A通过错误信息反馈。上传一个.php文件被拒再上传一个.txt文件也被拒可能是白名单只允许图片。如果.txt成功了而.php失败很可能是黑名单。上传一些模糊的后缀如.php7,.phtml观察反应可以帮助你摸清名单范围。Q上传的Webshell被安全软件或WAF拦截了怎么办A尝试对Webshell代码进行混淆、编码、拆分。使用动态调用、字符串拼接、加密函数等方式隐藏关键特征。例如不使用eval($_POST[‘cmd’])而使用$a$_GET[‘a’]; $b$_GET[‘b’]; $a($b);。也可以研究特定WAF的绕过技巧但这属于更高级的主题。针对开发与运维人员的修复建议防御视角使用白名单严格定义允许上传的文件扩展名如.jpg,.png,.pdf并统一转换为小写进行比较。校验文件内容使用可靠的文件头检查并结合服务器端语言的文件信息函数如PHP的finfo_file(FILEINFO_MIME_TYPE)进行双重验证。重命名文件使用随机算法如UUID、时间戳随机数对上传文件进行重命名避免使用用户提供的原始文件名防止目录遍历和覆盖攻击。设置安全目录将上传目录设置为Web根目录之外的非可执行路径。如果必须在Web目录下则通过配置如Apache的.htaccess Nginx的location规则禁止该目录执行脚本。设置正确的文件权限如644。限制文件大小在服务器端限制上传文件的大小防止拒绝服务攻击。对图片进行重绘对于图片文件使用图形库重新采样、保存彻底清除嵌入的恶意代码。使用安全扫描对上传的文件进行病毒/恶意代码扫描。记录与监控详细记录上传日志IP、时间、文件名、哈希等并对上传目录的文件变化进行监控。定期更新与审计保持服务器、中间件、编程语言及所有库的最新版本定期进行安全代码审计。文件上传漏洞的攻防是一场持续的动态博弈。作为防御者需要建立起纵深、立体的防御体系而不仅仅是依靠一两个过滤函数。作为渗透测试者则需要拥有发散性的思维和组合利用多种漏洞的能力。在下篇中我们将深入探讨更多高级的绕过技术、WAF对抗技巧以及在实际复杂场景中的综合利用思路。