sql注入的三种方式是什么


本文摘自PHP中文网,作者醉折花枝作酒筹,侵删。

sql注入的三种方式是:1、数字型注入,当输入的参数为整型时,可能存在数字型注入漏洞;2、字符型注入,当输入参数为字符串时,可能存在字符型注入漏洞;3、搜索型注入,在进行数据搜索时没过滤搜索参数。

本教程操作环境:windows7系统、mysql8.0版、Dell G3电脑。

SQL 注入原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

SQL 注入分类

1. 数字型注入

当输入的参数为整型时,则有可能存在数字型注入漏洞。

假设存在一条 URL 为:HTTP://www.aaa.com/test.php?id=1

可以对后台的 SQL 语句猜测为:

SELECT * FROM table WHERE id=1

判断数字型漏洞的 SQL 注入点:

① 先在输入框中输入一个单引号 '

这样的 SQL 语句就会变为:

SELECT * FROM table WHERE id=1',

不符合语法,所以该语句肯定会出错,导致脚本程序无法从数据库获取数据,从而使原来的页面出现异常。

② 在输入框中输入 and 1 = 1

SQL语句变为:

SELECT * FROM table WHERE id=1 and 1 = 1

语句正确,执行正常,返回的数据与原始请求无任何差异。

③ 在数据库中输入 and 1 = 2

SQL 语句变为:

SELECT * FROM table WHERE id=1 and 1 = 2

虽然语法正确,语句执行正常,但是逻辑错误,因为 1 = 2 为永假,所以返回数据与原始请求有差异。

如果以上三个步骤全部满足,则程序就可能存在数字型 SQL 注入漏洞。

2. 字符型注入

当输入参数为字符串时,则可能存在字符型注入漏洞。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符型一般需要使用单引号来闭合。

字符型注入最关键的是如何闭合 SQL 语句以及注释多余的代码。

假设后台的 SQL 语句如下:

SELECT * FROM table WHERE username = 'admin'

判断字符型漏洞的 SQL 注入点:

① 还是先输入单引号 admin' 来测试

这样的 SQL 语句就会变为:

SELECT * FROM table WHERE username = 'admin''。

页面异常。

② 输入:admin' and 1 = 1 --

注意:在 admin 后有一个单引号 ',用于字符串闭合,最后还有一个注释符 --(两条杠后面还有一个空格!!!)。
SQL 语句变为:

SELECT * FROM table WHERE username = 'admin' and 1 = 1 --

页面显示正确。

③ 输入:admin' and 1 = 2 --

SQL 语句变为:<

SELECT * FROM table WHERE username = 'admin' and 1 = 2 --

页面错误。

满足上面三个步骤则有可能存在字符型 SQL 注入。

3.搜索型注入

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%'

以下是一些常见的注入叫法:

  • POST注入:注入字段在 POST 数据中

  • Cookie注入:注入字段在 Cookie 数据中

  • 延时注入:使用数据库延时特性注入

  • 搜索注入:注入处为搜索的地方

  • base64注入:注入字符串需要经过 base64 加密

常见数据库的注入

攻击者对于数据库注入,无非是利用数据库获取更多的数据或者更大的权限,利用的方式可以归结为以下几类:

  • 查询数据

  • 读写文件

  • 执行命令

攻击者对于程序注入,无论任何数据库,无非都是在做这三件事,只不过不同的数据库注入的 SQL 语句不一样罢了。

这里介绍三种数据库的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。

SQL Server

1. 利用错误消息提取信息

SQL Server 数据库是一个非常优秀的数据库,它可以准确地定位错误信息,这对攻击者来说是一件十分美好的事情,因为攻击者可以通过错误消息提取自己想要的数据。

① 枚举当前表或者列

假设选择存在这样一张表:

在这里插入图片描述

查询 root 用户的详细信息,SQL 语句猜测如下:

SELECT * FROM user WHERE username = 'root' AND password = 'root'

攻击者可以利用 SQL Server 特性来获取敏感信息,在输入框中输入如下语句:

' having 1 = 1 --

最终执行的 SQL 语句就会变为:

SELECT * FROM user WHERE username = 'root' AND password = 'root' HAVING 1 = 1 --

那么 SQL 的执行器可能会抛出一个错误:

在这里插入图片描述

攻击者就可以发现当前的表名为 user、而且存在字段 id。

攻击者可以利用此特性继续得到其他列名,输入如下语句:

' GROUP BY users.id HAVING 1 = 1 --

则 SQL 语句变为:

SELECT * FROM user WHERE username = 'root' AND password = 'root' GROUP BY users.id HAVING 1 = 1 --

抛出错误:

在这里插入图片描述

由此可以看到包含列名 username。可以一次递归查询,知道没有错误消息返回位置,这样就可以利用 HAVING 字句得到当表的所有列名。

注:Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数

②. 利用数据类型错误提取数据

如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。

如下列 SQL 语句:

SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users)

执行器错误提示:

在这里插入图片描述

这就可以获取到用户的用户名为 root。因为在子查询 SELECT TOP 1 username FROM users 中,将查询到的用户名的第一个返回,返回类型是 varchar 类型,然后要跟 int 类型的 1 比较,两种类型不同的数据无法比较而报错,从而导致了数据泄露。

利用此方法可以递归推导出所有的账户信息:

SELECT * FROM users WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users WHERE not in ('root'))。

通过构造此语句就可以获得下一个 用户名;若把子查询中的 username 换成其他列名,则可以获取其他列的信息,这里就不再赘述。

2. 获取元数据

SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。

如:

SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

若当前表的列数为 2,则可以 UNION 语句获取当前数据库表。具体怎么猜测当前表的列数,后面进行描述。

一些常用的系统数据库视图:

数据库视图说明
SYS.DATABASESSQL Server 中的所有数据库
SYS.SQL_LOGINSSQL Server 中的所有登录名
INFORMATION_SCHEMA.TABLES当前用户数据库中的所有数据表
INFORMATION_SCHEMA.COLUMNS当前用户数据库中的所有列
SYS.ALL_COLUMNS用户定义对象和系统对象的所有列的联合
SYS.DATABASE_PRINCIPALS数据库中每个权限或列异常权限
SYS.DATABASE_FILES存储在数据库中的数据库文件
SYSOBJECTS数据库中创建的每个对象 (包括约束、日志以及存储过程)
3. ORDER BY 子句猜测列数

可以用 ORDER BY 语句来判断当前表的列数。

阅读剩余部分

相关阅读 >>

mysql怎样防止SQL注入问题

web安全之如何防止SQL注入

解决 sql 注入问题

常见SQL注入的方法

如何使用pdo查询mysql避免SQL注入的方法

如何防止SQL注入攻击?

SQL注入一般可通过网页表单直接输入么

什么是SQL注入、xss和csrf?

mysql如何防止SQL注入

SQL注入的三种方式是什么

更多相关阅读请进入《SQL注入》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...