ThinkPHP项目安全配置解决方案

2020-07-23T21:10:05

前言:



  ThinkPHP MVC框架越来被开发者接受,众多的开发者选择了这个框架,也有很多的优秀项目使用的ThinkPHP框架。最近整理了一下ThinkPHP项目的一些安全配置。可能并不适用全部项目,大家可以适当的使用如下的安全配置。



前置知识:



     web容器和各类组件的版本,这里使用的LNMP 的架构:Nginx1.19 Mysql 5.6 PHP7.4 Centos8.2,这里推荐是PHP的版本7.4


一、ThinkPHP常见的被入侵方式

ThinkPHP RCE

案例分享:

在某些ThinkPhp版本中只有开启了Debug才会导致命令执行的出现,例如拿ThinkPhp5.1.14举例

获取网站的绝对路径等等敏感信息


开启了Debug,执行exp


2、通过log日志获取网站权限

智宇发卡网举例

此发卡网是可以访问runtime目录的,给大家看看目录


他入口文件和runtime目录在同一个目录里面,他也没设置其他东西,所以可以直接访问runtime目录

然后根据runtime目录的日志存储的格式runtime/log/年份月份/.log来存储的,所以得到runtime/log/202007/22.log来获取网站日志,在遍历日志的时候在18号发现了管理员账号密码


通过后台登录账号密码,通过代码审计发现在一个比较鸡肋的Rce

利用条件

可以开启日志,或者支持into outfile

GetShell

1

在审计的时候发现了数据库可以指定其他文件进行数据库恢复(恢复数据相当于执行SQL语句),下面是利用步骤

1.下载网站备份文件

2.修改SQL语句,添加漏洞利用代码

3.在文件存储处添加.sql的后缀,然后在上传文件的地方上传.sql文件

4.然后在恢复数据的时候指定这个.sql文件达到写shell的目的


备份数据库

下载后修改备份文件并修改文件


漏洞利用代码(路径自己设置,后面的注释不可以删除)











SET GLOBAL general_log = 'ON';SET GLOBAL general_log_file = 'C:\\wwwroot\\192.168.2.128\\wwwa.php';select '<?php eval($_POST[0]);?>';SET GLOBAL general_log_file = 'C:\\Temp\\a.txt';


文件存储添加.sql后缀

上传刚刚修改的.sql文件,例如此处

在点击上传图片的时候,先抓包,添加一个.sql后缀的文件

然后上传刚刚修改的sql文件,可以得到上传的路径

恢复数据GetShell

恢复成功后访问网站的wwwa.php,密码是0

另外一个命令执行漏

由于thinkphp框架开发,他存在Thinkphp的Rce漏洞,但是由于路由设置的原因,在进行Rce的时候他每次请求都会带有路由的子域名参数,例如

可以看见他会带着当前的域名或者ip先传入该参数进行执行,所以导致很多函数无法使用,所以大部分函数无法使用,不过还是找到了system这个函数进行命令执行


二、思考如何防御???





2.1 配置防御log目录泄露

   runtime目录下的文件是ThinkPhp运行时产生的文件,里面包括了日志,缓存,等等的信息,如果可以访问会导致如下危害:可以看见管理员和其他用户的登录日志,会记录明文账号和密码在某些版本可以通过缓存来进行代码执行












修复方法

伪静态中添加

location ~* (runtime/|Application/)

{

    return 403;

}












2.2 ThinkPHP安全入口限制












案例

https://www.bt.cn/bbs/thread-52183-1-1.html

修复方法

location ~ ^/index.php{ 

     include enable-php-70.conf;    

}

location ~* \.(php){              


    deny all;

}












2.3 使用Nginx防火墙

默认拦截日志防御和ThinkPHP RCE攻击

如下:

发起ThinkPHP RCE 请求被拦截


2.3 使用堡塔PHP安全防护

防跨站的危害性

作用

当服务器中有多个网站时这个设置就非常有用,如果服务器中的某个网站被攻击了,可以避免其他网站也沦陷


案例

例如,如下服务器


当该服务器的的192.168.2.128站点被入侵的时候,如果没有设置防跨站他是可以访问其他的网站的内容的

如果设置了防跨站的话,是可以防止这种事情发生的

以看到访问错误,不过单纯使用open_basedir是有被绕过的风险,上传一个带有如下内容的php文件


<?php $a='chdir';$b='ini_set';mkdir('mi1k7ea');$a('mi1k7ea');$b('open_basedir','..');$a('..');$a('..');$a('..');$a('..');$b('open_basedir','/');echo file_get_contents('/etc/passwd');


访问该php文件,可以成功获取到/etc/passwd文件里面的内容

安装堡塔php安全防护后,进行设置

具体使用说明

https://www.bt.cn/bbs/forum.php?mod=viewthread&tid=49256&highlight=%E5%A0%A1%E5%A1%94php

开启堡塔php安全防护后,已经成功拦截

2.4 使用企业级防篡改











thinkphp中默认是两个目录是存在写入和删除的。一个是缓存目录cache 一个是上传目录upload(并不是全部都是通用的根据项目自身去写规则)。这里我使用的是智宇发卡的程序来做的测试












智宇发卡这个程序就两个目录需要写入和删除。一个是runtime 目录和/static/upload 这两个目录需要写入。那么先把企业级防篡改的保护目录全部清空

只留下这两个目录即可。测试一下效果


<?php file_put_contents('aaa.php','aaa');

测试为:写入不了文件

2.5 webshell防御--OpenRasp 











webshell防御的话。这里使用的百度的Openrasp

具体的使用教程

https://www.bt.cn/bbs/thread-49371-1-1.html












直接安装即可

测试效果如下:

使用方法,在该网站放了一个webshell

执行php代码,被拦截

成功被拦截


三、ThinkPHP其他安全设置



3.1 关闭debug

在线上环境,开启Debug模式会导致如下危害

泄露网站敏感信息

Thinkphp5.0.24版本开启Debug模式的时候,在特定情况下会导致mysql数据库账号密码泄露

在某些Thinkphp版本要开启Debug模式才会导致代码执行漏洞

一般配置文件项目地址中的/application/config.php 文件中

3.2 设置日志输出

日志文件他存储在runtime/log/下面,上面也有讲解案例和危害,如果我们可以输出日志的内容就可以避免一些攻击,一般的日志输出会输出大部分的敏感信息,就想上面一样,登录的账号密码都会被记录,如果我们只输出错误的信息,就可以避免上面的敏感信息泄露出去


修复方法

只输出错误的日志

或者直接关闭日志的输出


四、其他安全设置



1、服务器密码和网站密码全部分开

2、数据库密码和网站密码。和FTP密码全部独立

3、密码建议为md5的随机强密码这样减少被爆破的风险


五、总结



  • Thinkphp的MVC的单一入口的解决方案可以解决掉很多的一些安全问题。但是还是需要配合一些安全产品来更多的安全风险

  • 后续我们会持续更新更多的项目的安全策略。敬请期待

  • 如果此文章对你有帮助请转发至朋友圈中让更多人能学习


当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »
因本文不是用Markdown格式的编辑器书写的,转换的页面可能不符合MIP标准。