本章节主要介绍Between and操作符,在MYSQL数据库中进行SQL注入。
1.小皮面板
2.php5.5.9nts
3.mysql5.7.26
4.sql-labs靶场
BETWEEN 操作符选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。
语法格式:
a between x and y
a就是我们要的值,而a就是和x、y做对比,a要大于等于x且a要小于等于y,这样and才会返回true
也就是我们数学上 x <= a <= y。
但是!但是!但是!比较的方式却不是我们普遍认为的比较法,而是根据ascii码的顺序进行比较,也就是字典比较法。这个后面会讲,现在讲讲这个操作符比较常见的用法:

比如这样的一张表
我们想只显示id列5到10的结果 ,我们就可以使用操作符:
SELECT * FROM `users` WHERE id BETWEEN 5 AND 10

那么如果我们超出这个范围呢?比如BETWEEN 5 AND 20

它并不会出错。很明显,当我们使用在筛选表上的时候。如果没有匹配行:会返回空结果集,不显示任何行。

那么这个操作符的正常使用我们就告一段落。
接下来说的是如何运用在SQL注入中的字符对比。
首先要弄明白 Between and 的操作符的对比逻辑。a和x、y到底是如何对比的。
要弄明白很简单,1和2比,谁大?2大
那么10和2比,谁大?10大?
错!
10>2是我们是数学上的比较方式,而Between and(字典顺序)的比较方式应该是这样的:
首先'10'的第一个字符'1'和'2'的第一个字符'2'进行比较,也就是说!字典顺序的比较首先是对应的字符相比较,而不是'10'这两个字符去和'2'这一个字符去比较。

在ascii码中'1'比'2'小,那么第一个字符的比较完成了。不管'1'字符后面的其他字符是什么,都会比'2'小
所以'10'小于'2'。
再来看一个'10'和'10asdad'比,谁大?
'10asdad'大,这个很好理解,因为是按照一个一个字符进行对比的。
'1'和'1'比,'0'和'0'比,'asdad'就没人比了,所以'10asdad'一定是比'10'大
那么根据这个其实就很好比了
apple和application,比的其实是第五个字符'e'和'i'

很明显i大,所以application大于apple
ban和banana,前三个字符相同,且banana更长,所以banana大
好了懂了基本的比较以后,我们直接看语句。
SELECT '10' BETWEEN '2' AND '5';
只有当a满足x <= a <= y。操作符BETWEEN AND才会返回1(true),否则返回0(false)
答案是:返回0
为什么?
首先a <= y 为 '10' <= '5' 吗?,第一个字符进行对比 '1' 和 '5' 比,那肯定是5大,所以满足条件。
x <= a 吗? '2' <= '10' , 第一个字符进行对比 '2' 和 '1' 比,那肯定是2大,所以不满足条件,最后返回0。
懂了这个以后其实就很简单啦:
构造布尔注入语句:SELECT mid(DATABASE(),1,1) BETWEEN 'a' AND 'a' 
这样就很容易的探测出当前数据库第一个字符是s了~
为什么这样做?
x <= a <= y,说明只要x和y都等于a,也可以返回1。且对比的时候字符是一个一个进行对比的,那么我们利用截取函数将每个字符一一提出,不就可以了吗?
那么如果不用截取函数呢?

SELECT 'security' BETWEEN 'a' AND 'z' 使用这个payload的前提是,你知道数据库的名就是字母之间的,没有其他的字符了。就可以使用二分法来试试。
比如你现在的数据库名字'security', 你不知道这个名字,那么全部小写的情况下,你就可以
SELECT 'security' BETWEEN 'a' AND 'z' 返回 1 说明第一个字符在a和z之间
SELECT 'security' BETWEEN 'a' AND 't' 返回 1 说明第一个字符在a和t之间
以此类推,一直推到:
SELECT 'security' BETWEEN 'a' AND 'r' 返回 0 说明一个字符不在a和r之间
r的上一个字母是s
SELECT 'security' BETWEEN 'a' AND 's' 返回 0 说明一个字符不在a和s之间
s的上一个字母是t
SELECT 'security' BETWEEN 'a' AND 't' 返回 1 说明第一个字符在a和t之间
那么说明第一个字符就是s了~
那么第二个字符也是如此推:
SELECT 'security' BETWEEN 'sa' AND 'sz' 返回 1 说明第二个字符在a和t之间。
好了,现在要注意的东西要来了!!!!
这样写其实是很有局限性的,因为众所周知,我们不知道数据库表中的字段名到底会含有什么符号!
当字段是!2321~aaa 这样杂乱的字符,就有出现一个问题,MYSQL的排序问题
例如:


那么我们是不是可以写:
但你可以发现,虽然s在空格和波浪号之间,但是,还是返回0。
这就是该操作符的局限性了。
那么我们去靶场试试看:1' and (select database() BETWEEN 'a' AND 't')-- -


是不是成功的爆破出数据库的第一个字符是s了~
而我们前面所说的局限性,解决办法也很简单,加上一个操作符即可BINARY,主要原因呢我说不清楚,所以就没说,可以理解为mysql在对比字符和对比符号的时候使用的排序是不同的~(详细的肯定要自己去了解了~)
SELECT BINARY 's' BETWEEN ' ' AND '~'

本文所包含的内容仅用于教育和研究目的,旨在提高信息安全意识,帮助用户了解网络安全防护的重要性。
文章中提及的任何渗透测试技巧、工具或方法,仅供合法授权的安全研究和测试使用。在进行任何渗透测试或安全测试之前,请确保您已获得相关系统或网络所有者的明确授权。
本文作者不对任何因使用文章内容而导致的非法活动、损害或其他不良后果承担任何责任。读者在实施任何技术之前应确保遵守所有适用的法律法规。
本文内容不支持或鼓励任何形式的恶意攻击、未授权的入侵或网络犯罪。
本文内容仅限于教育用途,不得以任何方式用于未经授权的网络安全攻击或破坏行为。