本文是游侠应《中国信息安全》杂志约稿写的文章,发表在《中国信息安全》2012年第6期,原文题目为《层层揭开WEB安全问题》。OK,Let’s go!

罗马非一日建成,网站也是如此。网站由很多部分组成,缺一不可。虽然现在提供了很多所谓的模板化建站工具,但是对于大型网站而言,建设起来至少需要以下环节:网站规划、网站制作、带宽申请、域名注册、服务器搭建、安装调试、正式发布。

了解了网站的制作流程,我们就可以知道,安全应该始终贯穿于整个流程,下面我们从不同的层面分析网站可能面临的威胁,探讨可行的解决方法。

网络层面

做网站,最终目的要面对公众。因此就要把服务器放到网络上,也就不可避免的要面对网络上的各种***。

TCP/IP设计之初是为了共享资源,因此对安全方面的考虑并不多,注定有很多安全问题,常见的有以下几种方式:

ARP挂马

当我们正常访问网站时,会返回给我们网页的代码,但如果是下面的场景:

A:正常的服务器,B:被***控制的服务器。

***在B上安装ARP***工具,如果有人要访问A服务器,B抢先回答“我是A服务器”,则访问者就到了B服务器了。这时候,会有两种情况:网页直接打不开,因为B服务器没有绑定A的主机头;网页可以打开,但是被***嵌入代码。比如通过<iframe>方式嵌入病毒、***网页的代码,导致访客打开的时候中毒或被***。

当然,ARP***方式不仅上面我们描述的这一种,但对WEB服务器而言,表现几乎一致:要么打不开、要么被嵌入代码。

对ARP***,在交换机做好绑定,并且启动交换机的ARP防护,会得到较好的效果,也可以安装响应的安全软件,如ARP防火墙。

拒绝服务***

上面我们说到,互联网设计的初衷是为了进行资源共享,在设计上是有缺陷的。因此拒绝服务***也是很难对付的一种***方式。

常见的拒绝服务(DoS)方式有:

SYN Flood

简单举例说下三次握手:客户端访问服务器的时候,会发出一个请求,说:我要上车;服务器收到请求之后,说:你上车吧;客户端:出示车票,上车。然后愉快的旅程就开始了!

但是如果***者,也就是客户端中途出现问题怎么办?服务器说“你上车吧”之后,客户端死机了,或者掉线了,那么服务器一般还会保持这个过程(留座)一段时间,一般是30秒钟到2分钟(和现实生活中的很像)。

如果这个车有100个座位(这取决于服务器的内存、CPU、带宽等),但是有50个人同时说了上车但不上去,那么就有50个正常要上车的人无法上车。

如果***者模拟了200个人同时发起请求,则几乎没有人能顺利访问服务器。

UDP Flood

UDP协议是无连接的,因此***如果向服务器的端口随机发起一些数据包,如10M的带宽却试图用100M的数据进行连接的时候,服务器就无法提供正常服务了。

拒绝服务***则是比较难以防御的,虽然可以在服务器上设置SYN超时时间,但效果并非特别明显,因为***者既然发动拒绝服务***,则数据量就不会太小。笔者认为应对小型的DoS***,最快捷的方式还是采用安装软件的抗DoS防火墙,相对于对操作系统去做繁琐的配置,非常省力。

如果应对大型的DoS***,则最好需要运营商配合,在骨干网上进行***源切断。(当年Yahoo!都被此种***烦恼,所以防范难度很大),如果仅仅从机房去做防范,几乎起不到很好的效果。

系统层面

操作系统,无论是Windows、Linux还是FreeBSD等系统,均无法保证开发过程中不出现任何漏洞。而在这些漏洞中,威胁最大的是远程溢出漏洞,如:IIS5.0 WebDAV远程溢出漏洞、MS08-067远程溢出漏洞。***无需接触到服务器,就可以在极短的时间内(以秒计)拿到服务器的管理员权限!

有IIS或Apache配置有问题,导致上传目录文件暴露,很多内部文件直接暴露在公网上!下图既是笔者从某政府网站下载到的公务员考试信息。另外还有一些文件中保存了新浪微博的密码等!

同时,服务器的默认配置本身就是为了方便应用,而不是提供给大家一个无懈可击的系统,因此默认情况下,安全级别不是特别高。

用Windows服务器的朋友们,注意修改终端服务的端口,默认是3389,当年Windows 2000流行的时候,一个“输入法漏洞”就搞砸了好多服务器。

另外提示下:像Serv-U这样的软件的提示信息最好也修改下,并保持最新版本,目录访问权限一定要做好,这因为Serv-U导致服务器被***的案例太多了。

要防范系统被***,首先服务器要进行安全配置,通常要做的是:

·修改Administrator账号名称和描述,密码不低于14位,包含大小写字母、数字、特殊符号,并定期更改(如30天)

·建立一个名为Administrator的帐号,设置同样复杂(或更为复杂)的密码,但仅给予Guest帐号权限

·禁用Guest帐号

·修改3389端口,并增加登录授权

·修改FTP端口

·设置本地安全策略,设置账户登录3次后锁定30分钟(你也可以设置的更为严格)

·在本地策略中设置“不显示上次的用户名”

·只允许Administrators权限的人访问cmd.exe等文件

·禁用C$、D$等默认共享

·关闭无关服务,如服务器上的打印服务等

·Windows一定要启用NTFS,设置严格的访问授权。如A网站用A帐号访问,帐号无其它目录的访问权限,最大保证安全性

此外,如果你用Unix、Linux做服务器,那么请相信:如果你对此系统不精通,那么它的安全性并不比Windows好。擅长的才是最好的!配置Linux类服务器的时候注意权限的分配,不要一律都设置成777,很容易出事。如果是政府、大型企业,建议采用Unix安全管理系统,可以直接阻断执行Unix的某些危险命令,如rm等。

无论什么系统,必须安装杀毒软件、防火墙、补丁管理软件。要配置好策略,定期升级,否则一切都是白搭。一定配置首页文件,如index.asp、default.htm等,针对上传目录禁止列目录权限。如果可能,定期采用漏洞扫描软件进行安全性评估。

应用层面

其实这部分才是最复杂、难度最大的部分,因为很多问题,不会有现成的解决方法。针对80端口的常见***或配置问题有:

SQL注入***

SQL注入的***历史有10年了,但是对***而言依然非常好用。

举一个后台登录的SQL注入例子,正常情况下是:SELECT * FROM [ADMIN] WHERE USERNAME=’ADMIN’ AND USERPWD=’ADMIN’,如果我们在USERNAME的文本框里输入’ OR 1=1 –,则提交的语句变成了:SELECT * FROM [ADMIN] WHERE USERNAME=” OR 1=1 –’ AND USERPWD=’ADMIN’,用户名为空或1=1(1=1永远成立),然后密码部分被注释掉(不执行)了。这样***就可以登录网站后台为所欲为!

当然,SQL注入***方式非常灵活,只要代码写的不够严谨,***可以查询数据库版本、用户名、密码,甚至可以直接更改密码,也可以利用数据库的功能写入文件、更改文件、篡改网页、挂马。危害非常大!

SQL注入***说到底,还是代码过滤不严格的问题,因此需要对代码执行过滤,同时需要对服务器进行安全加固。建议采用WEB服务器、数据库服务器分离的模式。

1.参数化SQL语句执行,而不是直接提交用户数据

2.特殊字符过滤,如’”\尖括号&*;等

3.限制数据长度

4.在conn.asp等文件中嵌入防护代码进行过滤

5.在服务器安装SQL注入防护软件过滤(最省事)

跨站脚本***

跨站脚本(XSS)***指的是***可以在WEB页面中插入一段脚本代码,当用户浏览页面的时候,触发代码,达到***目的。

下面是一个来自百度百科的例子:

***Yahoo Mail 的Yamanner 蠕虫是一个著名的XSS ***实例。Yahoo Mail 系统有一个漏洞,当用户在WEB上察看信件时,有可能执行到信件内的javascript 代码。病毒可以利用这个漏洞使被***用户运行病毒的script。同时Yahoo Mail 系统使用了Ajax技术,这样病毒的script 可以很容易的向Yahoo Mail 系统发起ajax 请求,从而得到用户的地址簿,并发送病毒给他人。

怎么样,只要你看邮件,***就可以把你的地址簿发给别人,你有好的办法检测到这种***方式吗?——很难!

同样的,跨站脚本***可以在你网站的页面上,同步执行另一个网站的文件,这个文件可能是***、病毒……也可以嵌入页面,进行钓鱼***。

一些高级的XSS***甚至可以劫持用户的Web行为,监视用户的浏览历史,发送与接收的数据等等。

对付跨站脚本***,可以过滤字符,如<>,;’等,内容输出之前做转换,防止不必要的HTML输出;也可以将cookie和IP绑定,防止cookie外泄之后被***,同时采用如WEB应用防火墙(WAF)等进行跨站脚本***防护。

CC***

CC***和前面提到的拒绝服务很像。但它一般是利用大量代理,频繁提交某些页面,造成服务器无法响应,从而影响访问。它模拟的是正常用户的访问,因此很难检测。

对此,我们需要限制每一个站点的IP连接数和CPU使用,防止对同一服务器的其他站点造成影响,同时可配置独立的应用程序池。开启Session防护,使其第一次、第二次正常,第三次刷新则阻断。因为CC***一般通过代理访问,可阻断代理访问。还可以限定单IP在特定时间的访问次数。

数据库层面

***主要通过SQL注入方式***进数据库,一旦***进去则后果严重。另外各类数据库自身皆有漏洞,如拒绝服务等,包括Oracle在内都无法避免。

如果用MySQL数据库,最好不要允许远程访问。否则一旦被找出漏洞服务器的安全就岌岌可危了。用SQL注入漏洞跑出帐号和密码,再远程连上去,服务器基本就不属于自己了。3306端口建议修改下。另外与MySQL配合比较好的管理平台phpmyadmin貌似也爆出了几个漏洞,注意防护。

如果用SQL Server数据库,存储过程最好想办法控制,就是xp_cmdshell等。一般来说如果用企业管理器、查询分析器连接上,那么就可以用账户权限执行命令,如果是Administrator或者SA,那么服务器就不属于你了。1433端口要修改。

无论是什么类型的数据库,都要注意升级、安装补丁,否则很容易导致问题。如果是政府、大型企业,建议安装数据库审计系统(硬件,当然像SQL Server、Oracle这些商业级数据库产品自己也有审计功能),业内也有数据库防御系统

在网站应用的时候,建议WEB服务器、数据库服务器分离。在数据库服务器限定能连接到服务器的IP地址。防止***直接访问到数据库服务器。

数据层面

简单来说,就是因为***的***造成数据泄露、丢失,如前段时间流行的***事件。

首先我们要做好服务器的UPS、RAID、电源冗余。其次要备份,数据库和文件都要备份,可以利用SQL Server或者Windows自己的备份系统,很方便,也可以做计划任务。也可以采用第三方数据备份软件。

网站安全是个系统工程,从系统选择(Linux、Windows、FreeBSD等)到采用的技术(ASP、ASPX、PHP、JSP等),包括数据库类型,都影响到网站的安全。建议常用网站漏洞扫描工具对网站进行定期评估,以及时发现安全问题。亡羊补牢,为时未晚。

作者:张百川(网路游侠)

网站:http://www.youxia.org

转载请注明来源!谢谢合作。