SQL注入这个词相信你们应该都不陌生,并且每一年都会有这样子的事情发生,下面我先带你们回忆11年两期起比较经典的案例事件:算法
一、SONY索尼事件
2011年4月,著名的匿名者组织Anonymous注入SONY一个网站,一星期后才被发现7千万的用户我的信息,其中包括姓名、地址、E-mail、出生日期、用户名、密码以及购买记录的数据信息,随后的一些其余服务器也被相继攻破sql
二、CSDN数据泄露门
2011年末,国内各大网站被爆出“密码泄露门”,最早公布的是著名技术网站CSDN600万帐户和密码泄露事件,网站因为存在SQL注入漏洞被利用并下载用户数据库,同时使人不解的是,网站对用户的信息储存居然是明文数据库
SQL注入指的是发生在Web应用对后台数据库查询语句处理存在的安全漏洞,简单的说,就是在输入字符串中嵌入SQL指令,在设计程序中忽略了对特殊字符串的检查,这些嵌入的指令便会被误认为正常的SQL指令,在数据库中执行,所以能够对后台数据库进行查看等工做,甚至破快后台数据库形成严重后果。
目前SQL注入大体分为普通注入和盲注express
以著名的IBM公司所提供的SQL注入测试平台安全
咱们在这个网站上发现了一个登陆的页面,如今咱们在表单中的Username中输入“admin'”,Password中输入同样的字段服务器
点击‘Login’登陆按钮后,咱们获得了一个报错的页面,根据提示“Syntax error (missing operator) in query expression 'username = 'admin'' AND password = 'admin'''.”咱们能够猜想到大概的SQL语句应该是“select * from [users] where username=? and password=?”cookie
咱们返回登陆页面在Username和Password中输入“admin' or '1”而后再点击登陆,咱们就能意外的进入到登陆页面以后了ide
是否是仍是一脸懵,如今咱们来解释一下为何会这样,之因此可以登录成功,是由于SQL的语句变成一下的语句:
select * from [users] where username= 'admin' or '1' and password='admin' or '1'
根据SQL中逻辑运算的优先级,or低于and,最后的or ‘1’永远成立,因此该条件表达式结果为True,此语句同等于下面的这条语句
select * from [users]工具
这个页面经过了一次提交以后,咱们获得了几个信息,一个是提交的地址,还有就是cookie值,咱们经过这几个信息使用sqlmap工具项检测一下有没有sql的注入点测试
从检测的结果中,咱们看到了包含错误的SQL注入点,以及UNION查询注入点,此外,还进一步的探测到了数据库的版本是MySQL5.0的,Web应用平台是PHP5.3.2/Apache2.2.14
使用SQLmap的“--dbs”选项,就能够根据所识别的不一样数据库管理平台类型来探测包含的数据库名称,除了发现MySQL默认的系统数据库information_schema以外,咱们还发现了Web应用的数据库dvwa
使用“-D dvwa --tables”选项指定了数据库,而后得到了此数据库下的全部表,居然表咱们都能看到了,接下来咱们来看看表里获得内容吧
加上“-D dvwa --tables -T users --columns --dump”选项前面的-D选项指定数据库,后面-T指定表,最后咱们看到了表中的内容,从中咱们看到了一个admin的帐户,将password放到在线解密MD5的网站上,咱们的到密码就是admin,拿着这个帐号密码,轻松的进入到后台中
经过一开始的两起案件和后面我所示范的简单注入,相信你们应该知道SQL的注入该有多危险了吧,下面给你们普及几点防范SQL注入的方法:
输入验证
检查用户输入的合法性,尽可能的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。数据检查应当在客户端和服务器端都执行之因此要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
错误消息处理
防范SQL注入,还要避免出现一些详细的错误消息,由于能够利用这些消息。要使用一种标准的输入确认机制来验证全部的输入数据的长度、类型、语句、企业规则等。
加密处理
在一开始的CDNS例子中没有加密的数据就直接被利用了,可是加密了就不必定会解密成功,尽可能不要用一些常见的加密算法,就算用也要使用32位以上的加密算法,将用户登陆名称、密码等数据加密保存。加密用户输入的数据,而后再将它与数据库中保存的数据比较,这至关于对用户输入的数据进行了“消毒”处理,用户输入的数据再也不对数据库有任何特殊的意义,从而也就防止了注入SQL命令。
存储过程来执行全部的查询
SQL参数的传递方式将防止利用单引号和连字符实施注入。此外,它还使得数据库权限能够限制到只容许特定的存储过程执行,全部的用户输入必须听从被调用的存储过程的安全上下文,这样就很难再发生注入式了。