维护数据库安全不可忽视应用程序对它力量

文章来源:丹阳文学网  |  2021-05-26

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

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

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

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

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

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

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

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

攻击者寻找突破口

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

\'

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

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

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

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

order by 1

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

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

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

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

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

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

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

users

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

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

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

上海治疗男科遂宁白癜风医院哪家较好南京治疗白斑的医院兰州治疗白癜风医院哪家好
武汉妇科治疗医院
北京包皮包茎治疗费用
友情链接