从一次失败的Getshell到成功的XSS:我的文件上传漏洞挖掘复盘笔记 从受限上传到XSS突破一次文件上传漏洞的迂回战术那天下午的阳光透过百叶窗斜斜地打在显示器上我正百无聊赖地测试一个私人项目的协助请求功能。这个看似普通的表单里藏着一个附件上传点——正是这个不起眼的功能后来让我经历了一次从挫败到惊喜的漏洞挖掘之旅。1. 初探上传点严格的白名单防御第一次接触这个上传功能时我像往常一样先上传了正常的图片文件。服务器返回的响应引起了我的注意{ result: true, message: /UploadFiles/user123/2023/3021d74f18ddasdasd50abe934f.png, code: 0 }关键发现是上传的文件被存放在同源域名下。这意味着如果我能上传恶意文件其危害程度将大大增加。接下来是常规的模糊测试尝试上传.html文件 → 返回不支持该文件类型测试.php、.asp等常见危险扩展 → 同样被拦截使用Burp Intruder进行扩展名爆破 → 触发速率限制经过多次尝试确认了服务器的防御策略白名单机制仅允许jpg、jpeg、png、gif四种扩展名文件重命名上传后自动生成随机文件名基础过滤拒绝包含特殊字符的文件名2. 发现突破口异常扩展名的玄机就在准备放弃Getshell尝试时一个偶然的发现改变了整个方向。我注意到服务器对扩展名的处理有个有趣特性badfile.gif→ 上传成功badfile.foogif→ 上传失败这说明服务器可能只检查最后一个点号后的扩展名且允许扩展名中包含引号等特殊字符。于是构造了如下测试文件-----------------------------6683303835495 Content-Disposition: form-data; nameupload; filenamexss.gif Content-Type: image/png GIF89a htmlscriptalert(XSS);/script/html -----------------------------6683303835495--服务器竟然接受了这个文件虽然它有着.gif扩展名但内容却是HTML代码。更关键的是当用Edge浏览器访问时弹窗出现了——存储型XSS漏洞就这样被触发了。3. 技术原理深度解析3.1 服务器端的校验逻辑通过反复测试我绘制了服务器的校验流程检查项实现方式可绕过性扩展名校验白名单匹配最后一个点号后的后缀中允许特殊字符文件头校验检查前4-8字节是否符合图片格式高可伪造内容扫描无深度内容检测高关键突破点在于伪造合法的图片文件头如GIF89a利用异常扩展名含特殊字符依赖浏览器特性实现最终利用3.2 浏览器MIME嗅探差异不同浏览器对这类文件的处理方式截然不同Chrome/Firefox严格检查完整文件头对异常内容进行预处理不会执行混在图片中的JS代码Edge/IE存在MIME嗅探漏洞根据内容而非声明类型解析文件当检测到HTML标签时会以text/html方式渲染// 典型利用代码结构 GIF89a html script // 可插入更复杂的攻击载荷 alert(document.cookie); /script /html4. 扩展攻击面更多可能的利用方式除了已发现的技巧这类上传漏洞还有多种可能的利用姿势4.1 非常规扩展名利用空格插入如exploit.j pg多重扩展如exploit.png.html特殊编码如exploit.%70%68%70注意这些方法需要根据具体服务器的解析逻辑进行调整不是所有环境都适用4.2 SVG文件的XSS潜力如果服务器允许上传SVG图像可以直接构造svg xmlnshttp://www.w3.org/2000/svg onloadalert(document.domain)/SVG的XSS优势被当作合法图像格式支持完整的JavaScript执行在所有现代浏览器中都有效4.3 结合其他漏洞提升危害CSP绕过如果站点有宽松的CSP策略DOM型XSS配合客户端漏洞实现组合攻击权限提升结合CSRF等漏洞扩大影响范围5. 防御方案与实战建议5.1 开发者防护措施防护层具体措施有效性输入验证严格限制允许的字符集★★★★☆文件校验检查完整文件内容而不仅是头部★★★★★存储隔离将上传文件存放在不同域名下★★★☆☆输出编码对所有动态内容进行适当编码★★★★☆5.2 渗透测试者的方法论永不放弃当主要攻击路径受阻时寻找旁路全面记录详细记录每次测试的请求和响应环境认知了解各种浏览器和服务器特性的差异工具组合善用Burp、FuzzDB等工具提高效率这次经历让我深刻体会到漏洞挖掘往往不是直线前进的过程。那个下午看似失败的Getshell尝试最终却因为对细节的观察和对浏览器特性的了解演变成了一次成功的XSS发现。在安全测试中灵活变通的思维和坚持不懈的态度有时比掌握某个具体的技术点更为重要。