什么是文件上传
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像,附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断,比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式重命名后存储在指定的目录,如果说后台对上传的文件没有进行任何的安全判断或者判断的条件不够严谨,则攻击者可能会上传一些恶意的文件,比如一句话木马,从而导致服务器权限被获取。
防范文件上传漏洞的方法
- 验证文件类型、后缀名、大小
- 验证文件的上传方式
- 对文件进行一定复杂的重命名
- 不要暴露文件上传后的路径
- 等等
进入第一关
提示我们只允许上传图片
但是我们打开F12看到
这里的JS调用了一个checkFileExt的方法
这个方法在后面也找得到,大致的意思就是判断文件的扩展名是不是为jpg、png、gif
我们知道这种前端的限制只能起到辅助作用,起不到实质性的作用
我们只需要把之前那个input标签的onchange的属性删除,让上传的时候触发不了这个方法
就可以达到我们上传的目的
然后我们上传我们的php一句话木马
访问路径,测试一下我们的一句话是否能执行
第二个题目是考MIME的
什么是MIME
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
常见的MIME格式
1 超文本标记语言文本 .html,.html text/html 2 普通文本 .txt text/plain 3 RTF文本 .rtf application/rtf 4 GIF图形 .gif image/gif 5 JPEG图形 .jpeg,.jpg image/jpeg 6 au声音文件 .au audio/basic 7 MIDI音乐文件 mid,.midi audio/midi,audio/x-midi 8 RealAudio音乐文件 .ra, .ram audio/x-pn-realaudio 9 MPEG文件 .mpg,.mpeg video/mpeg 10 AVI文件 .avi video/x-msvideo 11 GZIP文件 .gz application/x-gzip 12 TAR文件 .tar application/x-tar
php里有一个$_file函数来获取请求头里面的Content-Type
因此,我们只需要用抓包修改请求头里Content-Type的值
就可以绕过验证
第三个题目—getimagesize
getimagesize()这个函数返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题
我们可以伪造图片头
我们先普及一下基础知识
先查看一下他们的图片头
用linux的xxd命令
发现png图片的头部十六进制都一样
那我们可以用windows的cmd命令把一张图片和一个php文件合起来变成一个文件
安排一手
选择两个文件
合成一个新的文件叫xxx.png
表面上看还是这个图片
我们把xxx丢进kali看看
发现前面还是正常的图片,但是在最后跟上了我们的一句话木马
还需要了解的是
PHP的文件包含
include在发现错误的时候会继续执行后面的代码
当遇到我们的png的时候,会一直往下读取,执行到我们的一句话的时候就会正确执行
上传的时候我发现在21行会报错
测试后把这半条代码删除就可以正常上传
成功上传了我们的xxx.png
我们来访问一下
发现可以正常访问
但是,他是一个png
那么我们要这么才能让他执行里面的php代码呢
就要用到我们之前的文件包含漏洞
那就要让本地文件包含漏洞找到我们的png图片
发现我们上传的文件在这个文件夹之下那么我们就可以拼凑出
unsafeupload/uploads/7043985d85e8876ad12573844907.png
来进行测试,看看网站是否能找到我们的png
反正就是大概猜测在哪个目录能访问我们图片所在的路径
../../unsafeupload/uploads/7043985d85e8876ad12573844907.png
经测试我们可以用这个路径访问到我们的phpinfo