主要简单介绍下文件上传和文件下载的一些漏洞,
及个人实验过程以及学习心得
学习链接:Web渗透技术零基础入门
学习链接:信息系统安全与对抗实践第四单元——文件上传漏洞
文章目录 简介一、文件下载漏洞二、文件上传漏洞2.1 文件上传漏洞原理及绕过2.2 服务端验证绕过2.2.1 MIME2.2.2 getimagesize() 2.3 文件上传漏洞的防范
一、文件下载漏洞
用户发起下载请求,网站向服务器请求资源,此时会带有请求资源所在的地址。网站收到请求后,就会根据地址执行下载 *** 作。
如果后台不对收到的地址进行安全检测,而是直接下载。这个地址就可以被攻击者利用。例如下载一些敏感文件等。
这里用pikachu简单地演示一下
D盘下有一个名为aa.txt的文件,我们首先需要通过目录遍历方法到达该路径。这里我们使用最简单的方法。
在web功能设计中,很多时候我们会要将需要访问的文件定义成变量,从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时,便会将请求的这个文件的值(比如文件名称)传递到后台,后台再执行其对应的文件。
在这个过程中,如果后台没有对前端传进来的值进行严格的安全考虑,则攻击者可能会通过“…/”这样的手段让后台打开或者执行一些其他的文件。 从而导致后台服务器上其他目录的文件结果被遍历出来,形成目录遍历漏洞。
但是经过测试发现,D盘的文件访问不了
而C盘下的文件可以任意访问
我猜测可能和源代码有关,导致通过目录遍历这个方法我们只能访问C盘下的文件
知道目录遍历这个方法后,我们开始利用文件下载漏洞下载我们希望得到的东西
随便点击一个名字
使用burpsite抓包
当前我们要下载的图片是kb.png,现在我们做一下修改。在已知的情况下,我们知道这张图片所属目录下还有一张名为ai.png的图片。
下载的是ai.png这张图片
搞清楚原理后,我们可以通过目录遍历下载我们想要的文件
看来根目录是D盘
放包。关闭拦截。
网页开始下载我们指定的文件
查看
防范措施:
1.对传入的文件名做严格的过滤和限制
2.对文件下载的目录进行严格的限定
二、文件上传漏洞 2.1 文件上传漏洞原理及绕过
什么是文件上传漏洞?
所以,造成文件上传漏洞的主要原因是:应用存在上传功能,但上传的文件没有经过严格的合法性检验或者检验函数存在缺陷,导致可以上传木马文件到服务器上。文件上传漏洞危害极大,因为可以直接上传恶意代码到服务器上,可能会造成服务器的网页篡改、网站被挂木马、服务器被远程控制和被安装后门等严重后果。现代互联网的web应用程序中,文件上传是一种常见的要求,因为它有助于提高业务效率。现在很多社交网络的Web应用程序中都有文件上传功能。
但是,如果应用程序对用户的上传文件没有控制或者存在缺陷,攻击者就可以利用应用上传功能存在的缺陷,上传木马和病毒等有危害的文件到服务器,进而控制服务器。
文件上传漏洞原理?
它主要是通过前端JS绕过等几种方式进行恶意代码上传。在网站运营过程中,不可避免地对网站的某些页面或者内容进行更新,这个时候就需要使用到网站的文件上传功能。如果不对上传的文件进行限制或者限制被绕过,该功能就可能会被利用上传可执行文件、脚本到服务器上,进而导致服务器进一步沦陷前端JS:JavaScript简称JS,是一种主要应用在前端开发过程中的编程语言。前端JS绕过可以简单理解为,绕过JS对用户的输入的检测 文件上传漏洞测试流程 测试切换到pikachu 客户端check界面
随便上传一个php文件
查看源码
burpsite开启拦截,然后文件上传,上传木马文件。删除onchane。点击文开始上传。然后关闭拦截。
这里显示了保存的路径,实际情况下,我们需要自己去找文件保存的路径。
这是木马文件的内容
执行木马文件
通过使用PHP的全局数组$_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的input name,第二个下标可以是"name",“type”,“size”,"temp_name"或"error"等。
例如
$_FILES['file']['name'] :被上传文件的名称
$_FILES['file']['type'] :被上传文件的类型
$_FILES['file']['size'] :被上传文件的大小,单位是字节
$_FILES['file']['tmp_name'] :存储在服务器上文件的临时副本的名称
$_FILES['file']['error'] :由文件上传导致的代码
示例
在pikachu平台上有一个MIME type的案例
不能上传php文件
部分源码
我们上传一张正常的jpg图片,由于图片格式刚好符合$mime中的值,所以能够上传成功。文件的类型在http头部显示为
如果我们上传php文件
因为content-type不符合类型,所以无法上传
修改content-type类型
上传成功!
测试
Getimagesize()返回结果中有文件大小和类型,如果用这个函数来获取类型,进而判断是否是图片的话,会存在问题
不同图片的二进制格式头部和尾部都不一样,例如,jpeg文件以二进制形式打开,其首部是FF D8,结尾为FF D9
换一张jpeg图片
PNG图片的首部则是:89 50 4E 47
这里使用的查看器是010 Editor
制作图片木马
现在桌面有一张111.jpg图片和一个1.php木马文件
现在使用copy命令,将它们合成为11.jpg
binary形式和ascii形式
这张图片既包含了原jpg图片的二进制数据,也包含了木马文件的数据
上传成功(因为图片太大了,有限制。我换了张小的。方法和上面一样)
虽然上传成功了,但这段代码实际上不会被执行
这里我们需要利用文件包含漏洞
后台使用包含函数include()处理文件中的代码时,如果发生错误,也会继续往下执行。也就是说,虽然前面的二进制代码无法执行,但是最后的php代码是可以被执行的
这是路径:
unsafeupload/uploads/2022/05/13/929413627e307ad9d8a965910378.png
我们进入文件包含漏洞界面
修改filename的值,进行目录遍历。由于已经知道文件路径,这里我们向上返回两层,然后定位响应的路径
2.3 文件上传漏洞的防范 不要在前端使用JS实施上传限制策略通过服务端对上传文件进行限制: 进行多条件组合检查:比如文件的大小,路径,扩展名,文 件类型,文件完整性等对上传的文件在服务器上存储时进行重命名(制定合理的命名规则)对服务端上传文件的目录进行权限控制(比如只读),限制执行权限带来的危害filename=…/…/unsafeupload/uploads/2022/05/13/929413627e307ad9d8a965910378.png
这是最简单的php代码,我们还可以上传更加复杂的木马(这里就不演示了)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)