discuz!X加固方案

第一章 引言

1.1 项目概述

本项目旨在对基于discuz!X的校园网论坛进行安全加固,以确保论坛的数据库和后台管理系统的安全性,防止黑客的攻击和数据泄露。通过对论坛系统的安全漏洞进行分析和识别,针对性地进行安全加固,以提高论坛系统的整体安全水平。

项目的主要目标包括但不限于以下几点:首先,对数据库进行严格的用户安全管理,包括合理设置用户权限、限制对数据库的访问和操作权限,以及进行数据库数据的加密和脱敏等措施。其次,对数据表的前缀进行修改,以防止黑客通过猜测表结构进行攻击和数据窃取。接着,对后台管理系统进行安全加固,包括将默认的管理员用户名“admin”修改为其他随机的用户名,以及对后台管理登录文件名进行修改,增加系统的安全性,防止恶意登录和攻击。此外,对安装文件目录进行保护,限制对安装文件的访问权限,以防止黑客获取网站结构和敏感信息。最后,实施页面篡改的设置,确保网站页面内容的完整性和安全性,防止黑客对页面进行恶意篡改。

通过以上安全加固措施的实施,可以有效提高校园网论坛系统的安全性和稳定性,保护用户的隐私信息和数据安全,为用户提供更加安全可靠的网络环境和服务。

1.2 需求分析

  1. 数据库用户安全管理:对论坛系统的数据库用户进行细致的权限管理,包括创建具有最小权限的数据库用户,限制其对数据库的访问和操作权限,确保数据库的安全性和稳定性。同时,对敏感数据进行加密和脱敏处理,以保护用户信息的安全性。

  2. 数据表修改前缀:对论坛系统的数据表前缀进行修改,以防止黑客通过猜测表结构进行SQL注入等攻击,保护数据库的完整性和安全性。

  3. 后台管理用户名修改:将默认的管理员用户名“admin”修改为随机的、不易猜测的用户名,增加后台管理系统的安全性,避免黑客利用默认用户名进行恶意登录。

  4. 后台管理登录文件名修改:对后台管理登录文件名进行修改,增加系统的安全性,防止黑客对后台管理系统进行暴力破解和登录攻击。

  5. 安装文件目录保护:对安装文件目录进行权限设置和访问限制,防止黑客获取论坛系统的结构和敏感信息,提高系统的安全性。

  6. 防止页面篡改:实施页面篡改的设置,包括对页面文件的完整性进行验证和监控,以防止黑客对页面进行恶意篡改,保护用户信息和系统安全。

1.3 运行环境

PHPStudy、Apache、MySQL数据库等。

 

第二章 项目设计

2.1 设计思路

本项目基于大型校园网络,结合大型校园网特性,根据用户需求进行网络设计,保证各个通信阶段的配置完整,数据可达,项目需要搭建Web服务器,根据相关需求,服务器底层使用Linux服务系统,部署Linux相关功能,保证系统稳定性和安全性。本项目为一个仿真项目,此时可设计并创建与校园网相关的网站、数据库等。后期对校园网的数据通信模块、服务器模块、网站和数据库进行安全测试,找到存在的问题并进行加固。

2.2 功能设计分工

网络部分:搭建实验所需要的大型校园网络并使其中设备可以进行通信 数据库安全加固:MySQL数据库安全加固实现相关功能 网站搭建:搭建中小型校园网络信息登陆查询网站 渗透测试:挖掘网站漏洞,漏洞复现,分析漏洞原因,找出漏洞所在位置 安全加固:对系统进行安全加固和对扫描出来的漏洞进行加固

 

第三章 详细设计

3.1 数据库用户安全

首先,需要对数据库进行用户权限的细致管理,包括创建一个具有最小权限的数据库用户,限制其对数据库的访问和操作权限,确保数据库的安全性和稳定性。其次,对敏感数据进行加密和脱敏处理,以保护用户信息的安全性。可以考虑使用数据库管理系统提供的权限管理功能,结合加密算法对敏感数据进行处理。

 

3.2 数据库表前缀修改

数据表修改前缀:对数据表前缀进行修改,以防止黑客通过猜测表结构进行SQL注入等攻击。可以通过数据库管理系统或者论坛系统提供的工具,对数据表的前缀进行批量修改,确保数据库表的安全性。

 

3.3 后台管理用户名

后台管理用户名修改:将默认的管理员用户名“admin”修改为随机的、不易猜测的用户名,增加后台管理系统的安全性。可以通过论坛系统的后台管理界面或者数据库直接进行修改,确保管理员用户名的安全性。

3.4 后台管理登录文件名

后台管理登录文件名修改:对后台管理登录文件名进行修改,增加系统的安全性,防止黑客对后台管理系统进行暴力破解和登录攻击。可以通过修改系统文件名或者使用URL重写等技术手段,对后台管理登录文件名进行定制化设置,增强系统的安全性。

 

3.5 安装文件目录删除

安装文件目录保护:对安装文件目录进行权限设置和访问限制,防止黑客获取论坛系统的结构和敏感信息,提高系统的安全性。可以通过服务器的文件权限管理功能,对安装文件目录进行权限设置,限制对安装文件的访问权限。

 

3.6 页面篡改漏洞分析

防止页面篡改:实施页面篡改的设置,包括对页面文件的完整性进行验证和监控,以防止黑客对页面进行恶意篡改,保护用户信息和系统安全。可以通过网站安全防护软件或者自行开发的监控程序,对页面文件进行定期检查和验证,确保页面的完整性和安全性。

在对其网站安全检测的同时发现一处漏洞,该漏洞可导致论坛的后台文件可以任意的删除,导致网站瘫痪,后台无法登陆。

 

Discuz漏洞的检测与分析

该漏洞发生的位置在于source目录下的admincp文件夹里的admincp_forums.php代码里,用note编辑器打开查找到unlink函数调用的地方,看到漏洞产生的原因,搜索$_get{'replybgnew'],定位到代码。漏洞的使用有限制,必须是discuz管理员的权限,即使漏洞危害较小,也还是一处discuz的漏洞,如下图所示:

从上图可以看到代码首先会进行判断对于GET提交过来的参数会进行IF语句,从代码里获知当$multiset的值为真或者是为假的时候,就会将参数赋值为0,另外一个的IF语句是如何使用的,当IF下来的时候会进行安全检测,将parse_url参数里的结果进行检测,来确定前端提交过来的网址是否正确,代码执行到最后一步我们看到attachurl的变量内容,可以伪造恶意代码插入进去。

if(!$multiset){
   if($_GET['delreplybg']){
       $valueparse = parse_url($_GET['replybgnew']);
       if(!isset($valueparse['host']) && file_exists($_G['setting']['attachurl'].'common/'.$_GET['replybgnew'])){
           @unlink($_G['setting']['attachurl'].'common/'.$_GET['replybgnew']);
      }
       $_GET['replybgnet'] ='';
  }
}

 

第四章 项目实施

4.1 数据库用户安全

在安装discuz程序时,创建一个mysql数据库用户和discuz数据库,只让创建的数据库用户对discuz数据库拥有创建、查询、修改等权限,以免有恶意用户sql注入对服务器所有数据库密码暴库风险。

增加一个用户d15cuz_user密码为Admin@123`,让他只可以在localhost上登录,并可以对数据库mydb进行查询、插入、修改、删除的操作,这样用户即使用知道test2的密码,他也无法从internet上直接访问数据库,只能通过MYSQL主机上的web页来访问了。

具体操作如下:

# 创建用户名
CREATE USER 'd15cuz_user' @'localhost' IDENTIFIED BY 'Admin@123';

接下来限制该用户对discuz数据库的操作权限:

GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON discuz.* TO 'd15cuz_user'@'localhost';
FLUSH PRIVILEGES;

image-20231122110112627

 

结果测试:

分别在localhost和远程主机使用root账号和d15cuz_user登录数据库,查看登录结果:

  1. 在localhost分别使用root和d15cuz_user登录数据库:

    image-20231122111121022

  2. 在远程主机分别使用root和d15cuz_user登录数据库:

    接下来使用新建用户“d15cuz_user”远程访问数据库,可以发现登录失败:

    image-20231122112144466

 

 

4.2 数据库表前缀修改

在安装discuz程序时,默认表前缀是pre。

image-20231122140626585

建议修改为不容易被猜出来的表前缀,不容易猜出规则的表前缀名称,这样恶意用户在入侵你的网站,就不容易找到你的数据表名字是什么了。

建立论坛网站时建议修改如下:

image-20231122140736318

 

此时在安装过程中,系统自动创建的数据表的前缀均以“d15css”为开头:

image-20231122141853286

 

后台查询看效果如下:

image-20231122142051174

 

4.3 后台管理员用户名

在安装discuz程序时,需要设置discuz管理后台管理员账号密码,默认管理员用户名是admin,建议可以修改为其他用户名,密码设置不要太简单,尽量复杂一些。防止被黑客使用爆破的方式破解管理员密码。建议修改为如下格式,同时密码存在一定的复杂度。

image-20231122141042782

 

4.4 后台管理登录文件名

discuz程序安装完成后,管理后台登录通常是通过http://你的域名/admin.php,建议将admin.php修改为只有你知道的名字,以免被恶意用户随意测试账号密码进入登录。

任意用户如果获取后台管理中心的登录页面,都可以尝试爆破,造成严重影响。

image-20231122150007856

此时将’admin.php‘进行修改,避免产生风险:

image-20231122150253088

 

 

4.5 安装文件目录删除

discuz程序安装完成后,删除安装文件目录install,以免恶意用户利用discuz安装文件覆盖你的网站造成严重后果。

在未删除文件之前,可以使用一下脚本尝试对目标网站进行拓印:

import contextlib
import os
import queue
import requests
import sys
import threading
import time
import urllib3

FILTERED = ['.jpg', '.gif', '.png', '.css', '.js']
TARGET = 'http://192.168.63.211/discuz/upload'
THREADS = 10

answers = queue.Queue()
web_paths = queue.Queue()


def gather_paths():
   """获取文件目录"""
   for root, _, files in os.walk('.'):
       for fname in files:
           if os.path.splitext(fname)[1] in FILTERED:
               continue
           path = os.path.join(root, fname)
           if path.startswith('.'):
               path = path[1:]
           print(path)
           web_paths.put(path)


@contextlib.contextmanager
def chdir(path):
   """
  On enter, change directory to specified path.
  On exit, change directory back to original.
  """
   this_dir = os.getcwd()
   os.chdir(path)

   try:
       yield
   finally:
       os.chdir(this_dir)


def test_remote():
   """远端链接测试"""
   while not web_paths.empty():
       path = web_paths.get()
       url = f'{TARGET}{path}'
       headers = {
           'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                         'Chrome/65.0.3325.181 Safari/537.36'}
       # print(url)
       time.sleep(2)  # your target may have throttling/lockout.
       r = requests.get(url=url, headers=headers)
       if r.status_code == 200:
           answers.put(url)
           sys.stdout.write('+')
       else:
           sys.stdout.write('x')
       sys.stdout.flush()


def run():
   """运行脚本"""
   mythreads = list()
   for i in range(THREADS):
       print(f'Spawning thread{i}')
       t = threading.Thread(target=test_remote)
       mythreads.append(t)
       t.start()

   for thread in mythreads:
       thread.join()


if __name__ == '__main__':
   with chdir("/root/Downloads/discuz/upload/"):   # 该路径下存放了一个discuz的安装目录和程序
       gather_paths()
   input('Press return to continue')
   run()

   with open('myanswers.text', 'w') as f:  # 该脚本执行完,会创建一个mysaswers.txt,里面包含扫描到的安装结果。
       while not answers.empty():
           f.write(f'{answers.get()}\n')
   print('done')

 

程序运行成果如下:

image-20231122145445103

 

程序运行完成后,查看 'myanswers.text':

image-20231122150427244

 

4.6 页面篡改修复

我们构造恶意代码首先搭建一下测试的Discuz论坛环境,服务器使用linux centos系统,PHP版本使用5.3版本,数据库mysql5.5,我们从官方下载一份3.5正式版的代码,安装到测试环境中。打开论坛,登陆后台,然后找到论坛的模块管理,点击最下端的提交,然后通过抓包获取数据,在提交的post数据中添加:&replybgnew=../../../index.php&delreplybg=safe这个代码,然后再提交post,就会把网站的论坛首页删除掉,就会显示如下图:

image-20231122150644829

 

关于这个Discuz!网站漏洞,前提是需要获取论坛管理员的权限,相对来说危害较小,但也不能忽视对网站安全的防护,时刻做好网站的安全备份,discuz要登陆后台经常看下是否有漏洞补丁需要修复,关于这个漏洞的修复,建议将discuz的后台地址admin.php改为admin!@#ht.php这样即使知道管理员的账号密码,也登陆不了后台。

 
posted @ 2023-11-22 15:09  KARL_GO  阅读(57)  评论(0编辑  收藏  举报