SQL注入到底是什么
SQL注入是一种注入攻击,,可以执行恶意SQL语句。它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
SQL注入怎么产生的
1 web 开发人员无法保证所有的输入都已经过滤
2 攻击者利用发送给服务器的输入参数构造可执行的 SQL 代码(可加入到 get 请求、 post 谓求、 http 头信思、 cookie 中)
3 数据库未做相应的安全配置
如何进行SQL注入攻击
以php编程语言、 mysql数据库为例,介绍一下 SQL 注入攻击的构造技巧、构造方法
1.数字注入
在浏览器地址栏输入:
learn.me/me/sql/article.php?id = 1
这是一个 get 型接口,发送这个请求相当于调用一个查询语句
$ sql = SELECT * from article where id= $ id
正常情况下,应该返回一个 id = 1 的文章信息。那么,如果在浏览器地址栏输入:
learn.me/me/sql/article.php?id = -1 or 1=1
这就是一个 SQL 注入攻击
,可能会返回所有文章的相关倍息。为什么会这样呢?这是因为, id = 1 永远是 false , 1 = 1 永远是 true ,所有整个 where 语句永远是 ture ,所以 where 条件相当于没有加 where 条件,那么查询的结果相当于致张表的内容
2.字符串注入
有这样一个用户登录场景:登录界面包括用户名和密码输入框,以及提交按钮.输入用户名和密码,提交。这是一个post请求,登录时调用接口
Learn.me/sql/Login.html
首先连接数据库,然后后台对 post 请求参数中携带的用户名、密码进行参数校验,即 sql 的查询过程.假设正确的用户名和密码为 user 和 pwdl23 ,输入正确的用户名和密码、提交,相当于调用了以下的 SQL 语句:
SELECT * FROM user where usernanme= 'user' ADN password = 'pwd123'
由于用户名和密码都是字符串, SQL 注入方法即把参数携带的数据变成 mysql 中注释的字符串。 mysql 中有 2 种注释的方法
1.' # ' : ' # ’后所有的字符串都会被当成注释来处理
用户名输入: user’# (单引号闭合 user的单引号),密码随意输入,如: 111 ,然后点击提交按钮.等价于 SQL 语句:
SELECT * from username WHERE username= 'user'# ADN password =' 111 '
要知道#后面都被注释掉了,相当于:
SELECT * from username WHERE username= 'user'
2. '--'(--后面有个空格):'--'后面的字符串都会被当成注释来处理
SELECT * from username WHERE username= 'user'-- ADN password =' 111 '
和上面情况一样也会当做
SELECT * from username WHERE username= 'user'
因此,以上两种情况可能输入一个错误的密码或者不输入密码就可登录用户名为user 的账号
,这是十分危险的事倩。
如何预防SQL注入?
这是开发人员应该思考的问题,作为测试人员,了解如何预防SQL注入,可以在发现注入攻击bug时,对bug产生原因进行定位。
1)严格检查输入变量的类型和格式
对于整数参数,加判断条件:不能为空、参数类型必须为数字
对于字符串参数,可以使用正则表达式进行过滤:如:必须为[0-9a-zA-Z]范围内的字符串
2)过滤和转义特殊字符
在username这个变量前进行转义,对’、”、\等特殊字符进行转义,如:php中的addslashes()函数对username参数进行转义
3)利用mysql的预编译机制
把sql语句的模板(变量采用占位符进行占位)发送给mysql服务器,mysql服务器对sql语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给mysql服务器,直接进行执行,节省了sql查询时间,以及mysql服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到mysql服务器,mysql服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。
随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
SQL注入攻击属于数据库安全攻击手段之一,黑客可以通过将任意恶意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器。攻击者可以使用SQL注入漏洞绕过应用程序安全措施;可以绕过网页或Web应用程序的身份验证和授权,并检索整个SQL数据库的内容;还可以使用SQL注入来添加,修改和删除数据库中的记录。
SQL注入漏洞可能会影响使用SQL数据库(如MySQL,Oracle,SQL Server或其他)的任何网站或Web应用程序。犯罪分子可能会利用它来未经授权访问用户的敏感数据:客户信息,个人数据,商业机密,知识产权等。SQL注入攻击是最古老,最流行,最危险的Web应用程序漏洞之一。
SQL注入攻击可以通过数据库安全防护技术实现有效防护,数据库安全防护技术包括:数据库漏扫、数据库加密、数据库防火墙、数据脱敏、数据库安全审计系统。