(1)文件上传原理
文件上传是指由于程序员未对上传的文件进行严格的验证和过滤,而导致用户可以越过其本身权限向服务器上传可执行的动态脚本文件。
(2)分类
1)任意文件上传
直接获取文件名,把上传的临时文件移动到hackable/uploads目录下。上传后,网页会返回路径,访问url即可getshell。
2)前端js检测后缀名代码分析
客户端html上传文件时调用checkFile函数,首先获取文件后缀名。如果文件未空,弹出“请选择要上传的文件”;如果不为空,且获取上传的文件后缀名 .jpg、.png、.gif,提示不允许上传。
3)分析content-type漏洞代码
首先进行submit提交判断,再检测文件类型,若是image/jpeg或者image/png即允许上传
4)黑名单代码分析
首先是检测submit是否有值,获取文件的后缀名,进行黑名单对比,后缀名不在黑名单内,允许上传。
5)双写漏洞分析
同样是黑名单过滤,str_ireplace对上传的后缀名是黑名单内的字符串转换为空。
6)上传参数目录可控代码分析
代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET['save_path']服务器接收客户端的值,这个值可以被客户端修改,留下安全问题。
7)文件头检测上传代码分析
上传的文件符合数字即可通过检验
8)图片检测函数绕过上传
getimagesize是获取图片的大小,如果头文件不是图片会报错直接可以使用图片马绕过检测
9)图片二次渲染分析代码
只允许上传JPG、PNG、gif格式的文件,源码中使用imagecreatefromgif函数对图片进行二次生成,生成的图片保存至upload目录下。
10)文件上传条件竞争源码分析
采用白名单上传,$upload_file = UPLOAD_PATH .'/' . $file_name;设置上传路径,后缀名没有限定为图片格式,接着 move_uploaded_file($temp_file,$upload_file),将图片移动到指定的目录,使用rename重命为图片类型。在重名之前如果被浏览器访问,可以得到一个webshell。
11)文件名控代码分析
采用黑名单限制上传文件,但是$_POST['save_name']文件是可控的,可被客户端任意修改,造成安全漏洞。
12)数组绕过代码分析
首先检测文件类型,看到可控参数save_name 如果不是数组,如果后缀名不是图片禁止上传。
如果是数组绕过图片类型检测,接着处理数组。