分类: WEB安全
PHP安全指南
Mysql安全指南
禁用local-infile选项访问控制描述
禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力检查提示
–加固建议
编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置local-infile参数为0,并重启mysql服务:
local-infile=0
确保没有用户配置了通配符主机名身份鉴别描述
避免在主机名中只使用通配符,有助于限定可以连接数据库的客户端,否则服务就开放到了公网检查提示
–加固建议
执行SQL更新语句,为每个用户指定允许连接的host范围。
- 登录数据库,执行
use mysql;
; - 执行语句
select user,Host from user where Host='%';
查看HOST为通配符的用户; - 删除用户或者修改用户host字段,删除语句:
DROP USER 'user_name'@'%';
。更新语句:update user set host = <new_host> where host = '%';
。 - 执行SQL语句:
OPTIMIZE TABLE user;
flush privileges;
禁用symbolic-links选项服务配置描述
禁用符号链接以防止各种安全风险检查提示
–加固建议
编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld] 段落中配置symbolic-links=0
,5.6及以上版本应该配置为skip_symbolic_links=yes
,并重启mysql服务。
修改默认3306端口服务配置描述
避免使用熟知的端口,降低被初级扫描的风险检查提示
–加固建议
编辑<conf_path>/my.cnf文件,[mysqld] 段落中配置新的端口参数,并重启MySQL服务:
port=3506
为MySQL服务使用专用的最低特权账户访问控制描述
使用最低权限账户运行服务可减小MySQL天生漏洞的影响。受限账户将无法访问与MySQL无关的资源,例如操作系统配置。检查提示
–加固建议
使用非root和非sudo权限用户启动MySQL服务
禁止使用–skip-grant-tables选项启动MySQL服务访问控制描述
使用此选项,会导致所有客户端都对所有数据库具有不受限制的访问权限。检查提示
–加固建议
编辑Mysql配置文件<conf_path>/my.cnf,删除skip-grant-tables参数,并重启mysql服务
删除’test’数据库服务配置描述
测试数据库可供所有用户访问,并可用于消耗系统资源。删除测试数据库将减少MySQL服务器的攻击面。检查提示
–加固建议
登录数据库执行以下SQL语句删除test数据库:
DROP DATABASE test;
flush privileges;
确保配置了log-error选项安全审计描述
启用错误日志可以提高检测针对mysql和其他关键消息的恶意尝试的能力,例如,如果错误日志未启用,则连接错误可能会被忽略。检查提示
–加固建议
编辑Mysql配置文件<conf_path>/my.cnf,在[mysqld_safe] 段落中配置log-error参数,<log_path>代表存放日志文件路径,如:/var/log/mysqld.log,并重启mysql服务:
log-error=<log_path>
确保log-raw选项没有配置为ON安全审计描述
当log-raw记录启用时,有权访问日志文件的人可能会看到纯文本密码。检查提示
–加固建议
编辑Mysql配置文件<conf_path>/my.cnf,删除log-raw参数,并重启mysql服务
匿名登录检查身份鉴别描述
检查MySQL服务是否允许匿名登录检查提示
–加固建议
登录MySQL数据库,执行以下命令删除匿名账户:
delete from user where user='';
flush privileges;
数据库登录弱口令身份鉴别描述
若系统使用弱口令,存在极大的被恶意猜解入侵风险,需立即修复。检查提示
–加固建议
登录mysql数据库;
查看数据库用户密码信息:`SELECT user, host, authentication_string FROM user;` 部分版本查询命令为:`SELECT user, host, password FROM user;`
根据查询结果及弱密码告警信息修改具体用户的密码:`SET PASSWORD FOR '用户名'@'主机' = PASSWORD('新密码');`
执行刷新命令:`flush privileges;`
新口令应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等
Redis安全指南
开启redis密码认证,并设置高复杂度密码 身份鉴别描述
redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证。 redis因查询效率高,auth这种命令每秒能处理9w次以上,简单的redis的密码极容易为攻击者暴破。 检查提示
存在弱密码(配置文件|密码):/usr/local/redis/etc/redis.conf|加固建议
打开redis.conf,找到requirepass所在的地方,修改为指定的密码,密码应符合复杂性要求:
1、长度8位以上
2、包含以下四类字符中的三类字符:
英文大写字母(A 到 Z)
英文小写字母(a 到 z)
10 个基本数字(0 到 9)
非字母字符(例如 !、$、#、%、@、^、&)
3、避免使用已公开的弱口令,如:abcd.1234 、admin@123等
再去掉前面的#号注释符,然后重启redis
禁止监听在公网 访问控制描述
Redis监听在0.0.0.0,可能导致服务对外或内网横向移动渗透风险,极易被黑客利用入侵。\u0009检查提示
–加固建议
在redis的配置文件redis.conf中配置如下: bind 127.0.0.1或者内网IP,然后重启redis
禁止使用root用户启动 访问控制描述
使用root权限去运行网络服务是比较有风险的(nginx和apache都是有独立的work用户,而redis没有)。redis crackit 漏洞就是利用root用户的权限来替换或者增加authorized_keys,来获取root登录权限的 检查提示
–加固建议
使用root切换到redis用户启动服务:
useradd -s /sbin/nolog -M redis
sudo -u redis /<redis-server-path>/redis-server /<configpath>/redis.conf 2&1>/dev/null &
打开保护模式 访问控制描述
redis默认开启保护模式。要是配置里没有指定bind和密码,开启该参数后,redis只能本地访问,拒绝外部访问。检查提示
–加固建议
redis.conf安全设置: # 打开保护模式 protected-mode yes
版本存在安全漏洞入侵防范描述
Redis以下版本存在漏洞,容易被入侵 1. Redis 2.8.1 之前版本和 3.0.2 之前 3.x 版本存在字节码命令执行漏洞 https://avd.aliyun.com/detail?id=AVD-2015-4335 2. Redis 4.x至5.0.5版本存在主从复制命令执行漏洞 3. Redis 3.2.0 至 3.2.4 版本存在缓冲区溢出漏洞,可导致任意代码执行 https://avd.aliyun.com/detail?id=AVD-2016-8339检查提示
–加固建议
更新服务至最新版本,完成漏洞的修复,这些漏洞基于未授权访问或者服务存在弱口令,完成访问认证加固可降低被入侵风险。
限制redis 配置文件访问权限 文件权限描述
因为redis密码明文存储在配置文件中,禁止不相关的用户访问改配置文件是必要的,设置redis配置文件权限为600, 检查提示
–加固建议
执行以下命令修改配置文件权限:
chmod 600 /<filepath>/redis.conf
修改默认6379端口 服务配置描述
避免使用熟知的端口,降低被初级扫描的风险 检查提示
–加固建议
编辑文件redis的配置文件redis.conf,找到包含port的行,将默认的6379修改为自定义的端口号,然后重启redis
禁用或者重命名危险命令 入侵防范描述
Redis中线上使用keys *命令是非常危险的,应该禁用或者限制使用这些危险的命令,可降低Redis写入文件漏洞的入侵风险。检查提示
–加固建议
修改 redis.conf 文件,添加
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""
rename-command SHUTDOWN ""
rename-command DEL ""
rename-command EVAL ""
然后重启redis。 重命名为”” 代表禁用命令,如想保留命令,可以重命名为不可猜测的字符串,如: rename-command FLUSHALL joYAPNXRPmcarcR4ZDgC
Redis未授权访问身份鉴别描述
Redis端口对外开放并且没有配置认证选项,未授权用户除了可直接获取数据库中所有信息,造成严重的信息泄露外,还可以通过未授权访问漏洞入侵攻击系统。检查提示
–加固建议
可以使用以下方法修复: 1、为Redis服务配置认证,在配置文件redis.conf中requirepass 配置复杂密码,然后重启redis。 2、在Redis的配置文件redis.conf中配置如下: bind 127.0.0.1,只允许本机访问,然后重启redis
Nginx安全指南
Nginx后端服务指定的Header隐藏状态服务配置描述
隐藏Nginx后端服务X-Powered-By头检查提示
–加固建议
隐藏Nginx后端服务指定Header的状态:
1、打开conf/nginx.conf
配置文件;
2、在http
下配置proxy_hide_header
项; 增加或修改为 proxy_hide_header X-Powered-By;
proxy_hide_header Server;
应为每个核心站点启用access_log指令
默认情况下启用。检查提示
–加固建议
开启Nginx的WEB访问日志记录:
1、打开conf/nginx.conf
配置文件,含主配置文件中include项包含的子配置文件;
2、在http下配置access_log
项access_log logs/host.access.log main;
3、并在主配置文件,及主配置文件下的include文件中 删除off
项或配置为适当值
确保NGINX配置文件权限为644文件权限描述
把控配置文件权限以抵御外来攻击检查提示
–加固建议
修改Nginx配置文件权限: 执行chmod 644 <conf_path>
来限制Nginx配置文件的权限;(<conf_path>为配置文件的路径,如默认/安装目录/conf/nginx.conf或者/etc/nginx/nginx.conf,或用户自定义,请 自行查找)
检查是否配置Nginx账号锁定策略。身份鉴别描述
1.执行系统命令passwd -S nginx来查看锁定状态 出现Password locked证明锁定成功 如:nginx LK ….. (Password locked.)或nginx L ….
2.默认符合,修改后才有(默认已符合)
3.执行系统命令passwd -l nginx进行锁定检查提示
–加固建议
配置Nginx账号登录锁定策略: Nginx服务建议使用非root用户(如nginx,nobody)启动,并且确保启动用户的状态为锁定状态。可执行passwd -l <Nginx启动用户> 如passwd -l nginx
来锁定Nginx服务的启动用户。命令 passwd -S <用户>
如passwd -S nginx
可查看用户状态。 修改配置文件中的nginx启动用户修改为nginx或nobody 如: user nobody;
如果您是docker用户,可忽略该项(或添加白名单)
检查Nginx进程启动账号。服务配置描述
Nginx进程启动账号状态,降低被攻击概率检查提示
–加固建议
修改Nginx进程启动账号:
1、打开conf/nginx.conf
配置文件;
2、查看配置文件的user配置项,确认是非root启动的;
3、如果是root
启动,修改成nobody
或者nginx账号
; 备注:
4、修改完配置文件之后需要重新启动Nginx。
隐藏Nginx服务的Banner服务配置描述
Nginx服务的Banner隐藏状态检查提示
–加固建议
Nginx后端服务指定的Header隐藏状态隐藏Nginx服务Banner的状态:
1、打开conf/nginx.conf
配置文件;
2、在server栏目下,配置server_tokens
项 server_tokens off;
如出现多项不支持,执行ln <conf_path> /etc/nginx/nginx.conf
针对Nginx SSL协议进行安全加固服务配置描述
Nginx SSL协议的加密策略进行加固检查提示
–加固建议
Nginx SSL协议采用TLSv1.2:
1、打开conf/nginx.conf
配置文件(或主配置文件中的inlude文件);
2、配置
server {
...
ssl_protocols TLSv1.2;
...
}
备注:配置此项请确认nginx支持OpenSSL,运行nginx -V
如果返回中包含built with OpenSSL
则表示支持OpenSSL。 如不支持,可能需要增加配置ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 如果尚未配置ssl协议,请尽快配置(参考连接https://www.nginx.cn/doc/optional/ssl.html)
确保已禁用自动索引模块访问控制描述
自动索引模块处理以斜杠字符结尾的请求。此功能启用目录列表,这在攻击者侦察中可能很有用,因此应将其禁用。检查提示
–加固建议
执行以下操作以禁用自动索引模块: 搜索NGINX配置文件(NGINX.conf和任何包含的配置文件)以查找autoindex指令。egrep -i '^\s*autoindex\s+' <main_config_path>
egrep -i '^\s*autoindex\s+' <sub_config_path>
在location下删除或者修改为 autoindex off;
网络安全 渗透测试 知识汇总
常见攻击方式和漏洞
DDOS 和 CC 攻击
什么是 DDoS 攻击?-知乎
DDoS话题 -知乎
DDOS百度百科,ddos在传输层使用各种方式,挤兑占用服务器资源,造成正常用户无法访问。
CC攻击百度百科,cc攻击是ddos攻击的一种方式,在应用层,使用代理方式对服务器资源进行占用挤兑,造成正常用户无法访问。
防御
DDOS 攻击的防范教程 – 阮一峰
付费产品
WEB常见漏洞
汇总一些常用的渗透测试方法和工具,用于安全测试
kail linux 渗透测试专用操作系统
渗透测试
https://github.com/GoVanguard/legion
https://github.com/secforce/sparta
sqlmap sql注入扫描工具
DNSLog
是一种回显机制,攻击者可以通过DNS的解析日志来读取漏洞执行的回显结果。
http://www.dnslog.cn/
http://ceye.io
服务器挖矿木马[kthreaddi]处理记录
参考
Linux – kthreaddi 进程导致CPU超高问题 处理记录
第一次处理
使用参考链接2方式,清除了定时任务,kill -s 9 进程之后正常了。由于同事离职没有收到反馈并继续观察。
第二次处理
后续接手项目,发现又有了继续按原方法清理定时任务,发现一条特别的定时任务,路径在/data/wwwroot/default/phpmyadmin 下,[kthreaddi]进程用户是www可能是通过php web方式注入的。看了一下使用oneinstack脚本后没有删除默认工具目录,于是删除default目录。然后禁用nginx默认虚拟主机使其无法通过ip访问,使用安全组关闭其他端口只开放常用端口。
kill 进程,发现没有用还是会自动重启,看了参考链接1的方式,得到灵感猜想可能有另一个进程负责重启[kthreaddi]进程。使用netstat -ltnp命令发现了一个非法进程监听 52281端口
于是kill 掉 非法进程,然后kill 掉 [kthreaddi] 进程,top命令观察发现正常了。
总结
此类木马通过定时任务重启,也可能结合systemd 或init脚本开机自启, 也可能使用其它伪装的正常进程来重启
延展阅读,更复杂案例top查看不到进程
【漏洞预警】Laravel <= 8.4.2 Debug模式 _ignition 远程代码执行漏洞
https://help.aliyun.com/noticelist/articleid/1060782748.html
2021年1月13日,阿里云应急响应中心监控到国外某安全研究团队披露了Laravel <= 8.4.2 存在远程代码执行漏洞。
漏洞描述
Laravel 是一个免费的开源 PHP Web 框架,旨在实现的Web软件的MVC架构。2021年1月13日,阿里云应急响应中心监控到国外某安全研究团队披露了 Laravel <= 8.4.2 存在远程代码执行漏洞。当Laravel开启了Debug模式时,由于Laravel自带的Ignition功能的某些接口存在过滤不严,攻击者可以发起恶意请求,通过构造恶意Log文件等方式触发Phar反序列化,从而造成远程代码执行,控制服务器。漏洞细节已在互联网公开。阿里云应急响应中心提醒 Laravel 用户尽快采取安全措施阻止漏洞攻击。
影响版本
Laravel 框架 < 8.4.3
facade ignition 组件 < 2.5.2
安全版本
Laravel 框架 >= 8.4.3
facade ignition 组件 >= 2.5.2
安全建议
建议将 Laravel 框架升级至8.4.3及其以上版本,或者将 facade ignition组件升级至 2.5.2 及其以上版本。
相关链接
漏洞修复
参考
- https://blog.csdn.net/Allyli0022/article/details/86219265
- https://www.cnblogs.com/lsdb/p/8204578.html
允许Traceroute探测
本插件使用Traceroute探测来获取扫描器与远程主机之间的路由信息。攻击者也可以利用这些信息来了解目标网络的网络拓扑。
在防火墙中禁用Time Exceeded类型的ICMP包 |
Iptales防火墙
sudo iptables -A INPUT -p ICMP --icmp-type time-exceeded -j DROP
sudo iptables -A OUTPUT -p ICMP --icmp-type time-exceeded -j DROP
sudo service iptables save
sudo service iptables restart
可通过HTTP获取远端WWW服务信息
nginx
配置 server_tokens off
apache
- ServerSignature off;
- ServerToken Prod;
php
配置 expose_php off https://www.php.net/manual/zh/ini.core.php#ini.expose-php
目标主机rpcinfo -p信息泄露
检测到远端RPCBIND/PORTMAP正在运行中(CVE-1999-0632)
探测到SSH服务器支持的算法
无法处理。ssh协议协商过程就是服务端要返回其支持的算法列表。
SSH版本信息可被获取
无法处理。sshd_config中的Banner项只是ssh主机前输出的信息,源码处理机制就是telnet其端口就会返回版本信息。
WEB应用常见漏洞
Sql注入
原理:利用网页程序没有对传参进行过滤,执行不允许的sql语句获取重要数据 百度百科 维基百科
防御
后端程序对请求参数进行严格过滤,使用框架的查询构造器和ORM操作Sql,禁止直接用代码拼接sql语句
SQL注入详解
XSS(Cross site scripting 跨站脚本攻击)
原理 前端运行了用户输入的恶意js脚本
防御
php函数htmlspecialchars转义html标签
过滤敏感js标签 ezyang/htmlpurifier,
现代前端框架会自动处理xss问题
CSRF(Cross-site request forgery 跨站请求伪造)
原理 MDN文档说明
防御
SSRF(Server-Side Request Forgery 服务器端请求伪造)
原理
防御
XXE(XML外部实体注入)
原理
防御
参考