概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
client check(前端检查)
这里要求只能上传图片
我们查看一下源码,是由于对文件的扩展名进行了判断导致只能传图片
我们可以通过更改前段代码来上传我们想要上传的文件
使用firebug删掉调用这个方法,删掉红框=后面的内容
上传上次的远程文件包含实验用到的yijuhua.php,发现上传成功
构造URL测试
MIME type(在后端进行了文件类型的比对)
多用途互联网邮件扩展类型(MIME),是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定的应用是程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
常见的MIME类型有:
- 超文本标记语言文本 .html text/html
- 普通文本 .txt text/plain
- RTF文本 .rtf image/gif
- JPEG图形 .ipeg .jpg image/jpeg
- GIF图形 .gif image/gif
观察源码
我们在提交的时候抓包修改content-type来上传文件(上一个测试的传上去的文件得删除,因为我传的还是同一个QAQ)
首先正常的上传图片是这样的
我们抓包也改成这样
上传成功
getimagesize
getimagesize(string filename) 函数
函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。即函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。
可以看到,High级别的代码读取文件名中最后一个”.”后的字符串, 即取最后一个后缀,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是”*.jpg”、”*.jpeg” 、”*.png”之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。
这种类型后台会根据上传的图片的16进制格式的前几位进行对比 符合才是真的图片,例如PNG的前几位是:8950 4e47
jpg+php组合拳
1.制作图片马
我们可以用TXT打开文件,然后将一句话木马写入末尾
但现在这里我们采用另一种方式,cmd中输入
我使用的2.php
copy 1.jpg/b+2.php/a 3.jpg (因为我把1.png和2.php都放在了桌面,所以cmd打开先需要cd命令先切换到文件所在位置再执行次命令)
如图所示成功插入
如果上传报错,在代码中添加时区函数
date_default_timezone_set("PRC");
成功上传
但是现在直接访问是不行的,出来还是图片
我们使用之前的本地文件包含
over~~~