知了堂《web安全-上传漏洞》课程讲解文档(下)
文章来源:知了堂冯老师

接上文
知了堂:知了堂《web安全-上传漏洞》课程讲解文档(上)

6 文件类型绕过代码分析
服务端处理上传文件的代码如下,服务端代码判断$_FILES[“file”][“type”]是不是图片的格式(image/gif,image/jpeg,image/pjpeg),如果不是,则不允许上传该文件,而$_FILES[“file”][“type”]是客户端请求数据包中的Congent-Type,所以可以通过修改Content-Type的值绕过该代码限制。

在php中还存在一种相似的文件上传漏洞,PHP函数gettimagesize()可以获取图片的宽、高等信息,如果上传的不是图片文件,那么getimagesize()就获取不到信息,则不允许上传,代码如下:

但是,我们可以将一个图片何一个webshell合并为一个文件,例如使用以下命令
Cat image.png wehshell.php > image.php
此时,使用getimagesize()就可以获取图片信息,且webshell的后缀是php,也能被apache解析为脚本文件,通过这种方式就可以绕过getimagesize()的限制。
7 文件截断绕过攻击
截断类型:PHP%00截断
截断原理:由于00代表结束符,所以会把00后面的所有字符删除。
截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态。
在上传文件时,服务端将GET参数jieduan的内容作为上传后文件名的第一部分,然后将按照时间生成的图片文件名作为上传后文件名的第二部分。


修改参数jieduan为1.php%00.jpg,文件被保存到服务器时,%00会把”.jpg”和按时间生成的图片文件名全部截断,那么文件名就剩下1.php,因此成功上传了webshell脚本。

8 文件截断绕过代码分析
服务端处理上传文件的代码如下,程序使用substr获取文件后缀,然后判断后缀是否是‘flv’,‘swf’,‘mp3’,‘mp4’,‘3gp’,‘zip’,‘rar’,‘gif’,‘jpg’,‘png’,‘bmp’中的一种,如果不是,则不允许上传该文件。但是在保存的路径中有$_REQUEST[‘jieduan’],那么此处可以利用00截断尝试绕过服务端限制

9 文件上传漏洞修复建议
针对文件上传的修复,建议:
• 1.通过白名单的方式判断文件后缀是否合法,对文件格式限制,只允许某些格式上传。
• 2.对上传后的文件进行重名名,例如rand(10,99).date(“YmdHis”).”.jpg”。
• 3.对文件格式进行校验,前端跟服务器都要进行校验(前端校验扩展名,服务器校验扩展名、Content_Type等)。
• 4.将上传目录防止到项目工程目录之外,当做静态资源文件路径,并且对文件的权限进行设定,禁止文件下的执行权限。
10 练习平台部署
Upload-labs
upload-labs是一个使用php语言编写的,专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关,每一关都包含着不同上传方式。
靶机包含漏洞类型分类

Install
环境要求
若要自己亲自搭建环境,请按照以下配置环境,方可正常运行每个Pass

Windows快速搭建
项目提供了一个Windows下,按照以上配置要求配置好的集成环境
下载地址:https://github.com/c0ny1/upload-labs/releases
集成环境绿色免安装,解压即可使用。
Linux快速搭建
创建镜像
$ cd upload-labs/docker
$ docker build -t upload-labs .
或
$ docker pull c0ny1/upload-labs
创建容器
$ docker run -d -p 80:80 upload-labs:latest
如何判断上传漏洞类型

练习:DVWA
————————————————end————————————
