WEB攻防-PHP-文件上传(存储安全)
前面我们已经了解了文件上传的一些相关的漏洞利用,这一期我们就来说说关于文件上传的存储的安全,这部分也是跟这个漏洞利用息息相关的,因为现在存储的方式越来越 高端了,首先基础的就是站库分离,然后还有现在用的越来越多的OSS,这种云存储就算你上传了木马也没什么用,因为他就只作存储,不会执行任何程序和文件,所以我们现在要对这些存储方法进行一个学习,对我们安全测试的时候以防浪费时间,知难而退咯。
首先我们来看看最基本的,我们前面开发的时候写过一个php的文件上传,那时候我们最后用的是MIME类型判断文件类型是否可以上传,但是我们也知道,这个非常容易绕过,所以当我们绕过上传一个php文件时,由于此时没有对这个文件进行任何限制,会让他执行这个php文件
但是如果此时我们对目录的执行权限进行限制
会发现直接导致我们无法执行其中的限制的文件
而没有限制的文件还是可以正常访问的,所以说,首先就是对目录的执行权限进行了限制,让我们无法直接执行php脚本
然后另一种就是,有些网站存储图片的时候会使用加密字节流来传输,叽里咕噜不用说很多,只用知道存储的时候他会被加密就明白了,我们随便找个网站看看就知道了
就像这种,可以看到下面的就是普通的指定的路径的图片,而我点的这个是被加密过的字节流,所以这个对我们有什么影响呢
首先我们简单的手搓一个加密的上传网站
<?php //处理文件上传 if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_FILES['fileToUpload'])) { $file = $_FILES['fileToUpload']; if ($file['error'] === UPLOAD_ERR_OK) { $tmp_name = $file['tmp_name']; $base64data = base64_encode(file_get_contents($tmp_name)); echo '<img src="data:image/jpeg;base64,' . $base64data . '" alt="上传的图片">'; } else { echo '文件上传失败,错误码:' . $file['error']; } } else { echo '没有收到文件。'; } } ?>
然后上传一个图片看看啥效果
可以看到文件完全是变成了base64加密格式,而当你复制文件路径的时候,他就会老长一条,其实就是你上传的其实不是一个真的图片,而是含有这个图片信息的字节流,传统的就是专门来搞一个文件夹来存储这些图片,而用这个编码之后,就可以用数据库存储这个信息,要用直接输出一下即可,而这个显示图片,他有一个固定协议,也就是前面的这个
data:image/jpeg;base64
通过这个来告诉类型和数据,所以会导致什么问题呢,比如现在我们上传一个后门文件
你会发现上传的php文件变成了这个样子,虽然他接受到了数值,但是他根本就不能正常解析,谈何连接后门呢
解码也可以还原,但是浏览器他解析不了呀,他只会把他当做图片来解析,与后缀无关,所以常规手段基本上都失效了
现在我们再看另一个,分站存储
在以前云安全还没有普及的时候,这个分站存储就使用的非常多
这个按字面意思也很好理解,也就是上传和存储的是两个项目,可能是同一台服务器,但是大部分肯定是不同服务器的,所以说当你上传了后门之后,就算你真的拿下了权限,但是也不是你当前的测试目标啊,小心人家给你抓起来了,而且一般也会对目录权限进行锁死,只进行存储,不让执行
拿b站的举个例子,可以明显的看到他下面指向的地址肯定不是b站的,这个地方就是他存储我们头像的地方
当你修改你的头像的时候,他首先就会转成字节流临时保存,当你提交之后,就会变成前面那个地址,各种技术组合使用
这是一种存储方案
然后就是现在热门的云存储了-OSS对象
简单来说也就是一个专门存储东西的一个云空间,也是只对对象进行保存,不进行任何解析,当你访问存储过后的地址时,他就直接是下载了,什么都不会干
我这里每米开哈,实验就不做了,简单理解一下即可
既然知道了有这几种存储方案,那我们该怎么判断呢
这都讲这么明白了还不会判断吗:
首先对于权限就是直接访问看是否有403这种错误
然后对图片地址访问的时候看他是否是在同一域名下
对于oss也是跟上面差不多,同样的判断方法
没啥好说的
重要的是我们该怎么测测呢
除了第一种目录权限内如果能换目录解析可以绕过,其他的全都无解~~~耶~失业咯~~~
基本上碰到了全都无解~~~咱们安全也是越来越难了哎嘿