场景
一个存在sql注入的页面,但是页面不显示从数据库查询的信息,
此时可以通过错误的sql语句查看页面是否有报错信息,如果存在报错信息则可以使用报错信息进行数据获取
分析
0x0 查看表信息
0x1 分组查看
这里可以看出分组时,如果有多个相同字段会选用第一个显示
0x2 统计表信息
统计信息正常
0x3 添加concat(0)字段
0x4 对concat(0)分组
SELECT *,CONCAT(0) FROM test GROUP BY CONCAT(0)
此时猜测先执行SELECT *,CONCAT(0) FROM tes 后进行GROUP BY CONCAT(0)
通过0x1得知分组是根据CONCAT(0)这一列进行分组
0x5 修改concat内容,进行进一步验证
此时分组后也是显示全部信息,因为z列没有重复
此时验证了我的猜测,分组根据concat()列
0x8 count()报错
此时进行count则进行报错
原理猜测:
以上可以看作查询过程三种状态
报错的原因在于填充表向分组表过度的时候
注意:查询的时候如果使用rand()函数,该函数会被调用多次,这是出现问题的关键
根据concat列可以看出floor(rand(0)*2)该函数是存在规律的
0110110
1.第一条数据 1 aa 0分组
分组时floor(rand(0)*2)调用一次得出0,此时向分组表(虚表)插入0作为主键,但是插入时
floor(rand(0)*2)会被在调用一次,因此插入的数值为1,预期的值应该插入0,但实际插入了1,如下图
2.第二条数据2 bb 1分组
分组时floor(rand(0)*2)被调用,此时是第三次被调用得出的数值为1,分组表中存在1不进行处理
3.第三条数据 3 cc 1
分组时floor(rand(0)*2)再次被调用,此时是第四次调用数值为0,分组表中不存在0准备插入数值0,插入时第五次调用floor(rand(0)*2),得到了数值1,因为分组表中存在了1,此时插入则进行报错,
报错的内容为插入的内容,如果在concat函数内加上我们需要的信息,这样报错时则会有敏感信息泄露