渗透学习-sql注入过程中遇到的问题-针对sort=left(version(),1)的解释-对order by后接字符串的理解

本文探讨了在SQL查询中使用`left(version(),1)`和字符串类型在`orderby`后的排序行为。解释了`left`函数如何从版本号中取第一个字符,并指出在这种情况下,排序依据实际上是字符串规则,而非数值规则。尽管输入不同,如'5'、'less38'或计算值,排序结果通常依赖于磁盘读取顺序,而非预期的数值排序。文章总结了orderby在处理非标准输入时可能产生的误导性结果。
摘要由CSDN通过智能技术生成

问题场景:

这里主要是针对于在我打靶场过程中遇到的一些问题进行解释,即在sqllibs的Less46关使用sort=left(version(),1)依旧能够正常回显的原因,以及对order by后接上字符串即varchar字符类型也能正常回显的解释。


原因分析:

对left这个函数放在order by后的解释:

首先,这里主要解释一下left(version(),1)这里是指从左边起取version()值的第一位,也就是说version()=5.7.26的话,那么left这里就会等于5。

而这里需要注意的是,这里产生出来的值,当放于order by之后时是一个字符串类型的(即varchar类型),也就是说相当于order by “5” 这样子的形式。因此,无论是mid left 还是right最终取出来的都只是“数字内容的字符串”,对它排序仍然使用字符规则,不会得到我们想要的结果。

对order by后接字符串的理解:
假设说我们以order by "5"来执行的话,那么mysql就会按照字面意思是“按数字5排序”,而不是按照表中的第五列进行排序(order by 5是指按照第五列进行排序)。

如果是按照字符规则进行排序的话,这不会在MySQL(除非某些版本进行了改进)中产生正确的排序,除非是偶然的。如果没有进行多余其他的任何操作(如增删改)的话,这里将会按照磁盘中的排序表进行排序(也就是磁盘里读取数据的先后顺序。这应该是由文件系统或者磁盘默认的读取方式所决定的)。

也就是说不管你字符串输入什么,排序基本都是默认的。

输入"5":
在这里插入图片描述
输入"less38"
在这里插入图片描述输入1
在这里插入图片描述 输入left(version(),1):
在这里插入图片描述由上面几个看出,不论字符串输入什么,排序都是一样的,因为order by按字符集排序是无效的,mysql此时就会默认按照磁盘顺序表进行排序。


结语

以上就是我的理解,如有错欢迎指出!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值