一、什么是文件上传?
将客户端数据以文件形式封装,通过网络协议发送到服务器端,在服务器端解析数据,最终在服务端硬盘上作为真实的文件保存。
二、为什么会产生文件上传漏洞?
因为程序没有对用户提交的数据进行校验或过滤不严,导致用户可以提交修改过的数据。
一般一个文件上传过程中的检测有:客户端javascript检测(检测文件扩展名)、服务端MIME类型检测(检测content-type内容)、服务端目录路径检测(检测path参数相关的内容)、服务端文件内容检测(检测内容是否合法或含有恶意代码)等。
三、漏洞危害
恶意文件传递给解析器去执行,然后就可以在服务器上执行恶意代码,进行数据库执行、服务器文件管理、命令执行等恶意操作。
四、绕过客户端的检测
- 原理:通常在上传页面里含有专门检测文件上传的javascript代码,最常见的就是检测文件类型和扩展名是否合法。
- 方法:在本地浏览器客户端禁用js;可使用火狐浏览器的Noscript插件、IE中禁用JS等方式实现。
五、绕过服务端检测
服务端的代码常检测request包中的三个点:MIME类型、文件后缀、文件内容。
- 绕过MIME类型检测
原理:检测图片类型文件上传过程中http包的Content-type字段的值,来判断上传文件是否合法。
绕过方法:用burpsuite截取并修改数据包中文件的content-type类型。
六、绕过黑名单检测
黑名单策略:文件扩展名在黑名单中为不合法,一般有个专门的blacklist文件,里面会包含常见的危险脚本文件。
绕过方法:
- 后缀大小写绕过:在对后缀的判断中,如果只是对字符串进行单独的比较来判断是不是限制文件,可以采用后缀名大小写绕过形式。
- 空格绕过:如果黑名单没有对后缀名进行去空处理,可以通过在后缀名后加空格进行绕过。
- 双写绕过:如果黑名单是将问题后缀名替换为空,可以利用双写绕过。
七、绕过白名单检测
绕过方法:服务端判断文件类型是从后往前,而对文件解析是从前往后,可以利用00截断的方式进行绕过,包括%00截断与0x00截断。
Q:什么是%00截断和0x00截断呢?
A:0x00截断:系统在对文件名进行读取时,如果遇到0x00,就会认为读取已经结束。但要注意是文件的十六进制内容里的00,而 不是文件名中的00。
%00截断:url发送到服务器后被服务器解码,这时还没有传到验证函数,也就是说验证函数里接收到的不是%00字符,而是%00解码后的内容,即解码成了0x00。
八、绕过文件内容检测
文件头检验原理:判断文件头内容是否符合要求。
常见的文件头对应关系:
- .jpeg、.jpg:JPGGraphic File
- .gif:GIF89A
- .zip:Zip Compressed
绕过文件头检查:突破getimagesize()函数。图像文件相关信息常用检测函数,用以获取文件类型,绕过只需要把文件头部分伪造好。