想到哪写道哪(三):SQL注入Between and操作符的使用
嗯,用户让我帮忙总结一下这篇文章的内容,控制在100字以内,而且不需要用“文章内容总结”这样的开头。直接写描述就行。那我先仔细读一下文章。 文章主要讲的是MySQL中的BETWEEN AND操作符在SQL注入中的应用。首先介绍了BETWEEN AND的基本用法,比如从表中筛选特定范围的数据。然后重点讲解了这个操作符在SQL注入中的使用方法,特别是字符比较的逻辑,是基于ASCII码的字典顺序,而不是数学上的大小比较。 接着,文章通过几个例子展示了如何利用BETWEEN AND进行布尔注入,比如提取数据库名的第一个字符。还提到了使用二分法来逐步推断数据库名的其他字符。不过也指出了这种方法的局限性,比如当字段包含特殊符号时可能会遇到问题,并建议使用BINARY关键字来解决排序问题。 最后,文章提醒读者注意安全责任,强调这些技术仅用于合法的安全研究和测试。 总结下来,文章主要介绍了BETWEEN AND操作符的基本功能及其在SQL注入中的应用技巧,并讨论了其局限性和解决方案。 </think> 本文介绍了MySQL中`BETWEEN AND`操作符的基本用法及其在SQL注入中的应用。通过字符对比逻辑(基于ASCII码的字典顺序)和布尔注入技巧(如使用`SELECT mid(DATABASE(),1,1) BETWEEN 'a' AND 'a'`),可以提取数据库信息。文中还讨论了该方法的局限性及解决方案(如使用`BINARY`关键字),并强调合法使用和安全责任。 2026-1-21 08:18:38 Author: www.freebuf.com(查看原文) 阅读量:1 收藏

序言

本章节主要介绍Between and操作符,在MYSQL数据库中进行SQL注入。

环境

1.小皮面板

2.php5.5.9nts

3.mysql5.7.26

4.sql-labs靶场

介绍

between and 操作符

BETWEEN 操作符选取介于两个值之间的数据范围内的值,这些值可以是数值、文本或者日期。

语法格式:

a between x and y

a就是我们要的值,而a就是和x、y做对比,a要大于等于x且a要小于等于y,这样and才会返回true

也就是我们数学上 x <= a <= y。

但是!但是!但是!比较的方式却不是我们普遍认为的比较法,而是根据ascii码的顺序进行比较,也就是字典比较法。这个后面会讲,现在讲讲这个操作符比较常见的用法:

1768915389_696f81bde280400b5b67b.png!small?1768915390392

比如这样的一张表

我们想只显示id列5到10的结果 ,我们就可以使用操作符:

SELECT * FROM `users` WHERE id BETWEEN 5 AND 10

1768915522_696f8242488fe46dcaaaa.png!small?1768915522995

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

1768915590_696f828623257c0800ff2.png!small?1768915591217

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

1768915996_696f841cbe1231c85b476.png!small?1768915997496

那么这个操作符的正常使用我们就告一段落。

接下来说的是如何运用在SQL注入中的字符对比。

首先要弄明白 Between and 的操作符的对比逻辑。a和x、y到底是如何对比的。

要弄明白很简单,1和2比,谁大?2大

那么10和2比,谁大?10大?

错!

10>2是我们是数学上的比较方式,而Between and(字典顺序)的比较方式应该是这样的:

首先'10'的第一个字符'1'和'2'的第一个字符'2'进行比较,也就是说!字典顺序的比较首先是对应的字符相比较,而不是'10'这两个字符去和'2'这一个字符去比较。

1768972567_69706117522171cee8334.png!small?1768972566776

在ascii码中'1'比'2'小,那么第一个字符的比较完成了。不管'1'字符后面的其他字符是什么,都会比'2'小

所以'10'小于'2'。

再来看一个'10'和'10asdad'比,谁大?

'10asdad'大,这个很好理解,因为是按照一个一个字符进行对比的。

'1'和'1'比,'0'和'0'比,'asdad'就没人比了,所以'10asdad'一定是比'10'大

那么根据这个其实就很好比了

apple和application,比的其实是第五个字符'e'和'i'

1768979149_69707acd9091e3bee6dfa.png!small?1768979148808

很明显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' 1768979900_69707dbc2fb4d0dc58e8b.png!small?17689798994591768979926_69707dd64f35c2cfb4d13.png!small?1768979925469这样就很容易的探测出当前数据库第一个字符是s了~

为什么这样做?

x <= a <= y,说明只要x和y都等于a,也可以返回1。且对比的时候字符是一个一个进行对比的,那么我们利用截取函数将每个字符一一提出,不就可以了吗?

那么如果不用截取函数呢?

1768980045_69707e4df07bbb3cd4edc.png!small?1768980045355

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的排序问题
例如:

1768981896_697085889a4716bbd6da4.png!small?1768981895998

1768981913_69708599f22731a5d3c0f.png!small?1768981913446

那么我们是不是可以写:

1768981935_697085afa934c63194a2b.png!small?1768981934833但你可以发现,虽然s在空格和波浪号之间,但是,还是返回0。

这就是该操作符的局限性了。

函数如何用于SQL注入

那么我们去靶场试试看:1' and (select database() BETWEEN 'a' AND 't')-- -

1768982118_69708666a4fa08feb9fd3.png!small

1768982149_697086857c4104393ac8f.png!small?1768982149423

是不是成功的爆破出数据库的第一个字符是s了~

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

SELECT BINARY 's' BETWEEN ' ' AND '~'

1768983039_697089ff63ea0481409e1.png!small?1768983038899

免责声明

  • 本文所包含的内容仅用于教育和研究目的,旨在提高信息安全意识,帮助用户了解网络安全防护的重要性。

  • 文章中提及的任何渗透测试技巧、工具或方法,仅供合法授权的安全研究和测试使用。在进行任何渗透测试或安全测试之前,请确保您已获得相关系统或网络所有者的明确授权。

  • 本文作者不对任何因使用文章内容而导致的非法活动、损害或其他不良后果承担任何责任。读者在实施任何技术之前应确保遵守所有适用的法律法规。

  • 本文内容不支持或鼓励任何形式的恶意攻击、未授权的入侵或网络犯罪。

  • 本文内容仅限于教育用途,不得以任何方式用于未经授权的网络安全攻击或破坏行为。


文章来源: https://www.freebuf.com/articles/vuls/467512.html
如有侵权请联系:admin#unsafe.sh