当心,你以为固若金汤的数据库可能已遭到了入侵。你需要重新思考一下自己公司的网站是否真得不会遭到SQL注入攻击。SQL注入是最流行也是最危险的Web应用程序漏洞利用技术,它可以攻击存储着珍贵企业信息的后端数据库,且“简约高效”。 本文将阐述攻击者如何通过这种方法来利用Web应用程序的漏洞。
有时,即使攻击者也不了解自己正在利用的漏洞的性质。 何为SQL注入 就其最基本的意义来说,SQL注入只不过是操纵一个已有的SQL查询,执行一个并非开发人员意图的动作。这种动作通常是通过Web应用程序的用户界面完成的。 但这种攻击是如何进行的?它为什么屡屡得逞? Web应用程序和数据库之间的正……
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
当心,你以为固若金汤的数据库可能已遭到了入侵。你需要重新思考一下自己公司的网站是否真得不会遭到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查询)。其方法就是用分号(;)分开并用两个破折号结束。因而,在完成最初的查询后,攻击者就可以发送并运行自己选择的一个完整查询。
相关推荐
-
如何在外包开发时抵御SQL注入攻击
SQL注入攻击仍然困扰着企业。在外包开发时,执行审计代码验证更是一个挑战。那么如何在外包开发时抵御SQL注入攻击呢?
-
如何构建安全的Web应用程序
安全专家一直在警告人们Web应用程序的漏洞,而这些警告往往会变成现实。那么,为保障这些关键的企业应用,编程者应该做点儿什么呢?
-
黑帽2012:安全的软件开发
在黑帽2012大会上,专家重点提到了提高编码质量和软件开发安全,不仅仅针对于Web应用,也针对于操作系统内核开发。
-
黑客对ASP.Net平台网站发起SQL注入攻击 约18万网页遭到入侵
安全研究人员近日发现,黑客对微软的ASP.Net平台的网站发起了SQL注入攻击,现在已经有大约18万网页遭到入侵。