不安全的文件上传(Pikachu)
概述
文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等,然后将其按照设计的格式进行重命名后存储在指定的目录。 如果说后台对上传的文件没有进行任何的安全判断或者判断条件不够严谨,则攻击着可能会上传一些恶意的文件,比如一句话木马,从而导致后台服务器被webshell。
所以,在设计文件上传功能时,一定要对传进来的文件进行严格的安全考虑。比如:
--验证文件类型、后缀名、大小;
--验证文件的上传方式;
--对文件进行一定复杂的重命名;
--不要暴露文件上传后的路径;
--等等...
Pikachu
client check(前端绕过)
查看此关卡的html源码可知, 这是在前端通过js脚本对上传文件的后缀名进行验证,通过设置黑、白名单限制用户上传的文件类型。
可以通过拦截修改数据包轻松绕过,也可以在浏览器禁用js绕过
改一句话php文件后缀名为jpg
将后缀改为php,放包 上传成功
也可上传一句话木马用蚁剑连接
<?php@eval($_POST['cmd']);?>
MIME type(服务端绕过)
简单来讲,它的作用就是服务器告诉浏览器你这个内容到底是个什么东东,是一张网页?还是一张图片?还是一个视频?浏览器只有知道了你这是个什么东西,才能正确处理它,mime就是这个东西,服务器通过Content-Type
这个header来指定mime。
我们上传的文件被判定为content-type字段时,可以通过抓包,将content-type字段改为常见的图片类型,例如image/gif,从而绕过。也就是我们上传php文件时,可以改为jpg、png之类的,然后实现绕过。
MIME((Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。
常见的MME类型,例如:
超文本标记语言文本 .html,html text/htm
普通文本 .txt text/plain
RTF文本. rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 . jpg image/jpeg
我们创建一个php文件1.php,可以直接上传,抓包把content-type字段改为image/jpeg
或者直接把文件后缀名改为1.jpg,抓包修改文件名后缀为1.php(和第一题一样)
可上传一句话木马用蚁剑连接
<?php@eval($_POST['cmd']);?>
getimagesize
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
语法格式:
array getimagesize ( string $filename [, array &$imageinfo ] )
getimagesize()
函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
getimagesize()
函数会通过读取文件头部的几个字符串(即文件头), 来判断是否为正常图片的头部
可通过制作图片木马或在木马文件内容头部添加GIF89a
(Gif图片文件头), 然后利用文件包含漏洞来解析图片木马
我们上传了一个jpg格式的一句话木马,如果网站有文件包含漏洞,jpg文件就可以被当做php文件解析,所以这就是文件包含漏洞通常配合文件上传使用。
现在我们将phpinfo.jpg的内容改成一段文字:hello world!
前两关的套路行不通了
在图片木马的文件内容头部添加GIF89a
上传———访问
利用文件包含漏洞解析该php代码
http://127.0.0.1/pikachu/vul/unsafeupload/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2024/05/07/542758663a3ffac631e682002913.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2