MENU

SQL注入类型

接着之前那篇说一说sql注入的类型
感觉分类起来有很多种分法 这里就说说我自己总结的类型
如果有大佬觉得不合理的话 希望能提供下建议

字符型和数字型

数字型和字符型算是sql注入中最根本的类型了
先上数据库 等下也好解释
展示数据库

数字型

数字型注入就是之前所说的
最根本的代码 就是下面这一句

$sql = "select * from sqli where id = {$id}";

数字型注入有一个特点
数字型
我们可以看到这里 1+1 会被处理成 2
所以我们可以用 运算符 来判断是否是数字型注入
注意:+ 不能直接输入在浏览器地址栏 需要用 %2b 代替

字符型

字符型的本质是下面这句代码

$sql = "select * from sqli where id = '{$id}'";

字符型和数字型最大的区别就是单引号了
我们知道在sql语句中 单引号是用来包裹字符串的 没有单引号包裹会报错(本来就可以使用数字的不会报错)
字符型
至于判断 有明显报错的 可以在数据后加上单引号 ' 观察报错判断注入类型
没有的话 还是要靠一定的经验吧

小结一下

判断数字型还是字符型 是注入中很关键的一步
这两种注入的方式有很大不同 从最明显的来说 数字型不需要单引号 而字符型需要加入单引号
这就会使我们最后的payload有很大的不同

具体的分类

数字型和字符型只是很简单的分类 接下来说说具体的注入类型
我目前总结出来这几类
1.可联合查询型
2.可多语句查询型
3.布尔型
4.时间型
5.报错型

可联合查询型 ( union

这种类型就是之前那篇文章所讲解的类型
使用 union 来连接两个 select 语句从而达到注入的目的

可多语句查询型

这种很危险 举个例子

$sql = "select * from sqli where id = {$id}";

我们依旧使用这个语句 假设传入的 id 如下

$id = 1; INSERT INTO `sqli` (`id`, `username`, `password`, `flag`) VALUES (NULL, '1', '1', '1');

那么最终的sql语句会变成这样

select * from sqli where id = 1; INSERT INTO `sqli` (`id`, `username`, `password`, `flag`) VALUES (NULL, '1', '1', '1');

多语句联合查询
我们可以看到数据库里多了一条数据 这一种类型特别危险
出现这种漏洞就可以随意操作数据库 不过一般也很少存在

布尔型

布尔型非常常见
在之前那篇里 我们也用到布尔型的一点知识
在判断字段数的时候 我们根据不同的返回结果 判断出了真实的字段数
这就是布尔型的简单应用
不过布尔型最大的用途应该是在 盲注
有些时候因为种种原因我们是不能直接知道数据库中的数据
我们只能通过页面上的一些变化 猜测出我们输入的数据是否正确
这个时候我们就需要使用 盲注 的技巧 而这也是对于布尔型注入的应用
我们知道 and 可以连接sql语句 并且需要在前后两个语句同时为真时才会返回正确的结果
那么我们可以这么利用
盲注
盲注的本质和sql注入是一样的只是利用不同
盲注需要使用 length() substr() mid() scii() 之类的函数来进行注入

length()函数能返回文本字段中值的长度
substr()函数用于从文本字段中提取字符
mid()函数同上
ascii()函数返回字符串的ascii值

像获得具体数据库名是可以使用 如下语句

select * from sqli where id = 1 and ascii(substr(database(), 0, 1)) > 97

这里可以使用二分法 当然也可以简单粗暴的枚举

时间型

基于时间的注入 也基本上是用在 盲注 这方面
主要应对于 不能直接判断出输入数据的正确性
简单的来说 就是我们无法直观的观察出页面上的不同 从而无法使用布尔值来判断
这时候就需要使用神奇的 sleep() 函数
sleep() 函数能延迟结果返回的时间
如果正确 返回的时间就会变长 但是错误的话 就会立刻返回结果
这样利用时间差 我们就可以判断输入语句的正确性
举个例子吧
时间
我们可以看到正确的时候 返回的时间是 5秒 然而不正确的时候 0秒
这就是基于时间的注入

报错型

报错型注入 需要能返回sql错误信息 然后构造特殊的sql语句 使错误信息中包含我们需要的数据
同样举例说明
报错
我们可以看到 数据库名出现在了报错信息里
这就是最简单的报错注入
报错型的内容还是比较多的 之后单独拿出来讲讲

再说一个特殊的吧

insert 语句注入 我们现在碰到的都是 select 语句的注入
然而 insert 语句有个特点 不能和union一起使用
那么如何注入呢
insert型
我们可以看到 数据库名被插入到数据库中了 那么只要能查出对应的字段就可以知道数据库名了

总结

上述就是我所总结的sql注入类型
我也就是讲了讲我所知道的类型 可能不够全面 或许还存在着问题
有大佬看到的话 也希望能提出改进的建议
不过呢 我所举出了的例子都是最基本的 而正真的我们要面对的 都是存在着很多防御的情况
这时候就需要一些技巧去绕过这些防御
接下来我会说说我自己知道的一些 sql绕过的技巧

Tags: CTF, WEB, SQLI
Archives QR Code
QR Code for this page
Tipping QR Code
Comment Lists
  1. hammer hammer

    写的挺详细的

  2. 不懂了

  3. 写得挺不错的呐,学习了。

Leave a Comment