在当前互联网极速发展的时代,网络攻击手段也在极速的发展中,比如之前虾皮路知道的因为BT宝塔面板爆出的重大安全问题《突发!BT宝塔面板爆出重大漏洞 数据库无需口令直接登陆》,由于种种问题导致网站服务器被…
在当前互联网极速发展的时代,网络攻击手段也在极速的发展中,比如之前it168资讯知道的因为BT宝塔面板爆出的重大安全问题《突发!BT宝塔面板爆出重大漏洞 数据库无需口令直接登陆》,由于种种问题导致网站服务器被黑客渗透。其实通过一些设置,可以让自己网站的安全防御抵挡大部分的安全攻击等。下面就来介绍一下如何使用BT宝塔的插件,让黑客寸步难行。
还没安装BT宝塔面板?点击如下安装:
宝塔服务器面板,一键全能部署及管理,送你3188元礼包,点我领取
一、Nginx防火墙插件和企业级防篡改插件联动
用过企业级防篡改的人都知道,企业级防篡改有些目录是不进行监控的,相当于白名单的意思,这就给了黑客一个突破的点,如果他们可以把php文件写入到那些不监控的目录,那么就成功突破了企业级防篡改插件,不过我们可以利用Nginx防火墙来进行补掉这个点。例如有如下代码

他把文件写入到了config目录下的a.php中,然后在企业级防篡改中默认是不监控config目录的,所以写入的时候会写入成功

写入php内容

可以看到是没有报错,那代表是写入成功的意思。访问config/a.php

不过我们可以在Nginx防火墙中,把那些企业级防篡改排除的目录加入到Nginx防火墙的URL黑名单中,这样别人就不可以访问到这个php文件了

设置完成后访问刚刚写入的a.php

除了防火墙还可以使用堡塔php安全防护进行拦截还是刚刚的案例。这里使用的不允许config 访问

再次访问config/a.php

也是达到了一样的效果
思路总结:
利用黑白名单的思路,来结合两个防护插件的不足之处相互补充的地方。这样可以更好的守护网站的安全。
二、Nginx防火墙插件和PHP安全防护的联动
Nginx防火墙可以防御一些基本且常见的漏洞,但是某些低版本是存在绕过的问题(建议升级到最新版版)。所以这个时候使用堡塔的PHP安全防护就是特别有必要的地方了。
例如典型的thinkphp的代码执行漏洞,使用如下payload
?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]=phpinfo();
显示防火墙拦截了

使用如下payload
?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]='phpinfo'();
假设绕过了Nginx防火墙

配合上我们的堡塔php安全防护,并且制定tp5.0规则

再次使用刚刚的Payload,成功拦截掉了

不过这里会暴露我们网站的绝对路径,按照下面配置屏蔽错误信息

保存然后重启php服务,配置就生效了,再次访问

思路总结:
利用多层次的防御手段会有更多方面的一个安全效果。
三、攻击及防御测试
下面先用一个有漏洞的网站进行测试假设下面是黑客攻击的目标

假设黑客通过fuzz手段成功找到了一个任意文件读取漏洞

通过读取配置成功获取到一个外部链接的mysql账号密码

发现进去mysql不可以执行命令,黑客想起网站的界面是一个典型的tp的网站,直接使用payload测试了一下发现有这个漏洞,就直接上传大马来执行命令,假设站点没有禁用system函数

这样黑客就已经成功获取到了www用户的权限,最后黑客就会通过一些漏洞进行提权操作,这里就不演示了
防御方案
Nginx防火墙+PHP安全防护+企业级防篡改+OpenRasp+防提权为什么要用这么多插件才可以抵御大部分的攻击呢?这些插件都是根据黑客攻击流程进行定制的。
黑客一般攻击流程:寻找网站程序漏洞->查找该cms或框架是否有漏洞->上传木马->执行命令->提权
首先按照前面的Nginx防火墙加上企业级防篡改联动进行配置,把排除的目录放到Nginx的URI中


然后就是根据我们使用的框架或者cms,配置属于他的规则

开启OpenRasp

最后就是开启防提权了

刚刚的文件包含漏洞,拦截

tp5的rce,拦截

假设黑客都成功绕过了上面的拦截,接下来就是利用WebShell执行命令了,直接被OpenRasp拦截

假设绕过了OpenRasp,黑客肯定要尝试进行系统命令执行,被宝塔防提权拦截,如果设置了提醒还会发邮件提醒,让你第一时间收到网站被黑的消息

总结: 通过各个方面去剖析黑客的一个攻击流量。然后达到一个各个方向的一个防御。和通过这种案例来结合实际的用法。能更好的达到一个防御的效果
四、Nginx 记录POST记录并设置日志只允许追加
之前想融入到默认配置中。但是还是有一些会出现疑问。只能以文章的形式来配置之前想过异步的存储日志的方式,尝试udp 的方式也是挺消耗性能,未找到一种合理的解决方案。
1、Nginx 的默认日志文件如下
#设定日志格式,main是默认的格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
2、Nginx的内置函数
$args #请求中的参数值
$query_string #同 $args
$arg_NAME #GET请求中NAME的值
$is_args #如果请求中有参数,值为"?",否则为空字符串
$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
$document_uri #同 $uri
$document_root #当前请求的文档根目录或别名
$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
$hostname #主机名
$https #如果开启了SSL安全模式,值为"on",否则为空字符串。
$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节
$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
$bytes_sent #传输给客户端的字节数
$connection #TCP连接的序列号
$connection_requests #TCP连接当前的请求数量
$content_length #"Content-Length" 请求头字段
$content_type #"Content-Type" 请求头字段
$cookie_name #cookie名称
$limit_rate #用于设置响应的速度限制
$msec #当前的Unix时间戳
$nginx_version #nginx版本
$pid #工作进程的PID
$pipe #如果请求来自管道通信,值为"p",否则为"."
$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
$remote_addr #客户端地址
$remote_port #客户端端口
$remote_user #用于HTTP基础认证服务的用户名
$request #代表客户端的请求地址
$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off
$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成
$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)
$request_method #HTTP请求方法,通常为"GET"或"POST"
$request_time #处理客户端请求使用的时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
$scheme #请求使用的Web协议,"http" 或 "https"
$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
$server_name #服务器名
$server_port #服务器端口
$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
$status #HTTP响应代码
$time_iso8601 #服务器时间的ISO 8610格式
$time_local #服务器时间(LOG Format 格式)
$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",使用$http_accept_language即可
$http_cookie
$http_host #请求地址,即浏览器中你输入的地址(IP或域名)
$http_referer #url跳转来源,用来记录从那个页面链接访问过来的
$http_user_agent #用户终端浏览器等信息
$http_x_forwarded_for
$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
$sent_http_cache_control
$sent_http_connection
$sent_http_content_type
$sent_http_keep_alive
$sent_http_last_modified
$sent_http_location
$sent_http_transfer_encoding
如果只是记录POST的话。只需要加一个参数$request_body
如下
log_format access '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_body"';

然后找到网站的配置文件

点击保存即可。访问之后呢,返回的日志格式为
192.168.10.1 - - [06/Aug/2020:15:55:41 +0800] "GET / HTTP/2.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36" "-" "-"
POST 的日志的记录会在最后面。这样不影响大多数数据分析工具。
3、设置日志只允许追加
有时候大多数情况下,黑客都会及时的清理日志。这个时候需要配置一些让人恶心的动作了
chattr +a /www/wwwlogs/*.log
当对方尝试清空日志的时候

会被直接拒绝清空日志。有时候会碰到日志切割的问题。只需要在日志切割的地方取消a 然后切割完之后加上去即可取消a 的方法
chattr -a /www/wwwlogs/*.log
安全防御设置总结
如上的方式是为了能让所有的访问日志不留余力的在你面前展示。可以通过这些攻击日志来确认你的漏洞点的位置,能达到一个及时响应的一个效果。
PS:这个需要自己一个个做设置,网站多的话可能会自闭。
还没安装BT宝塔面板?点击如下安装:
原创文章,作者:admin,如若转载,请注明出处:https://www.it168.online/webtech/2368/