一次任意文件上传漏洞的实战经历
本文最后更新于 天前,文中部分描述可能已经过时。
这一切都要从一只蝙蝠说起…
最近看到了一个站,是某高中的在线英语人机对话练习平台,目测了一下网站应该是外包的,因为首页上还有客服的 QQ 和定制的联系方式…
像这种看上去粗制滥造的小网站肯定一挖一堆洞…果然1小时后搞定
声明:本文作者没有利用该漏洞做出任何恶意或违法行为,也未触及任何数据,本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担
文件上传漏洞是个啥?
正如这个漏洞的名称一样,攻击者利用网站本身的文件上传功能(比如图片上传、文档上传、头像上传等)上传可执行的脚本文件并被解释器正常解释,从而实现恶意代码的运行。
但是事情并没有你想的那么简单,因为几乎所有网站对上传文件的 MIME 类型或后缀名都有限制。换句话说,如果是上传图片的区域,一般不太可能让你正常地成功上传一个 Word 文档。
问题就在一些网站的文件上传功能虽做出了相应的限制,却不够严格、只是浮于表面。这就导致攻击者可以借助一些手段上传任意文件,并能够将这些文件传递给相应的解释器,就可以在网站服务器上执行任意脚本。
实战经历
首先显而易见这是个 ASP 站,随手搞一个404出来发现是 IIS 7.5
直接访问网站会自动跳转到 login.asp 页面,应该是平台的登录页面(忽略那个 Flash 提示
习惯性地把 login.asp 改成 index.asp 发现并没有强制跳回,而是出现了如下页面:
无意中点击右边的设置按钮就发现了一个上传背景图片的按钮…
至此,就已经找到了突破口
之后我先尝试强行丢了一个 ASP 脚本上去,提示文件类型不匹配,上传失败
于是打开 F12 开发者视图,在网络选项卡内发现了 upload.js,里面有相关的限制文件类型的代码
这么看来,应该是这部分代码阻止了 ASP 文件的上传,只要后端没有二次校验,劫持掉 upload.js 应该就没问题了
于是我复制了一份 upload.js,做出如下修改:
然后打开 Disable cache 并启动 Fiddler 开始抓包,强制将 upload.js 重定向到本地修改过的 upload.js
再次 F12 发现修改后的代码已经被加载,试着传了个 ASP 上去,成功~
这样就搞定了…
只要再传个一句话木马上去,就可以拿到 WebShell 啦(当然考虑到违法的问题我没有这样做
那么怎么修好它呢?
其实也非常的简单~
漏洞的实现无非就是限制不够严格,前端虽然对文件类型做了限制但是可以被轻易劫持,后端则没有任何的二次校验,就会导致这个问题。
后端的上传接口应做好过滤,只接受特定类型的文件,并且要考虑到方方面面的限制(要知道还有00截断这种骚操作),必要时可以采取对文件随机改名、将图片文件写入一个新的图片文件之类的措施。
毕竟你永远也不知道用户究竟会如何使用你的网站,稍不留神你的网站可能就成为了用户的图床2333333
评论