不安全的文件下载和上传
不安全的文件下载和上传(PIKACHU)
文件下载漏洞概述
很多网站都会提供文件下载功能,即用户可以通过点击下载链接,下载到链接所对应的文件。
但是,如果文件下载功能设计不当,则可能导致攻击者可以通过构造文件路径,从而获取到后台服务器上的其他的敏感文件。(又称:任意文件下载)
127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../../../../etc/passwd
漏洞代码分析
header("Content-type:text/html;charset=utf-8");// $file_name="cookie.jpg";$file_path="download/{$_GET['filename']}";//用以解决中文不能显示出来的问题$file_path=iconv("utf-8","gb2312",$file_path);//首先要判断给定的文件存在与否if(!file_exists($file_path)){ skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php'); return ;}$fp=fopen($file_path,"rb");$file_size=filesize($file_path);
文件上传漏洞概述
因为业务功能的需要,很多web站点都有文件上传的接口,比如:
—— 1、注册时上传头像图片(比如jpg,png,gif等);
—— 2、上传文件附件(doc,xls等)
而在后台开发时并没有对上传的文件功能进行安全考虑或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)
从而通过对该恶意文件的访问来控制整个web后台。
文件上传漏洞测试流程 (一句话木马)
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等);
- 尝试上传不同类型的 "恶意"文件 ,比如xx,php文件,分析结果;
- 查看html源码,看是否通过js前端做了上传限制,可以绕过;
- 尝试使用不同方式进行绕过:黑白名单绕过/ MIME类型绕过/ 目录0x00截断绕过等;
- 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试;
不安全的文件上传漏洞 - 服务端验证
MIME介绍(小知识介绍)
MIME(Multipurpose Internet MailExtensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图像image等,后面定义具体的种类。常见的MIME类型,比如:
超文本标记语言文本 .html, .html text/html
普通文本 .txt text/plain
RTF 文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 .ipeg, .jpg image/jpeg
文件上传漏洞 - $_FILES()函数
通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name。第二个下标可以是 “name” , “type” , “size” , “tmp_name” 或 “error”。就像这样:
· $_FILES["file"]["name"] - 被上传文件的名称
· $_FILES["file"]["type"] - 被上传文件的类型
· $_FILES["file"]["size"] - 被上传文件的大小,以字节记
· $_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
· $_FILES["file"]["error"] - 由文件上传导致的错误代码
文件上传漏洞 - MIME类型验证
漏洞代码分析
$html='';if(isset($_POST['submit'])){// var_dump($_FILES); $mime=array('image/jpg','image/jpeg','image/png');//指定MIME类型,这里只是对MIME类型做了判断。 $save_path='uploads';//指定在当前目录建立一个目录 $upload=upload_sick('uploadfile',$mime,$save_path);//调用函数 if($upload['return']){ $html.="文件上传成功
文件保存的路径为:{$upload['new_path']}
"; }else{ $html.="{$upload['error']}
"; }}
文件上传漏洞之getimagesize()类型验证
Getimagesize() 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
是否可以绕过呢?可以,因为图片头可以伪造。
文件包含漏洞之文件上传漏洞的利用
图片木马的制作:
- 方法1:直接伪造头部GIF89A
- 方法1.CMD: copy /b test.png + muma.php cccc.png
- 方法2.使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令
# 写一个 “一句话” 木马文件 phpinfo<?php phpinfo(); ?># 在 CMD 中进行一个 ai.png图片与 phpinfo的php文件 的结合,生成一个新的文件 ccc.pngC:\Users\runner\Desktop> copy /b ai.png + phpinfo.php ccc.png# 然后我把 ccc.png 拖入了centoos7虚拟机 进行操作xxd ccc.png //查看pngxxd ai.png | head -n 1 // xxd可以读取目标的十六进制
在getimagesize() 中出现的问题
对于出现以上的类似的问题:
进入pikachu > vul > unsafeupload > getimagesize.php
中进行修改
修改为:.date_default_timezone_set('UTC')
即可
然后,保存,进入页面刷新,就上传成功啦!!!
后续操作
复制上传的 ccc.png 的链接地址
# 进行拼接http://127.0.0.1/pikachu/vul/unsafeuploaduploads1/576245632090ca96c49485955114.png //图片路径 http://127.0.0.1/pikachu/vul/unsafeupload/uploads1/576245632090ca96c49485955114.pngunsafeupload/uploads1/576245632090ca96c49485955114.png
在 File Inclusion 中的包含漏洞中执行(进行链接的一个拼接)
上传成功之后,结果如下:
上传成功!!!
不安全的文件上传漏洞 - 防范措施
· 不要在前端使用JS实施上传限制策略
· 通过服务端对上传文件进行限制:(如下)
- 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
- 对服务器端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害
来源地址:https://blog.csdn.net/weixin_61427044/article/details/126836804
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341