SQL注入
- 1、简介
- 2、常见的注入类型
- 2.1 数字型注入
- 2.2 字符型注入
- 2.3其他注入类型
1、简介
SQL注入(SQL Injection)是这样的一个漏洞:应用程序在向后台数据库传递SQL(Structured Query Language,结构化查询语言)查询时,如果为攻击者提供了影响查询的能力,就会引发SQL注入。
SQL注入的本质,就是把用户输入的数据当作代码执行。这有两个关键条件:
1、用户能够控制输入;
2、原本程序要执行的程序,拼接了用户输入的数据。
举一个很简单的例子。在很多网站上有登录界面,需要输入账号密码,若以一个特殊的用户名:‘ or 1=1 --进行登录,密码可以随意写或者不写,在点击登录后还行啦可以正常登录。
其后台的SQL查询语句为:
select * from admin where username=‘name’ and password = ‘password’
而输入上面的用户名后,最终执行的SQL语句为:
select * from admin where username = ’ ’ or 1=1 – 'and password = ’ ’
由上面的SQL语句我们可以看出,-- 符号后面的内容被注释掉了,where后面的判断语句username = ’ ’ or 1=1 为永真,那么最终执行的SQL语句相当于:
select *from admin
这里只是一个简单的例子,但是其危害还是很大。例如,在SQL Server 环境下(支持多语句执行),用户名框中输入如下语句
’ or 1=1;drop table admin –
那么这里就直接删除了admin表了。由此得知,SQL注入形成的原因就是:用户输入的数据被SQL解释器执行。
2、常见的注入类型
数字型注入和字符型注入
2.1 数字型注入
当输入的参数为整型时,如id、页码等。如果存在注入漏洞,则可以认为是数字型注入。以
http://www.xxx.com/test.php?id=7 ,为例猜测其SQL的语句为 select * from tabel where id=7,测试步骤如下:
① 在url最后加 ’ ,即 http://www.xxx.com/test.php?id=7‘ 页面出现异常。SQL 语句为:select *from table where id=7’ ,这样的语句肯定会出错,导致脚本程序无法从数据库中正常获取数据斜体样式
② http://www.xxx.com/test.php?id=7 and 1=1 返回页面正常,执行SQL语句为 select *from table where id=7 and 1=1;
③ http://www.xxx.com/test.php?id=7 and 1=2 返回页面异常,执行SQL语句为 select *from table where id=7 and 1=2,"and 1=2"始终为假,所以返回数据与原始请求有差异。
以上三个步骤全部满足,则程序可能存在SQL注入漏洞。
这种数字型注入最多出现在ASP、PHP等弱类型语言中。弱类型语言会自动推导变量类型,而对于JAVA、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。
2.2 字符型注入
当输入参数为字符串时,称为字符型。
数字型与字符型注入最大的区别在于:数字类型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
数字型例句如下:
select * from table where id = 8
字符型例句如下:
select * from table where username=‘admin’
字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。
当查询内容为字符串时,SQL代码如下:
select * from table where username= ‘admin’
当攻击者进行SQL注入时,如果输入“admin and 1=1”,则无法进行注入。因为“admin and 1=1”会被数据库当作查询的字符串,SQL语句如下:
select * from table where username =‘admin and 1=1’
这时要想进行注入,则必须注意字符串闭合问题。如果输入“admin’ and 1=1 --”就可以继续注入,SQL语句如下:
select * from table where username = ‘admin’ and 1=1 --’
只要是字符串类型注入,都必须闭合单引号以及注释多余代码。
另外需要注意的是:数据库不同,字符串连接符也不同,如MySQL连接符为空格,SQL Server 连接符号为“+”,Oracle连接符为“||”。
2.3其他注入类型
SQL注入还有其他许多类型的注入,比如POST注入、Cookie注入、延时注入、搜索注入等。但是可以都笼统的分为字符型与数字型。因为对数据库进行查询时,输入一般只有两种:一种是数字型,比如where id =1、where age>18;另一种就是字符型,比如where name=‘root’。
在后续的学习笔记中将会对每个特殊的注入进行学习。