不安全的文件下载和上传
1、不安全的文件下载和上传
1.1 概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果 攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。
所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。 切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
1.2 演示
1)我们选择前端图片,选择在新的标签页中打开,然后修改下载链接,下载一个网站根目录下的post.html文件
1.3 防范措施
1)对传入的文件名进行严格的过滤和限定
2)对文件下载的目录进行严格的限定
2、不安全的文件上传漏洞
2.1 概述
后台开发时并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施而上传一些恶意文件,从而通过对该恶意文件的访问来控制整个web后台
2.2 测试流程
1)对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
2)尝试上传不同类型的“恶意”文件,比如xx.php文件,分析结果
3)查看html代码,看是否通过js在前端做了上传限制,可以绕过
4)尝试使用不同方法进行绕过:黑白名单绕过/MIME类型绕过,目录0x00截断绕过等
5)猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试
2.3 客户端check演示
1)我们先装模做样的上传一个一句话木马文件,然后它提示我们不能上传,因为只能上传图片
2)我们打开控制台,看一下,然后看一下网页的源代码
3)提示文件上传成功,然后就可以根据路径,用菜刀访问了
2.4 服务端验证绕过
2.4.1 MIME
1)MIME多用于互联网邮件拓展类型,是设定某种拓展名的文件用一种应用程序来打开的方式类型,当该拓展名文件被访问的时候,浏览器会自动使用指定应用程序来打开,多用于制定一些客户端自定义的文件名,以及一些媒体文件打开方式
2)每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类,常见的MIME类型,比如:
超文本标记语言文本:html
普通文本:txt text/plain
RTF文本:.rtf application/rtf
GIF图形:.gif image/gif
JPEG图形:.ipeg .jpg image/jpeg
3)针对于这种漏洞呢,我们可以通过改包的方式完成攻击,可以先上传一个符合要求的文件,再去上传我们的一句话木马,把木马的包改成我们正确文件的包(content type)
4)这是我们上传的正确的图片文件
5)接下来上传php文件
6)把木马包发送到repeater模块,并修改content type为image/png
2.4.2 getimagesize
1)getimagesize()返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题
2)图片木马制作:
*直接伪造头部GIF89A
*CMD:copy /b xx.png + xx.php xx.png
*使用GIMP,通过增加备注,写入执行命令
3)演示操作
*限制做好图片木马,然后进行上传
*之后结合之前文件包含的漏洞进行攻击
2.5 防范措施
1)不要在前端使用js实施上传限制策略
2)通过服务端对上传文件进行限制
*进行多条件组合检查,比如文件大小,路径,扩展名,文件类型,文件完整性
*对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
*对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害