网络安全 频道

小心WEB应用程序成为数据窃贼的帮凶一

  当心,你以为固若金汤的数据库可能已遭到了入侵。你需要重新思考一下自己公司的网站是否真得不会遭到SQL注入攻击。SQL注入是最流行也是最危险的Web应用程序漏洞利用技术,它可以攻击存储着珍贵企业信息的后端数据库,且“简约高效”。

  本文将阐述攻击者如何通过这种方法来利用Web应用程序的漏洞。有时,即使攻击者也不了解自己正在利用的漏洞的性质。

  何为SQL注入

  就其最基本的意义来说,SQL注入只不过是操纵一个已有的SQL查询,执行一个并非开发人员意图的动作。这种动作通常是通过Web应用程序的用户界面完成的。

  但这种攻击是如何进行的?它为什么屡屡得逞?

  Web应用程序和数据库之间的正常交互

  所有的SQL注入漏洞都是由某些未经验证的用户输入开始的。用户输入可以采取多种形式,它可以包括一个攻击者操纵的由服务器处理的任何东西,例如:用户代理、HTTP报头、POST参数、cookies、GET参数,甚至网址标头等。是什么令未经验证的用户输入如此特殊呢?答案是:应用程序并没有对其进行充分的检查,从而不能确保所收到的输入就是所期望的类型和方式。例如,虽然你的应用程序的编制目的是为了接收可以包括字母、数字的字符串作为用户名,但此程序并没有验证输入,从而使得黑客可以插入SQL注入的数据库查询:

  比如,一个典型的网站会要求你的用户名,并希望这个结果是“Zhangsan”:

  Wangzhan.com/usertetail.asp?username=Zhangsan

  在这个例子中,有可能会发生这样的情况:某个查询促使网站在后台与数据库交互,从而获取关于用户(如,Zhangsan)的信息:

  SELECT uname,fname,lname,phone,street,city,state,zip FROM users WHERE user =$var_username

  当Web应用程序代码处理这个请求时,为了完成查询,来自用户名的值(Zhangsan)被传递给$var_username。服务器应当将SQL查询的结果变成标准格式,并显示此结果以便于用户查看Zhangsan的细节。

  攻击者寻找突破口

  首先,攻击者可能查看应用程序是否能够正确地处理错误条件。有许多方法可以检查SQL错误消息,每一个方法都依赖于数据库自身。最常见的例子是“‘”( 撇号)。攻击者可能会尝试插入“‘”而不是一个合法的用户名:

  Wangzhan.com/userdetail.asp?username=‘

  如果出现错误,攻击者就可以了解一些信息。例如,下面的错误就会使攻击者知道这是一个MySQL数据库,而且表明数据库将“‘”解释为查询的一部分,从而揭示出这可能是一个SQL注入点,值得进一步调查。

  错误:您的SQL语法有一个错误,请检查您的MySQL服务器版本对应的手册,查看正确的语法…在第4行

  在此例中,我们使用了一个“‘”,但任何“保留”字符,即在测试数据库错误时可以使用的为特别目的而保留的一个字符。保留字符对每种数据库类型来说都是少有的。

  借助上面显示的MySQL错误消息,我们可以看出黑客是多么聪明,而且能够发现应用程序正在访问的数据库表的其它细节。请看:

  Wangzhan.com/userdetail.asp?username=Zhangsan order by 1

  如果我们没有收到错误,就可以知道用户名要么是SQL WHERE语句中的最后一个变量(允许我们从一个数据库表中重新获取数据,同时又排除其它的无关数据),或者是WHERE语句中的唯一变量。我们可以让数字每次增加1,直至收到一个错误。例如,可能在到达“Zhangsan order by 9”,就可以看到:

  错误:用户警告:“order clause”查询中有无法确认的列:SELECT

  现在可以确认,直至提交了“9”,我们才收到了错误消息,所以可以断定表中有8列。这个信息很有用,但我们只是想获得尽量多的数据。假设没有提供输入验证,通过在用户名的位置使用一个通配符,我们实际上可以返回所有用户的细节:

  Wangzhan.com/userdetail.asp?username=%

  在该例中,我们将执行下面的查询,返回所有用户的细节:

  SELECT uname,fname,lname,phone,street,city,state,zip FROM users WHERE user = %

  如果攻击使用此伎俩,势必会造成数据损害,使大量的有价值的客户信息处于风险之中。其中可能包括应当被加密的用户口令,当然攻击者可以在日后再进行破解。遭到泄露的客户信息还有可能包括电子邮件地址,攻击者可以将其用于钓鱼攻击。

  其实,我们可以不用插入简单的通配符,而是终止查询,并让查询做一些查询之外的事情:

  Wangzhan.com/userdetail.asp?username=zhangsan;DROP users—

  为便于比较,我们将SQL Server的数据库语句列示如下:

  SELECT uname,fname,lname,phone,street,city,state,zip FROM users WHERE user = ‘zhangsan’;DROP users—

  还要注意,此例允许你在同一行上提交多个查询(在此例中,即SELECT和DROP查询)。其方法就是用分号(;)分开并用两个破折号结束。因而,在完成最初的查询后,攻击者就可以发送并运行自己选择的一个完整查询。

0
相关文章