接SQL报错注入(上):
其他函数
Floor()函数
- floor(),rand(),count(),group by联合使用
- floor():向下取整
- rand():生成一个0-1之间的随机数,不包括0和1
- count(*):统计某个表下面一共有多少记录
- group by XXX:按照一定的规则对XXX进行排序
- 报错原理:group by和rand()联合使用的时候,如果临时表中没有该主键,则再插入的之前会再计算一次rand(),然后再由group by将计算出来的主键直接插入到临时表格之中,导致主键重复,然后报错。
在这里使用group by的时候回生成一张临时表,也叫做虚拟表,而且表都是由主键的,作为主键的列是不能由重复的,好比第一个值的主键为1,那么就不能再有主键为1的值了,接下来可以再是2、3…
首先这是一个虚拟表,自然就有主键。当使用group by去读这些数据的时候,好比上面这个伪随机序列,读完第一列,发现主键之中没有0这个数字,于是就会记录这个主键,但是!他不会接着记录,而是会去读下一行,然后记录下一行的主键。如:现在读到第一行,想要记录数字0,但是他会先往下读一行,然后再进行记录,这个时候记录的就是1了,读到第三行还是1,不用记录且正常进行,读到第四行,发现是数字0了,于是按照它的机制,会往下读一行,然后进行记录,此时下一行就是1,于是就记录主键1,但是因为主键1之前已经记录下来了,所以此时发生主键冲突,就会产生错误了。
这里是个例子,将user()的位置换做别的,就可以显示出别的错误了。
爆库:
可以看到使用的security,后面的数字1是rand()函数产生的。
这里可以看到具体信息了。其实就是利用了count的统计与group by的合作,然后基于主键唯一的机制,然后造成了这个错误。
EXP()函数(数据库版本号[5.5.5,5.5.49])
- 作用:计算以e为底的幂值
- 语法:exp(X)
- 报错原理:当参数X超过了710之后,exp函数就会报错。
实操
这里使用了limit进行查看,
可以在再后面添加表名进行查看列的信息: