从 0 到 1:文件上传漏洞的校验、绕过与真实场景利用

张开发
2026/4/18 2:35:50 15 分钟阅读

分享文章

从 0 到 1:文件上传漏洞的校验、绕过与真实场景利用
本文系作者在网络安全渗透测试领域的学习与实践总结仅作为技术参考资料文中观点难免存在局限恳请读者批评指正。漏洞测试须在合法授权环境进行可使用自己搭建的靶场或获书面授权的目标系统否则将担法律责任。阅读文章请遵守本文《法律与责任声明》常规文件上传文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题对于如何确保这类安全问题一般会从原生态功能中的文件内容文件后缀文件类型等方面判断但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题也会在语言版本语言函数中间件引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑不同的文件存储方案也会给攻击者带来不一样的挑战1、无限制任意上传什么文件都能上传2、有限制限制后缀格式判断后缀名黑白名单MIME类型文件头等3、测试环境安装参考此处我们使用靶场项目地址:https://github.com/sqlsec/upload-labs-docker此处我把它搭在了云服务器也可以在本地用继承集成软件搭建1、前端JS假如说网站是php或者java的网站一般是不会让直接上传php或者jsp文件的如何判断是否是前端js验证呢首先抓包监听如果上传文件的时候还没有抓取到数据包但是浏览器就提示文件类型不正确的话那么这个多半就是前端校验了确实是前端js验证或者我们可以通过看前端源码可以看到有一个点击事件然后看这个事件的代码做了校验如果不设置前端校验直接上传php文件就直接控制了这里很明显不让上传并且校验代码写在了前端而不是后端校验这种我们可以直接绕过有几种绕过方式一种是抓包绕过还有就是本地写一个表单提交绕过先把源代码扒下来我们把这个点击事件剪掉或者删掉或者直接把下面的script代码改掉或者删掉然后此处由于我们在网页中action空白就表示本地此处我们就需要写上目标地址最后生成html文件上传成功还有抓包绕过我们先上传一个图片然后进行抓包我们可以看到上传了这个照片然后我们此处就可以将文件后缀改成php然后并在图片内容中加入一些脚本2、.htaccesshtaccess 文件是 Apache 服务器中的一个配置文件它负责相关目录下的网页配置。通过 htaccess 文件可以帮我们实现网页301重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能这个是只有apache中间件才会用的一个文件我们此处先上传那个后面代码的文件我们把它修改为png格式上传然后找到图片连接此处没用显示什么是错误的然后我们创建一个htaccess文件这个的大概意思就是将解析格式改为php格式上传这个htaccess文件后再次访问刚刚上传的png图片3、MIME类型MIME 类型是网络传输中用来标识文件格式的「格式标签」它告诉浏览器、服务器等程序当前传输的文件是什么类型如图片、视频、网页、文档等让程序能正确解析、打开和处理文件是 HTTP 协议、邮件传输中必不可少的文件格式标识标准。当我们上传一个png格式就会发现有一个Content-Typeimage/png当我们上传php格式这就是MIME类型的作用其实有时候并不是文件后缀影响而是这个MIME类型的影响我们可以将这个MIME类型改为Content-Typeimage/png而文件后缀并不修改4、文件头判断我们可以看一下其实每个不同类型的图片开头有一点都是一样的比如png再看jpg其它都是同理我们可以根据头部信息来识别图片格式在代码中也会这样检测这样我们就可以通过伪造比如上传的是php文件但把头部改成png头部5、黑名单-过滤不严正常上传可以看到被过滤我们此处根据源码是通过匹配过滤的那我们就构造phphp当中间的php过滤后留下的正好又形成php6、黑名单-过滤不严系统大小写敏感属性换一些大小写替换后缀名编码等等10、逻辑不严-条件竞争这个条件竞争就是代码逻辑问题文件先上传然后才验证此时我们就上传不断发包然后不断的请求不断发包就会有触发恶意文件的可能12、代码审计-数组绕过可以控制文件上传时的文件名成功上传这是因为解析问题导致此处1.php/.xxxx.jpg其实就是等于了1.php所以这个漏洞触发条件就是可以对文件进行重命名应用场景1、注册用户上传地方2、JS或API接口的代码3、后台或其他管理页面4、源码泄露或盲测文件5、三方编辑器上传漏洞6、特定的源码审计漏洞不只是这里写的这个还有很多很多思维一定要打开演示我们主要讲的是肉眼看不到的几个JS或API接口代码表面上不知道但其实他可能执行了某文件上传比如这个页面我们并不能够从页面中发现比如文件上传的功能但其实就是加载了文件上传js文件此处是因为为了看到清楚才将文件名改为file_upload实战中可不是直接显示出来的明显的上传然后我们可以根据这个代码逻辑写一个上传表单页面这个id要和目标的接收值相同还有这个下面的其它三个值也都对应上地址(js代码)也改好,如果不写这个js代码我们点击上传后就会光访问不执行需要的功能记得ctrls保存注意我们需要搭到服务器中不然他会自动默认访问本地文件然后我们去站点看成功上传此处我们只是演示所以没有做过滤实战中此处可能会有过滤就需要进行绕过我们再看一个案例然后看数据包有很多js文件其实有的文件是登陆后才能看到但此处js泄露了然后我们如何查到upload相关js可以使用搜索里面就会发现很多相关上传的代码我们就可以参考代码进行伪造我们也可以直接访问看看当然有的网站也会做一些安全防护需要在地址或者什么地方加入某值才能可以三方编辑器上传漏洞这个意思就是可能是使用的编辑器出现了漏洞我放到一个文件夹里面此时我们就可以在文件上传时或者是其它也可以尝试进行抓包然后这个编辑器它并不是说后门漏洞是一个xss漏洞我们只是说类似这样思路比如只需要把action改为uploadfile,filename的后缀改为xml然后右侧返回了内容{state:SUCCESS, url:xxxxx/php/upload/file/20260417/1776389421721771.xml, title:1776389421721771.xml, original:null-2a016d1d1140bda0.xml, type:.xml, size:48198}state:SUCCESS文件上传成功了url服务器给你返回了上传后的文件路径你可以通过这个路径直接访问文件。original你上传的原始文件名type服务器识别到的文件后缀是.xmlsize文件大小这个操作的本质是什么漏洞原理一个典型的文件上传漏洞核心逻辑是服务器的上传接口只做了前端 / Content-Type 校验或者只校验了文件内容却没严格校验文件后缀。你抓包修改了文件名后缀为.xml但保留了图片类型的Content-Type服务器没拦住你成功把 XML 文件上传到了服务器上。响应里给你的url就是这个 XML 文件在服务器上的访问地址你可以直接用浏览器打开它。很多上传功能会限制只能上传.jpg/.png等图片格式你改成.xml就是为了绕过服务器的后缀黑名单 / 白名单限制把非图片文件传上去。此处由于无法绕过不能够直接上传php文件是通过文件上传来造成xss实战遇到的情况1、执行权限文件上传后存储目录不给执行权限我们此处上传一个php文件没问题然后我们访问也没有问题但假设此处网站管理员限制了上传的文件目录权限不给读写执行权限然后再次访问我们上传的文件时报错没用权限的原因2、解码还原上传一个图片正常是显示路径和文件名而此处我们在我们搭好的靶场中上传表面上看着正常而此处我们上传后再查看图片链接会显示一堆乱码的东西这就是对这个图片进行编码其实url显示的这堆内容解码后就是图片的核心内容正常我们数据是做存储而选择是编码并告诉浏览器编码方式当我们访问时浏览器就会以那种编码方式来解析加载图片,文件并不在服务器存储解析固定文件后缀名无关文件上传后利用编码传输解码还原可以从源代码中看到就是先编码当我们访问会告知浏览器以某种形式解密数据然渲染显示文件没在服务器存储此时我们即使上传了后门也是无法解析执行无法直接绕过3、分站存储upload.xxxxx.com 上传但存储在images.xxxxx2.com主页上传我文件后访问执行的是另一个域名/ip/服务器下的某个地方绕过就需要看这个上传后的这个网站的策略4、OSS对象类似分站存储但细节里面不同就是搞好上传文件后链接阿里云的oss存储当我们上传后就会直接上传到阿里云的oss就算是php文件可上传但我们访问时由于阿里云安全设置也只能够下载。本篇完 | 实践出真知交流共进步每一篇文章都是一次沉淀感谢你的阅读。技术没有捷径唯有不断积累、不断输出。期待下次继续与你分享更多实战经验一起前行。《法律与责任声明》本内容仅用于网络安全漏洞的技术研究、学习与交流。一、合法性要求严格遵守《中华人民共和国网络安全法》及相关法律法规严禁将所学技术用于非法活动如未经授权的攻击、窃取信息等。例如不得对未授权的真实生产环境网站做漏洞测试。漏洞测试须在合法授权环境进行可使用自己搭建的靶场或获书面授权的目标系统否则将担法律责任。二、风险与责任若因参考本内容对第三方造成损失本人不承担法律责任使用者自行担责。三、传播限制禁止将本内容用于恶意传播如制作恶意教程、培训非法黑客组织应维护良好网络安全环境。发现有人利用本内容非法活动应及时举报。四、版权声明本文为本人独立创作有完整知识产权。未经书面许可任何单位或个人不得转载、复制或以其他方式使用违者依法追责。阅读并使用本文章内容即表示同意声明条款

更多文章