文件上传漏洞
1. 定义
文件上传漏洞是由于程序未对上传的恶意文件进行检测和过滤所导致的漏洞, 攻击者可以向服务器上传动态可执行脚本, 包括: 木马,病毒,恶意脚本或者WebShell等。这种攻击是最有效和直接的, 文件上传功能本身没有问题, 重点是上传的是什么文件, 上传后服务器怎么处理这些文件。
2. 中间件
什么是中间件, 中间件的作用是提供系统和软件之间连接,以便于软件各部件之间的"交流"。通俗的来说, 就是一些高级服务器框架, 比如: IIS, Apache, Nginx等。 有些中间件本身就存在漏洞(自己开发逻辑原因等), 导致被利用。
进一步引申出 解析漏洞, 具体请往下看。
3. 原理
一些web网站允许上传图片、文本或者其他资源到指定的位置。
文件上传漏洞就是利用网页代码中的文件上传路径变量过滤不严将可执行的文件上传到一个到服务器中,再通过URL去访问以执行恶意代码。
容易出现文件上传漏洞的地方:
1. 有上传功能的地方 (如上传头像、附件等)
2. 能够访问到系统文件或者上传文件的地方 (攻击者通过修改dir参数从而遍历整个系统目录!)
4. 危害
- 网站被控制,对文件增删改查,执行命令,连接数据库
- 如果服务器长久未更新,可以利用exp提权,导致服务器沦陷
- 同服务器的其他网站沦陷
5. 引发原因
- 服务器配置不当(iis6.0 put 直接写文件)
- 本地文件上传限制被绕过(javascript验证)
- 服务端过滤不严格被绕过
- 文件路径截断 (0x00)
- 文件解析漏洞导致文件执行 (iis,apache,nginx)
- 开源编辑器上传漏洞(fckeditor 自定义文件名,文件夹结合iis6.0解析漏洞,ewebeditor :可以登录后台,配置允许上传的文件类型.asp)
6. 检测与绕过
1) 前端拦截
定义: 网页上写一段Javascript脚本,校验上传文件的后缀名,有白名单(规定的类型)形式和黑名单(排除的类型)形式。
绕过:
- 在网页源码中改变函数调用的逻辑, 或者直接禁用js实现绕过
- 通过抓包改成允许上传的文件类型, 实现绕过
附上MIME类型:
audio/mpeg -> .mp3 application/msword -> .doc application/octet-stream -> .exe application/pdf -> .pdf application/x-javascript -> .js application/x-rar -> .rar application/zip -> .zip image/gif -> .gif image/jpeg -> .jpg / .jpeg image/png -> .png text/plain -> .txt text/html -> .html video/mp4 -> .mp4
2) 漏洞解析
具体参考: 典型漏洞归纳之解析漏洞。
3) 畸形文件
定义: 又可以理解为文件拓展名检测, 表现为专门检测文件的后缀名是否包含指定黑名单或者白名单, 然后进行相应的处理
绕过:
- 大小写绕过
- 不存在名单的可执行文件类型绕过
- 构造文件名绕过 (如检测脚本是消除黑名单文件名, 则可以构造)
- ....(待补充)
4) 截断上传
截断上次实质上是属于文件拓展名的检测, 下面阐述原理
截断的核心是: %00 (url解码后, 解码前是乱码的汉字).
常用的还有: \0, ?
它表示字符不为空(NULL), 不等价于空字符(""), 更不是空格( )
当程序输出到含有%00的地方时候, 后面的数据会被停止读取, 可以理解为一个结束符, 后面的数据直接被忽略(可以理解被注释掉了), 这就导致了漏洞的产生。
比如, 网址过滤掉了php的后缀名, 但允许上传图片类型的文件, 这时候攻击者会构造: ***.php%00.png, 检测函数会检测到是图片类型, 但是文件经过服务器处理之后就变成了: ***.php, 后面的完全被截断了!
5) .htaccess
文件攻击
.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法, 即在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
格式为:
<FileMatch "cimer">
SetHandler application/x-httpd-php
</FilesMatch>
通过.htaccess文件, 通过php解析器解析一个文件名的时候, 只要文件名包含cimer即可。如果这个cimer的内容是一个木马, 就....
7. 防御
- 上传的目录不给权限(执行权限等), 防止webshell攻击
- 文件扩展名采用白名单校验
- 上次文件进行重命名
- 隐藏上次文件路径
- 及时更新web应用软件(中间件), 避免解析漏洞
参考: