刚上线的PHP项目被攻击了怎么办

简介: 近期因忙于多个项目,代码质量有所疏忽,导致项目上线后遭攻击。攻击者通过文件上传漏洞和测试登录方式入侵,修改了 index.php 并植入恶意文件。经排查,问题源于未限制上传文件类型及未关闭测试登录配置。修复措施包括锁定文件、限制上传后缀、关闭测试登录、删除高危用户并限制其访问。此次事件提醒我们,细节疏漏可能引发严重风险,需时刻保持警惕。

写在前面
最近真的有点忙,同时做着4个项目,对接客户,沟通需求,技术造型,搭建项目框架,设计后端接口,定义对接流程,编写文档,督促前端partner,每一项都要亲力亲为,所以代码质量难免有折扣。这不,一不小心,就爆了。。。项目刚上线就被攻击了,幸好没有造成损失!

微信图片_2025-09-01_151621_676.png

问题表象
昨天下午,我打开项目后台,发现直接跳到了项目首页,我以为是有哪个地方有重定向,或是登陆状态有误,才会跳到了项目首页,连续试了几个url,都是如此,所以就登陆服务器看了一下,发现public/index.php被修改了,并且public/vendor/laravel-admin/下面多了几个文件,当时也没多想,直接把文件恢复了,多出来的文件也删除了,以为是客户误操作,所以他们才没有唠叨我。

结果今天下午,我再次打开项目后台,还是直接跳到了项目首页,还是不管什么url都会跳到了项目首页,这才意识到可能是被攻击了,于是登录服务器确认,昨天删除的文件又重新产生了,public/index.php又被修改了。心里虽然骂娘,但是问题还是得解决。

初步解决
因为问题的表象是public/index.php被修改,所以我想到的第一个操作就是,不让它修改,于是直接就给它"上锁"了,如下

chattr +i public/index.php

这样做虽然可以防止public/index.php被修改,但是没有查到根本原因,就无法解决根本问题。本着尽职尽责的态度,晚上又接着往下看这个问题了。

继续追踪
根据以往的经验来说,这种问题,一般都是通过上传文件接口把病毒植入到服务器上来的,于是就查看了nginx的access_log,果然发现了几个可疑的请求,如下

,果然发现了几个可疑的请求,如下

3605:127.0.0.1 - - [05/May/2025:16:42:26 +0800] "GET / HTTP/1.1" 200 832 "http://www.seocx.net/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"

3616:127.0.0.1 - - [05/May/2025:16:52:54 +0800] "GET /storage/avatars/1_1745770882.php HTTP/1.1" 200 4289 "https://xxx.com/tags.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"

3624:127.0.0.1 - - [05/May/2025:16:53:44 +0800] "GET /vendor/laravel-admin/AdminLTE/bootstrap/css/bootstrap.php HTTP/1.1" 200 2204 "https://xxx.com/tags.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"

3626:127.0.0.1 - - [05/May/2025:16:53:57 +0800] "POST /tags.php HTTP/1.1" 200 3066 "https://xxx.com/tags.php" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36"

第一个www.seocx.net在浏览器上打开一看,应该是seo网站,所以问题应该不是它。

第二个storage/avatars/1_1745770882.php显然问题就大了,因为storage/avatars是存放用户头像的目录,不可能有php文件,而且这种命名就是通过上传头像产生的。

第三个bootstrap.php就是多出来的文件之一。

第四个tags.php并不存在,应该是一种轮询测试方式,也是有问题的。

故不难看出,漏洞就是第二个请求产生的,或者说漏洞与第二个请求有直接关系。查看相关代码,如下

$member_id = auth('api')->id();
$file = $request->file('avatar');
$folder_name = "storage/avatars";
$upload_path = public_path() . '/' . $folder_name;
// 获取文件的后缀名,因图片从剪贴板里黏贴时后缀名为空,所以此处确保后缀一直存在
$extension = strtolower($file->getClientOriginalExtension()) ?: 'png';

$fileName = $memberid . '' . time() . '.' . $extension;
// 将图片移动到我们的目标存储路径中
$file->move($upload_path, $fileName);

此处我们没有判断文件的后缀,用户就利用了这个漏洞上传了带有攻击性的php文件。

修改起来也不困难,增加一下文件后缀的判断即可,如下

if( !in_array($extension, ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'heic']) ) {
Log::error('50006 --> illegal attacking');
return response()->json(err('图片格式不正确'));
}

本来问题到这就算解决了,但是带攻击性的php文件名是1_1745770882.php,从上面的代码可以看出,1_1745770882.php开头的1是member_id,而且第一个用户一般要么是开发人员,要么是客户,又不是无间道,两者皆不可能上传病毒文件,所以还得继续往下看。

回到登陆
由于申请小程序帐号,需要使用企业主体,所以很多流程我们是无法代劳的,只能客户自己完成申请,需要一定的时间。所以登陆的时候,为了快速测试,我做了一个特殊的登陆方式,如下

if( $request->jscode == 'test' && env('FOR_APP_SESSION_KEY') == true ) {
$data = [
'session_key' => 'test_session_key_000000000000001',
'openid' => 'test_openid_000000000000001',
];
} else {
$wechat = Factory::miniProgram($config);
$data = $wechat->auth->session($request->jscode);
}

意思就是当.env配置文件里面的FOR_APP_SESSION_KEY等于true时,jscode传test就会模拟平台接口的返回,然后拿到的member_id就是1。攻击都就是利用了这个登陆方式,成功登陆了。

这个终归还是我的问题,没有及时将.env配置文件里面的FOR_APP_SESSION_KEY改掉。于是改掉配置之后,又删除了此用户,并且为了确保万无一失,又在middleware里面增加了判断,如下

if( auth('api')->id() == 1 ) {
Log::error('50005 --> ',[$request->all(), $request->header()]);
return response()->json(err(50005, 'Invalid user'));
}

检查无误
这个问题的产生,就是由于当时大意,

  1. 没有及时修改配置,关闭特殊登陆方式
  2. 没有检查用户上传的文件的后缀
    所以就再三检查了本次的修复步骤

  3. 使用chattr设置文件不可修改

  4. 检查用户上传的文件的后缀,只能是图片类型
  5. 关闭特殊登陆方式
  6. 删除member_id为1的用户
  7. 禁止member_id为1的用户访问
相关文章
|
5天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
2月前
|
JavaScript Linux PHP
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
122 3
composer如何安装以及举例在PHP项目中使用Composer安装TCPDF库-优雅草卓伊凡
|
2月前
|
存储 缓存 安全
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
php项目源码加密之Zend Guard Loader加密的代码解密可能性很小-优雅草卓伊凡
112 2
|
2月前
|
PHP
Composer在PHP项目中的手动类自动加载策略
为了确保文件名和类名的一致性及其可预测性,类名通常应该与文件名相匹配,所有的类都应属于一个命名空间,并且目录结构应该反映命名空间的结构。如此一来,当新的类被创建时,它们会自动遵守已有的约定,从而无需修改自动加载逻辑,确保了代码的模块化和可管理性。
42 8
|
3月前
|
安全 API PHP
Composer在现代PHP项目中的进阶实践
简介:本文深入探讨PHP依赖管理工具Composer的核心功能与企业实践。首先介绍其如何通过`composer.json`实现声明式依赖管理,变革PHP生态;接着解析自动加载优化、版本策略(如`~`和`^`)及私有仓库集成等关键特性;然后分享CI/CD集成、多环境配置与性能优化技巧(如阿里云镜像加速)的企业级方案;最后提供常见问题排查方法,如内存不足和依赖冲突解决,助力开发者高效管理项目依赖。
80 3
|
6月前
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
284 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
缓存 前端开发 API
PHP 适合做什么类型的项目
【8月更文挑战第4天】PHP 适合做什么类型的项目
192 4
|
12月前
|
域名解析 关系型数据库 MySQL
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
该文章指导如何使用PHPEnv搭建本地PHP开发环境,并通过一个简单的"Hello World"程序演示从安装到运行的全过程。
基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
|
设计模式 数据库连接 PHP
PHP中的设计模式:如何提高代码的可维护性与扩展性在软件开发领域,PHP 是一种广泛使用的服务器端脚本语言。随着项目规模的扩大和复杂性的增加,保持代码的可维护性和可扩展性变得越来越重要。本文将探讨 PHP 中的设计模式,并通过实例展示如何应用这些模式来提高代码质量。
设计模式是经过验证的解决软件设计问题的方法。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理地使用设计模式可以显著提高代码的可维护性、复用性和扩展性。本文将介绍几种常见的设计模式,包括单例模式、工厂模式和观察者模式,并通过具体的例子展示如何在PHP项目中应用这些模式。
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
162 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目