web上常见的攻击方式及简单的防御方法
SQL注入
最常见的攻击方式,所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
跨站脚本攻击(XSS)
跨站脚本攻击(也称为XSS)指利用网站漏洞从用户那里恶意盗取信息。
文件包含
由于开发人员编写源码,开放着将可重复使用的代码插入到单个的文件中,并在需要的时候将它们包含在特殊的功能代码文件中,然后包含文件中的代码会被解释执行。由于并没有针对代码中存在文件包含的函数入口做过滤,导致客户端可以提交恶意构造语句提交,并交由服务器端解释执行。文件包含攻击中WEB服务器源码里可能存在inlcude()此类文件包含操作函数,可以通过客户端构造提交文件路径,是该漏洞攻击成功的最主要原因。
代码执行
远程命令执行漏洞,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许攻击者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码。
文件上传
利用上传漏洞可以直接得到WEBSHELL,危害等级超级高,现在的入侵中上传漏洞也是常见的漏洞。
导致该漏洞的原因在于代码作者没有对访客提交的数据进行检验或者过滤不严,可以直接提交修改过的数据绕过扩展名的检验。
信息泄露
80%的安全威胁来自企业内部,将近60%的离职者或被辞退者在离开时会携带企业数据,也有许多黑客通过层出不穷的技术手段,窃取各种重要信息,已经成为信息安全的巨大威胁。
权限许可和访问控制
按用户身份及其所归属的某项定义组来限制用户对某些信息项的访问,或限制对某些控制功能的使用的一种技术,如UniNAC网络准入控制系统的原理就是基于此技术之上。访问控制通常用于系统管理员控制用户对服务器、目录、文件等网络资源的访问。
跨站请求伪造(CSRF)
跨站请求伪造(英语:Cross-site request forgery),也被称为one-click attack或者session riding,通常缩写为CSRF或者XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。跟跨网站脚本(XSS)相比,XSS利用的是用户对指定网站的信任,CSRF 利用的是网站对用户网页浏览器的信任。
路径遍历
路径遍历漏洞是很常见的,在Web应用程序编写过程,会有意识的对传递过来的参数进行过滤或者直接删除,存在风险的过滤方式
设计错误
开发中逻辑错误、或业务流程等。
配置错误
配置错误致使关键信息泄露
文件读取
命令执行
文件下载
弱口令
文件创建
授权问题
后门
其它类(敏感文件泄露、变量覆盖、服务器/WEB环境、语言本身漏洞等)
注意事项:
1.避免系统管理弱口令
2.服务器SSH安全配置
# 查看成功登录的日志,空格翻页,q退出
shell> last | less
# 查看登录失败的日志
shell> lastb | less
(1)修改SSH服务端口
修改SSH配置文件,将其监听端口更改为大于10000的值,发挥您的想象力:
shell> vi /etc/ssh/sshd_config
# 指定端口号
Port 22345
修改iptables软件防火墙把默认的22端口改为刚才指定的端口:
# 也可以使用 setup来进行配置iptables软件防火墙
shell> vi /etc/sysconfig/iptables
# 重启iptables,或者使用 service iptables restart
shell> /etc/init.d/iptables restart
注意:关于SSH, FTP这些端口的修改,一定要在修改后立即进行连接测试,以防由于误操作,断开了当前连接而无法再次连接主机。
(2) 禁止root账户远程登录
通过修改默认端口基本上可以阻挡99%恶意扫描信息(根据个人观察),紧接着要做的就是禁止root远程直接登录。因为通过分析扫描日志,你会发现root账户试探的次数一直是永居榜首:
shell> vi /etc/ssh/sshd_config
# 禁止root账户登录
PermitRootLogin no
然后创建个普通账户,当我们需要远程连接的时候,先通过普通账户登录,再su -到root。普通账户的用户名需要你费心思创造个奇葩的,想到admin这样的用户名请先去反思:
shell> useradd yaoniming3000
shell> passwd yaoniming3000
使用普通账户登录服务器后执行su –切换
# 注意su后面有个减号,是同时切换环境变量的意思
shell> su –
同样,修改完毕,还是立即进行连接测试,以防无法连接主机
(3) 限制服务器IP或VPN登入
如果有条件,强烈建议配置服务器的远程登录权限只能通过特定IP段或VPN方可登入。
3.禁用PHP敏感函数
很多木马程序和服务器攻击都是利用PHP内置的敏感函数,因此需要在配置文件中禁用这些敏感函数,以下列出一些函数,可以根据实际情况配置:
shell> vi /etc/php.ini
disable_functions =
exec,shell_exec,system,popen,escapeshellcmd,escapeshellarg,gzuncompress,proc_open,proc_get_status,show_source,gzinflate,phpinfo
重启服务生效
4.限制PHP脚本的执行目录
如果网站不幸被植入了木马,通过限制PHP脚本的执行目录,可以禁止木马程序浏览操作系统的系统文件,进而产生更大的破坏,一共有两步操作:
shell> vi /etc/php.ini
open_basedir = /data/www/:/tmp/
或者通过NGINX的配置文件来限制目录执行PHP
5.开启访问日志
6.MySQL安全配置
(1) 数据目录和数据文件的安全性
设置MySQL数据目录为700,即只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。
shell> chmod 700 /www/mysql
设置MySQL日志目录为770,即只有数据库用户和组成员可以查看
shell> chmod 770 /var/log/mysql
(2) 本地日志文件安全性
有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:
shell> mysql -uroot –ptest
shell> mysqldump -uroot -ptest test > test.sql
这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。
另外用户本地登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以必要时我们可以这样做:
shell>rm ~/.bash_history ~/.mysql_history
shell>ln -s /dev/null ~/.bash_history
shell>ln -s /dev/null ~/.mysql_history
(3) 数据库账户的配置
请不要直接使用数据库root账户来进行CmsTop数据库的管理,并配置数据库root账户只允许本地连接数据库。
针对每个数据库设置不同的用户、密码、连接限制权限,如果您不熟悉SQL可借助phpMyAdmin图形化web界面来进行配置。
mysql> select user,host from mysql.user;
+--------------+------------------+
| user | host |
+--------------+------------------+
| root | localhost |
(4) 数据库的外网访问
数据库一般不需要通过外网访问,所以也不需要配置外网IP,开放外网端口,当数据库与应用分开时,应该通过内网IP来进行连接。
(5) phpMyAdmin的访问控制
使用phpMyAdmin来进行数据库管理,不要为了图方便,将该目录放置到CmsTop的系统目录中运行。
可以单独配置一个域名来进行访问,并且不要进行公网DNS解析,让外网直接访问。
7.木马检查
如果网站因为某些原因被入侵或被挂马,可以通过以下简易手段进行排查,快速解决问题,另外也请及时联系我们的技术支持人员,进行排查。
(1)模版文件检查
一般模版文件植入木马,都是通过访问动态脚本加载模版运行,一般都要接收外部参数,通过以下三句指令进行基本的检查:
shell> grep –rl “_REQUEST”templates/
shell> grep –rl “_POST”templates/
shell> grep –rl “preg_replace”templates/
(2)可执行PHP目录检查
可执行PHP目录有public/app,public/mobile,public/wap等,同样通过以上指令进行检查,搜索的是木马的特征码。鉴于木马的变种实在是太多,就不详细举例了:
shell> grep –rl “特征” public/app
…
(3)定期检查访问日志文件
通常入侵会来自于前台的动态域名,可通过以下指令对访问日志的URL进行分组排序并分析:
#查看访问次数最多的url
cat /var/log/httpd/app.domain-access_log |tail -10000|awk '{print $7}'|sort|uniq -c|sort -nr|less
如果您有多台Web服务器,则需要分别查看。