小心你的WEB应用程序成为数据窃贼的帮凶(2) |
发布时间: 2012/6/11 19:27:24 |
攻击者寻找突破口
首先,攻击者可能查看应用程序是否能够正确地处理错误条件。有许多方法可以检查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查询)。其方法就是用分号(;)分开并用两个破折号结束。因而,在完成最初的查询后,攻击者就可以发送并运行自己选择的一个完整查询。
本文出自:亿恩科技【www.enkj.com】 |