加载中...
<cover></cover>

# 一次任意文件上传漏洞的实战经历

2020-02-29 杂文

本文最后更新于 天前，文中部分描述可能已经过时。

这一切都要从一只蝙蝠说起…

最近看到了一个站，是某高中的在线英语人机对话练习平台，目测了一下网站应该是外包的，因为首页上还有客服的 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

一次任意文件上传漏洞的实战经历
https://blog.hans362.cn/post/arbitary-file-upload-vulnerabilty/
本文作者
Hans362
最后更新
2020-02-29
许可协议
CC BY-NC-SA 4.0
转载或引用本文时请遵守许可协议，注明出处、不得用于商业用途！
喜欢这篇文章吗？考虑支持一下作者吧～
爱发电 支付宝