order by排序猜解列数原理详解
一、order by的两种使用方式
1)按照字段名排序
2)按照索引排序
二、order by怎么判断字段数?
1)正常的排序
3)错误的排序
使用 「联合注入」(SQL注入漏洞的利用方式之一)进行脱库的时候,需要判断页面显示的 「字段」数量,也就是返回的查询结果包含几个字段,最常用的一种判断方式就是利用 order by 排序判断字段数。
一、order by的两种使用方式
首先,我们准备一个「用户表」,表的内容如下
1)按照字段名排序
order by 排序可以按照指定的「字段名」排序,我们可以指定 username 字段,让查询结果按照用户名进行排序
我们可以看到,查询结果按照字段名降序。我们可以指定任意一个「存在」的字段进行排序
2)按照索引排序
除了字段名之外, order by 还可以按照「索引」进行排序,索引就是从左至右将列名按照123排序。我们还是指定 username 字段,让查询结果按照用户名进行排序, username 是查询结果中左边第一个字段,所以对应的索引是 1
我们可以看到,按照索引排序,查询的结果同字段名排序时一样的
二、order by怎么判断字段数?
原理很简单,就是利用数据库的「报错」机制。
1)正常的排序
首先我们来模拟一下正常的「登录」登录功能的查询语句,根据用户名和密码查询用户的信息
我们可以看到,查询结果有两列,接下来我们使用 order by 对查询结果进行排序,首先根据「第一列」也就是 username 进行排序
结果没有变化,这很正常,因为查询结果只有一条数据,再怎么排序也不会发生变化。接下来再根据「第二列」也就是 password 进行排序
还是没有变化,这很正常。
3)错误的排序
上面返回的查询结果中有两个字段,也就是两列数据,所以我们根据第一列和第二列进行排序都可以正常执行,但如果我们根据「第三列」进行排序呢?
我们可以看到,数据库报错了,意思是说不认识第三列,这很正常,查询结果总共就只有两列,如果排序的列数大于两列,自然会失败。利用排序的这一特性,我们可以从第一列开始排序,而后依次按照第二列,第三列…等进行排序,哪一列开始报错,就说明字段数是 「报错列数-1」,比如第三列排序时报错,字段数就是2。