首页 -> 安全研究

安全研究

安全公告
绿盟科技安全公告(SA00-01)

NSFOCUS安全小组(security@nsfocus.com)
http://www.nsfocus.com

国内电子商务站点存在严重安全隐患

发布日期:2000-03-31


受影响的软件及系统:
====================
ASP、PHP、Perl
--Microsoft SQL Server
--MySql
--Sybase

综述:
======
  随着国内电子商务的逐渐升温,网上交易的安全性问题日益引起关注。中国互联网中心(CNNIC)于一月十八日发布的《中国互联网络发展状况统计报告》中关于电子商务的调查结果表明,目前用户最关心的问题就是网上交易的安全问题。由此可见,电子商务能否在国内顺利发展,其重要前提就是网上交易的安全性必须得到保证。
    近日发现,国内90%以上的电子商务站点存在一些具有普遍性的严重安全漏洞,攻击者可以轻易盗取用户帐号、交易密码,并可使用用户资金进行网上交易。这些安全漏洞将直接影响电子商务站点的信誉,对国内电子商务的发展进程将产生重大影响。目前,“中联绿盟”已经协助多家电子商务网站成功解决了这些安全问题。由于最近又有多家电子商务网站遭受到这种攻击,导致数据库资料受损或丢失,“中联绿盟”特就此发布安全公告。鉴于这些攻击可能对网站造成严重影响,本安全公告不公布具体的攻击细节。

分析:
======
 以下是对目前国内电子商务站点普遍存在的几个严重的安全问题的一些分析。

1、 客户端数据的完整性和有效性检查

1.1、特殊字符的过滤
在 W3C 的 WWW Security FAQ 中关于CGI安全编程一节里列出了建议过滤的字符:

&;`'\"|*?~<>^()[]{}$\n\r

    这些字符由于在不同的系统或运行环境中会具有特殊意义,如变量定义/赋值/取值、非显示字符、运行外部程序等,而被列为危险字符。W3C组织强烈建议完全过滤这些特殊字符。但在许多编程语言、开发软件工具、数据库甚至操作系统中遗漏其中某些特殊字符的情况时常出现,从而导致出现带有普遍性的安全问题。

1.1.1、CGI和Script编程语言的问题
    在几种国内常见的WEB编程语言中,ASP和Cold Fusion 脚本语言对特殊字符的过滤机制不够完善,例如没有对单引号做任何处理等。Perl和php对特殊字符的过滤则较为严密,如忽略或加上“\”(取消特殊字符含义)处理。C语言编写的cgi程序对特殊字符的过滤完全依赖于程序员的知识和技术,因此也可能存在安全问题。

1.1.2、Microsoft ASP脚本
    普遍存在的问题是程序员在编写ASP脚本时,缺少或没有对客户端输入的数据/变量进行严格的合法性分析。无意或有意输入的特殊字符可能由于其特殊含义改变了脚本程序,从而使脚本运行出错或执行非法操作。例如,当脚本程序需要进行数据库操作时,恶意用户可以利用嵌入特殊字符来突破脚本程序原先的限制。
    因此,如果攻击者输入某些特定sql语句,可能造成数据库资料丢失/泄漏/甚至威胁整个站点的安全。比如攻击者可以任意创建或者删除表(如果可以猜测出已存在的表名),清除或者更改数据库数据。攻击者也可能通过执行一些储存过程函数,将sql语句的输出结果通过电子邮件发送给自己,或者执行系统命令。

1.1.3、PHP和Perl
    虽然提供了加上”\”(取消特殊字符含义)处理的手段,但是处理一些数据库时依然可以被改写。(我们本地的测试证实了这情况。)请阅读下面关于数据库问题的分析。对于MySQL则没有问题,\'不会与前面的单引号封闭,而当作一个合法的字符处理。针对oracle和informix等数据库暂时未进行相关测试。
    另外,对于PHP或者Perl语言,很多程序对于数字类型的输入变量,没有加单引号予以保护,攻击者就有可能在这种变量中加入额外的SQL语句,来攻击数据库或者获得非法控制权限。

1.2、数据库问题
    不同的数据库对安全机制的不同认识和实现方法,使它们的安全性也有所不同。最常见的问题是利用数据库对某些字符的不正确解释,改写被执行的SQL语句,从而非法获得访问权限。例如,Microsoft SQL Server和Sybase对 \'当作了两个不同字符,所以仅仅在程序中加上”\”仍然可能通
过一些特殊手段改写 SQL语句突破数据库的安全防线。Microsoft SQL Server也将”—“作为注释符号,这个符号以后的SQL语句均被忽略,攻击者可能利用这个来屏蔽掉某些用来认证的SQL语句(例如口令验证),获得对合法用户帐号的控制权。MySQL则将\'作为一个可操作的正常字符,不存在利用\'改写的可能。其它数据库如Oracle、Informix和MiniSQL等也必须注意防止各种改写SQL语句的可能。

(注:另外,迄今为止,各种数据库都或多或少地被发现存在不同程度上的安全漏洞。如Microsoft SQL拒绝服务漏洞,MySQL GRANT权限可改变任意用户口令的漏洞,MySQL 远程绕过口令限制的漏洞,MiniSQL远程缓冲区溢出漏洞,Oracle Web Listener 非授权访问漏洞,
Oracle dbsnmp符号连接漏洞,Sybase PowerDynamo目录遍历漏洞,等等。由于数据库数据资料是电子商务网站的最重要部份,关系到电子商务网站的生死存亡,因此修补各种安全漏洞,保证数据库免受各种攻击,是绝对必要的!
声明:本次安全公告不包含以上漏洞的内容。如有需要请向“绿盟科技”咨询详细资料。)


2、 Cookie或用户身份的常用认证问题
    对于一个网站会员而言,经常存在需要一次注册,多次认证的问题,一般采用手段为cookie或input type=hidden来传递认证参数。这里面有几点隐患:

    I.    所携带内容必须完整包含帐号密码,或类似的完整安全信息,如果只携带帐号信息或用某种权限标志来认证,极容易造成非法入侵,我们检测了一些电子商务网站,很多都有此类安全隐患。例如某站点中的会员更新页面中携带的认证信息是两个,用户名和Uid(均为明文传送)已知Uid对于每个会员是唯一的。由于我们只需要知道对方的帐号和Uid就可以更改对方信息(不需要知道密码!),只要攻击者知道Uid(攻击者可以通过暴力猜测的方法来得到Uid,有时候站点本身也会泄露用户的Uid,例如在论坛等处)那么,攻击者就可以通过遍历攻击完成对任意一个帐号的信息更改。

    II.    必须所有需要权限操作的页面都必须执行认证判断的操作。如果任何一页没有进行这种认证判断,都有可能给攻击者以恶意入侵的机会。

    III.  很多网站为了方便,将用户名以及口令信息储存在Cookie中,有的甚至以明文方式保存口令。如果攻击者可以访问到用户的主机,就可能通过保存的Cookie文件得到用户名和口令。

3、 大量数据查询导致拒绝服务
    许多网站对用户输入内容的判断在前台,用JavaScript判断,如果用户绕过前台判断,就能对数据库进行全查询,如果数据库比较庞大,会耗费大量系统资源,如果同时进行大量的这种查询操作,就会有Denial of Service(DoS —— 拒绝服务)同样的效果。

解决方法:
==========
1、客户端数据完整性和有效性检查的解决办法
    根据目前国内电子商务网站普遍存在的安全问题,主要的原因是未对某些特殊字符——例如单引号(’)进行过滤,或过滤机制不够完善。因此较为根本的解决方法是加强过滤机制,对用户输入数据进行全面的检查。以对ASP + Microsoft SQL Server类型的网站危害比较大的单引号(’)为例。目前可以肯定的是仅仅通过加上”\”或双引号处理是不健全的,必须杜绝单引号在处理程序的SQL语句中出现。

    I.    对于从客户端接收的数据变量应该用"’"(单引号)来引用;
    II.   对用户输入的所有数据进行合法性检查(尽可能放在后台校验),包括数据长度和数据内容,将其中的特殊意义字符替换或不予往下执行。例如,将"’"替换成"’’" (两个单引号)号或用双字节中文单引号替换;而对于数字型变量,要检查输入的数据是否全为数字。
    III.  对象数据库不使用系统默认的dbo用户。并尽量减少新增用户的权限;

以ASP为例,具体的实现可以通过函数Replace函数来实现,如:

<%
username=Replace(trim(Request.Form(“username”)),”’”,”’”)
password=Replace(trim(Request.Form(“password”)) ,”’”,”’”)
%>
以上例子将变量username与password中的字符”’”(单引号)替换成双字节中文单引号。

如希望用户能使用单字节单引号”’”,可参考使用如下函数:
<%
function CheckStr(str)
dim tstr,l,i,ch
    l=len(str)
    for i=1 to l
        ch=mid(str,i,1)
        if ch="’" then
           tstr=tstr+"’"
        end if
        tstr=tstr+ch
    next
    CheckStr=tstr
end function
%>


该函数将需要校验的数据中的单字节单引号后添加了"’",这样,送入SQL中的"’"就变成了"’’",当输出该字段数据时,该项内容中的"’’"输出为"’"。对于其他的CGI编程语言,可以参照上述方法的思路进行处理。

2、 Cookie或用户身份的常用认证问题的解决办法
    由于session (会话)机制主要由服务器控制,比利用cookie传递认证参数更为安全可靠,因此可使用session会话取代cookie认证。如果必须使用Cookie传递参数,必须将参数内容进行加密,并正确设置Cookie的有效时间。

3、 大量数据查询导致拒绝服务的解决办法
    为了安全起见,应该将可能导致出现这种拒绝服务攻击的Javascript移植到由服务器端执行,防止客户端向服务器提交过量的数据库操作。

4、 若对本次安全公告有不明之处,请与我们联系获得进一步的帮助。鉴于此漏洞的严重性,我们将向国内站点提供解决这个安全问题的免费技术支持。


特别感谢:清华isme工作组

声 明
==========

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

关于绿盟科技
============

绿盟科技(NSFOCUS Co., Ltd.)是中国网络安全领域的领导企业,致力于网络和系统安全问题的研究、高端网络安全产品的研发、销售与网络安全服务,在入侵检测/保护、远程评估、 DDoS攻击防护等方面提供具有国际竞争能力的先进产品,是国内最具安全服务经验的专业公司。有关绿盟科技的详情请参见: http://www.nsfocus.com

© 2019 绿盟科技