SQL注入原理是什么,其方式有哪几种?
发布时间:2023-05-18 14:27:16 所属栏目:安全 来源:
导读: SQL 注入原理
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数
SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数
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. 其他类型 其实我觉得 SQL 注入只有两种类型:数字型与字符型。很多人可能会说还有如:Cookie 注入、POST 注入、延时注入等。的确如此,但这些类型的注入归根结底也是数字型和字符型注入的不同展现形式或者注入的位置不同罢了。 以下是一些常见的注入叫法: POST注入:注入字段在 POST 数据中 Cookie注入:注入字段在 Cookie 数据中 延时注入:使用数据库延时特性注入 搜索注入:注入处为搜索的地方 base64注入:注入字符串需要经过 base64 加密 常见数据库的注入 攻击者对于数据库注入,无非是利用数据库获取更多的数据或者更大的权限,利用的方式可以归结为以下几类: 查询数据 读写文件 执行命令 攻击者对于程序注入,无论任何数据库,无非都是在做这三件事,只不过不同的数据库注入的 SQL 语句不一样罢了。 这里介绍三种数据库的注入:Oracle 11g、MySQL 5.1 和 SQL Server 2008。 SQL Server 1. 利用错误消息提取信息 SQL Server 数据库是一个非常优秀的数据库,它可以准确地定位错误信息,这对攻击者来说是一件十分美好的事情,因为攻击者可以通过错误消息提取自己想要的数据。 ① 枚举当前表或者列 抛出错误: 由此可以看到包含列名 username。可以一次递归查询,知道没有错误消息返回位置,这样就可以利用 HAVING 字句得到当表的所有列名。 注:Select指定的每一列都应该出现在Group By子句中,除非对这一列使用了聚合函数 ②. 利用数据类型错误提取数据 如果试图将一个字符串与非字符串比较,或者将一个字符串转换为另一个不兼容的类型,那么SQL 编辑器将会抛出异常。 如下列 SQL 语句:SELECT * FROM user WHERE username = 'abc' AND password = 'abc' AND 1 > (SELECT TOP 1 username FROM users) 2. 获取元数据 SQL Server 提供了大量视图,便于取得元数据。可以先猜测出表的列数,然后用 UNION 来构造 SQL 语句获取其中的数据。 如: SELECT *** FROM *** WHERE id = *** UNION SELECT 1, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 若当前表的列数为 2,则可以 UNION 语句获取当前数据库表。具体怎么猜测当前表的列数,后面进行描述。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐