当前位置:论坛首页 > Linux面板 > Linux面板教程

堡塔安全插件之间的联动教你如何防御网站被入侵和溯源...

发表在 Linux面板2020-8-7 10:48 [复制链接] 5 5442

前言
      在当前互联网极速发展的时代,网络攻击手段也在极速的发展中,由于种种问题导致服务器被黑客渗透,下面就来介绍一下如何使用宝塔的插件,让黑客寸步难行

安全插件联动一、Nginx防火墙插件和企业级防篡改插件联动
    用过企业级防篡改的人都知道,企业级防篡改有些目录是不进行监控的,相当于白名单的意思,这就给了黑客一个突破的点,如果他们可以把php文件写入到那些不监控的目录,那么就成功突破了企业级防篡改插件,不过我们可以利用Nginx防火墙来进行补掉这个点
例如有如下代码

image-20200806151121302.png
他把文件写入到了config目录下的a.php中,然后在企业级防篡改中默认是不监控config目录的,所以写入的时候会写入成功
image-20200806151325871.png
写入php内容
image-20200806151537131.png
可以看到是没有报错,那代表是写入成功的意思。访问config/a.php
image-20200806151715343.png
不过我们可以在Nginx防火墙中,把那些企业级防篡改排除的目录加入到Nginx防火墙的URL黑名单中,这样别人就不可以访问到这个php文件了
image-20200806152027304.png
设置完成后访问刚刚写入的a.php
image-20200806152057508.png

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

再次访问config/a.php
image-20200806152815666.png
也是达到了一样的效果

思路总结:
       利用黑白名单的思路。来结合两个防护插件的不足之处相互补充的地方。这样可以更好的守护网站的安全。

二、Nginx防火墙插件和PHP安全防护的联动
      Nginx防火墙可以防御一些基本且常见的漏洞,但是某些低版本是存在绕过的问题(建议升级到最新版版)。所以这个时候使用堡塔的PHP安全防护就是特别有必要的地方了。
例如典型的thinkphp的代码执行漏洞,使用如下payload
  1. ?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]=phpinfo();
复制代码

防火墙拦截了
image-20200806154928521.png
使用如下payload
  1. ?s=index/think\app/invokefunction&function=array_map&vars[]=assert&vars[][]='phpinfo'();
复制代码

假设绕过了Nginx防火墙
image-20200806164429565.png

配合上我们的堡塔php安全防护,并且制定tp5.0规则
image-20200806155216400.png
再次使用刚刚的Payload,成功拦截掉了
image-20200806155250225.png
不过这里会暴露我们网站的绝对路径,按照下面配置屏蔽错误信息
image-20200806174232778.png
保存然后重启php服务,配置就生效了,再次访问
image-20200806174329433.png

思路总结:
     利用多层次的防御手段会有更多方面的一个安全效果

三、全家桶
    下面先用一个有漏洞的网站进行测试
假设下面是黑客攻击的目标
image-20200806162805902.png
假设黑客通过fuzz手段成功找到了一个任意文件读取漏洞
image-20200806171837520.png
通过读取配置成功获取到一个外部链接的mysql账号密码
image-20200806164248773.png
发现进去mysql不可以执行命令,黑客想起网站的界面是一个典型的tp的网站,直接使用payload测试了一下
发现有这个漏洞,就直接上传大马来执行命令,假设站点没有禁用system函数
image-20200806165940548.png
这样黑客就已经成功获取到了www用户的权限,最后黑客就会通过一些漏洞进行提权操作,这里就不演示了

防御方案
Nginx防火墙+PHP安全防护+企业级防篡改+OpenRasp+防提权
为什么要用这么多插件才可以抵御大部分的攻击呢?
这些插件都是根据黑客攻击流程进行定制的,黑客一般攻击流程:
寻找网站程序漏洞->查找该cms或框架是否有漏洞->上传木马->执行命令->提权
首先按照前面的Nginx防火墙加上企业级防篡改联动进行配置,把排除的目录放到Nginx的URI中
image-20200806172130228.png

image-20200806172118522.png
然后就是根据我们使用的框架或者cms,配置属于他的规则
image-20200806161016298.png
开启OpenRasp
image-20200806170332618.png
最后就是开启防提权了
image-20200806161102313.png
刚刚的文件包含漏洞,拦截
image-20200806172235114.png
tp5的rce,拦截
image-20200806174344862.png

假设黑客都成功绕过了上面的拦截,接下来就是利用WebShell执行命令了,直接被OpenRasp拦截
openRasp拦截.gif
假设绕过了OpenRasp,黑客肯定要尝试进行系统命令执行,被宝塔防提权拦截,如果设置了提醒还会发邮件提醒,让你第一时间收到网站被黑的消息
image-20200806173246852.png
总结:
     通过各个方面去剖析黑客的一个攻击流量。然后达到一个各个方向的一个防御。和通过这种案例来结合实际的用法。能更好的达到一个防御的效果

三、溯源小技巧Nginx 记录POST记录并设置日志只允许追加
   之前想融入到默认配置中。但是还是有一些会出现疑问。只能以文章的形式来配置
之前想过异步的存储日志的方式。尝试udp 的方式也是挺消耗性能。未找到一种合理的解决方案。
一、Nginx 的默认日志文件如下:
  1. #设定日志格式,main是默认的格式
  2. log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  3.                     '$status $body_bytes_sent "$http_referer" '
  4.                     '"$http_user_agent" "$http_x_forwarded_for"';
复制代码

二、Nginx的内置函数

  1. $args                    #请求中的参数值
  2. $query_string            #同 $args
  3. $arg_NAME                #GET请求中NAME的值
  4. $is_args                 #如果请求中有参数,值为"?",否则为空字符串
  5. $uri                     #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。
  6. $document_uri            #同 $uri
  7. $document_root           #当前请求的文档根目录或别名
  8. $host                    #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称
  9. $hostname                #主机名
  10. $https                   #如果开启了SSL安全模式,值为"on",否则为空字符串。
  11. $binary_remote_addr      #客户端地址的二进制形式,固定长度为4个字节
  12. $body_bytes_sent         #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容
  13. $bytes_sent              #传输给客户端的字节数
  14. $connection              #TCP连接的序列号
  15. $connection_requests     #TCP连接当前的请求数量
  16. $content_length          #"Content-Length" 请求头字段
  17. $content_type            #"Content-Type" 请求头字段
  18. $cookie_name             #cookie名称
  19. $limit_rate              #用于设置响应的速度限制
  20. $msec                    #当前的Unix时间戳
  21. $nginx_version           #nginx版本
  22. $pid                     #工作进程的PID
  23. $pipe                    #如果请求来自管道通信,值为"p",否则为"."
  24. $proxy_protocol_addr     #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串
  25. $realpath_root           #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径
  26. $remote_addr             #客户端地址
  27. $remote_port             #客户端端口
  28. $remote_user             #用于HTTP基础认证服务的用户名
  29. $request                 #代表客户端的请求地址
  30. $request_body            #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器
  31. $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
  32. $request_completion      #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空
  33. $request_filename        #当前连接请求的文件路径,由root或alias指令与URI请求生成
  34. $request_length          #请求的长度 (包括请求的地址,http请求头和请求主体)
  35. $request_method          #HTTP请求方法,通常为"GET"或"POST"
  36. $request_time            #处理客户端请求使用的时间,单位为秒,精度毫秒;从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。
  37. $request_uri             #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"
  38. $scheme                  #请求使用的Web协议,"http" 或 "https"
  39. $server_addr             #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中
  40. $server_name             #服务器名
  41. $server_port             #服务器端口
  42. $server_protocol         #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"
  43. $status                  #HTTP响应代码
  44. $time_iso8601            #服务器时间的ISO 8610格式
  45. $time_local              #服务器时间(LOG Format 格式)
  46. $cookie_NAME             #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值
  47. $http_NAME               #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",使用$http_accept_language即可
  48. $http_cookie
  49. $http_host               #请求地址,即浏览器中你输入的地址(IP或域名)
  50. $http_referer            #url跳转来源,用来记录从那个页面链接访问过来的
  51. $http_user_agent         #用户终端浏览器等信息
  52. $http_x_forwarded_for
  53. $sent_http_NAME          #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可
  54. $sent_http_cache_control
  55. $sent_http_connection
  56. $sent_http_content_type
  57. $sent_http_keep_alive
  58. $sent_http_last_modified
  59. $sent_http_location
  60. $sent_http_transfer_encoding
复制代码

如果只是记录POST的话。只需要加一个参数$request_body
如下:
  1. log_format access '$remote_addr - $remote_user [$time_local] "$request" '
  2. '$status  $body_bytes_sent "$http_referer" '
  3. '"$http_user_agent" "$http_x_forwarded_for" "$request_body"';
复制代码

微信图片_20200807103152.jpg
然后找到网站的配置文件
微信图片_20200807103231.jpg
点击保存即可。访问之后呢,返回的日志格式为
  1. <blockquote>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 的日志的记录会在最后面。这样不影响大多数数据分析工具。

三、设置日志只允许追加
有时候大多数情况下,黑客都会及时的清理日志。这个时候需要配置一些让人恶心的动作了

  1. chattr +a /www/wwwlogs/*.log
复制代码

当对方尝试清空日志的时候
微信图片_20200807103312.jpg
会被直接拒绝清空日志。
有时候会碰到日志切割的问题。只需要在日志切割的地方取消a 然后切割完之后加上去即可
取消a 的方法
  1. chattr -a /www/wwwlogs/*.log
复制代码

总结:
      如上的方式是为了能让所有的访问日志不留余力的在你面前展示。可以通过这些攻击日志来确认你的漏洞点的位置,能达到一个及时响应的一个效果。(PS:这个需要自己一个个做设置,网站多的话可能会自闭)


使用道具 举报 只看该作者 回复
发表于 2020-8-22 16:25:35 | 显示全部楼层
大佬是真正的大牛人物啊
使用道具 举报 回复 支持 反对
发表于 2020-8-12 11:53:40 | 显示全部楼层
非常感谢楼主辛苦码字分享!
使用道具 举报 回复 支持 反对
发表于 2020-8-7 12:11:02 | 显示全部楼层
very good                  
使用道具 举报 回复 支持 反对
发表于 2020-8-7 11:07:13 | 显示全部楼层
very good
使用道具 举报 回复
发表于 2020-8-7 11:05:53 | 显示全部楼层
大佬辛苦了
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

企业版年付运维跟进群

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急问题处理

论坛响应时间:10分钟

问题处理方式:1对1处理(优先)

工作时间:白班:9:00 - 18:00

工作时间:晚班:18:00 - 24:00

立即付费处理
快速回复 返回顶部 返回列表