SQL注入初理解

一、SQL注入概述

SQL是操作数据库数据的“结构化查询语言”,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,再传给数据库服务器来执行数据库命令。
SQL注入是指web应用程序对用户输入数据的合法性没有判断或过滤不严,然后攻击者就可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,这样就可以在管理员不知情的情况下实现非法操作,实现欺骗数据库服务器执行非授权的任意查询,进一步得到相应的数据信息。

二、SQL注入的原理

SQL注入攻击通过操作输入修改SQL语句,以达到执行代码对Web服务器进行攻击。也就是说在 post / getweb 表单、输入域名或页面请求的查询字符串中插入SQL命令,最终使web服务器执行恶意命令的过程。

三、常见的SQL注入语句

1、创建数据库 :
“CREATE DATABASE database-name”。
2、删除数据库:
“drop database dbname”
3、创建新表:
“create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],)”。
4、删除新表:
“drop table tabname”
5、增加一个列:
“Alter table tabname add column col type”。
(注:列增加后不能删除,列加上后数据类型也不能改变,唯一能改变的是增加 varchar 类型的长度。)
6、创建索引:
“create [unique] index idxname on tabname(col…)”。
7、删除索引:
“drop index idxname”
(注:索引是不能更改的,如果要更改必须删除之后重新建。)
8、添加主键:
“Alter table tabname add primary key(col)”。
9、删除主键:
“Alter table tabname drop primary key(col)”
10、创建视图:
“create view viewname as select statement”。
11、删除视图:
“drop view viewname”
12、使用原有的表创建新表:
“creat table tab_new like tab_old”。
13、更新:
update table1 set field1=value1 where 范围
14、查找:
select * from table1 where field1 like ’%value1%’ (所有包含‘value1’这个模式的字符串)
15、排序:
select * from table1 order by field1,field2 [desc]
16、求和:
select sum(field1) as sumvalue from table1
17、平均:
select avg(field1) as avgvalue from table1
18、最大:
select max(field1) as maxvalue from table1
19、最小:
select min(field1) as minvalue from table1[separator]
e table tab_new like tab_old”。

四、SQL注入的方式

根据输入的参数,SQL注入的方式可以大致分为两类:数字型注入和字符型注入。

1、数字型注入

当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。
这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
判断数字型漏洞的 SQL 注入点:
(1)先在输入框中输入一个单引号 ’
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE id=1’,
不符合语法,该语句肯定会出错,导致脚本程序无法从数据库获取数据,使原来的页面出现异常。
(2) 在输入框中输入 and 1 = 1
SQL语句变为:
SELECT * FROM table WHERE id=1 and 1 = 1
语句正确,执行正常,返回的数据与原始请求无任何差异。
(3) 在数据库中输入 and 1 = 2
SQL 语句变为:
SELECT * FROM table WHERE id=1 and 1 = 2
语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为假,所以返回数据与原始请求有差异。
如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

2、字符型注入

当输入参数为字符串时,称为字符型。数字型注入与字符型注入的最大区别在于:数字型注入不需要单引号闭合,而字符串类型注入一般需要使用单引号来闭合。字符型注入最关键的是如何闭合SQL语句以及注释多余的代码。
字符型注入的测试注入语句是:
‘and ’‘=’ 这个正常显示
‘and ’‘=’1  这个不正常显示
如果这两个条件同时出现好就表明有注入。
判断字符型漏洞的 SQL 注入点
(1) 是先输入单引号 admin’ 来测试
这样的 SQL 语句就会变为:
SELECT * FROM table WHERE username = ‘admin’’。
页面异常。
(2)输入:admin’ and 1 = 1 - -
注意:在 admin 后有一个单引号 ’,用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 1 - -
页面显示正确。
(3)输入:admin’ and 1 = 2 - -
SQL 语句变为:
SELECT * FROM table WHERE username = ‘admin’ and 1 = 2 - -
页面错误。
如果满足上面三个步骤,则程序可能存在字符型 SQL 注入。
注:以下几种注入是数字型和字符型注入的不同形式。
POST注入:注入字段在 POST 数据中。
Cookie注入:注入字段在 Cookie 数据中。
延时注入:使用数据库延时特性注入。
搜索注入:注入处为搜索的地方。
base64注入:注入字符串需要经过 base64 加密。

五、SQL注入的攻击方式

1、基于布尔的盲注

因为web的页面返回值都是True或False,所以布尔盲注就是注入后根据页面返回值来得到数据库信息的一种办法。

2、基于时间的盲注

基于时间的盲注,就是根据web页面相应的时间差来判断该页面是否存在SQL注入点。

3、联合查询注入

联合查询注入是使用union合并两个或多个SELECT语句的结果集,所以两个及以上的select必须有相同列、且各列的数据类型也都相同。联合查询注入可在链接最后添加order by 9基于随意数字的注入,根据页面的返回结果来判断站点中的字段数目。使用联合查询进行注入的前提是要进行注入的页面必须有显示位。

4、基于错误信息的注入

基于错误信息的注入是一种公式化的注入方法,在页面没有显示位,但是echo mysql_error();函数输出了错误信息的时候使用。

六、SQL注入过程

1、SQL注入点探测。
2、收集后台数据库信息。
3、猜解用户名和密码。
4、查找Web后台管理入口。
5、入侵和破坏。

扫描二维码关注公众号,回复: 12014183 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_45970607/article/details/108558940