服务器上发现了一个木马程序!
处理思路:
- 删除,并且修改上传文件权限为0444,不要赋予1权限
- 禁用eval函数
- 上传接口严格检查文件后缀
想问一下各位,这种木马文件是用什么文件写的?是编译后的PHP文件吗?
高认可度评论:
上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。
但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。
即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。
其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。
./index.php
类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。之前有一个TP项目,我也想禁用eval ,谁曾想,tp自己框架都需要这个函数渲染 。laravel 查了目前没有用到该函数
他们是通过修改上传文件内容,然后修改文件头的方式,把上传文件伪装为合法的jpg,但是文件内容其实是php文件
还好我都是存在阿里 :unamused:
对这句话提出两点质疑
首先,还是那句话,众所周知 PHP 是解释型语言,并非编译型语言,这点要分清!
忽略上方乱码内容只看最后两行就行。在 PHP 解释执行时,未被 PHP 标记符(例如
<?php ?>
<? ?>
<?= ?>
)包裹的内容会原样输出,这也是能在 PHP 文件中混淆 html 代码的原因基本防御措施:
然后和大家分享下常见的文件上传攻击方式,一般此类攻击会分2步动作,一是找到上传接口上传非法文件埋下伏笔,二是获得执行契机,那么我们如何做好防范呢?
首先最基本的,你得检测上传文件后缀(很多人会说后缀可以改,这是无用的,错!!!这是非常有用且必须做的,后面我会解释),然后类似一些图片、视频、音频等一些资源,你也可以附带检测一下MIME类型。这两项安全验证,不管对于何种语言,都是比较容易做到的,很多内置库就能干,编写成本低,是比较实际的做法,做好这两项检测,你的接口已经基本安全了。更全面的防范,你可以检测文件元数据,这需要你有比较高的代码水平、对各种格式元数据了解、对API响应效率是个考验。
上面我说的2步攻击动作,第1步其实比较容易实现(即使你做了我说的2个安全验证,也是无法阻止这一步的),项目的整体安全防范做到位的情况下,第2步是很难实现的。
为什么说第1步容易实现呢,前面也有同学列举了一些攻击方式,我可以伪装文件后缀,那么你的文件后缀验证就无法拦截了,咦,但是我MIME类型检查可以拦截啊,然而道高一尺魔高一丈,你拦我MIME类型,那我就传一张真实图片给你,我在图片元数据参入PHP代码,成功KO你。
好,这里解释前面为什么说要验证文件后缀了,比如我验证文件后缀,强制要求你只能传
.jpg
等格式文件,不允许你传.php
等文件,那么你即使把.php
文件改为.jpg
文件上传了,那么你做不到我上面说的2步攻击的第2步:攻击契机,因为你传的是.jpg
格式,你无法借助我服务器现有的PHP解释器,进行web访问方式进行攻击,你可能会需要进行脚本执行方式攻击,但因为我服务器整体防范到位,你很难获得到我服务器的shell之类的权限,所以你也有无法拥有攻击契机,这就是为什么要你验证后缀的原因,它并不仅仅是能否验证真实文件的问题上传文件的目录设置为不能执行那就行了吧,就0666
上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。
但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。
即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。
其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。
./index.php
类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。一句话木马
所以这个木马是怎么攻击的你们的?在web服务器一般配置中,只有.php后缀的才会使用php执行,所以上传时校验后缀就可以了吧。
之前的做法是 不让直接访问文件 使用类似云存储一样 一个code换一个资源 资源直接由后端返回流到前端 这样就不会再后端执行了