张小白的渗透之路(九)-SQL注入详细操作步骤-报错注入

报错注入

1.报错注入原理

构造payload让信息通过错误提示回显出来

ps: payload就是代码中最关键的数据,
比如:查找用户名,这条命令中,用户名就是最关键的数据

2.报错注入条件

  1. 查询不回显错误的信息不回显内容,会打印错误信息
  2. update、insert等语句,会打印错误信息

3.报错注入方法

凡是可以让错误信息显示的函数(语句),都能实现报错注入,这里我们列举1种。
floor()函数

select count(*) from information_schema.tables group by cocat((select version()),floor(rand(0)*2));

这句话想要查询的是数据表的数量。
这条报错语句的原理是利用group by 对rand()函数进行操作时产生错误
具体原理如下

  1. 例如select age,count(*) from student group by age; 其实在group by这个查询语句中,
    在数据库中的显示结果其实是产生一张新的表, 在group by执行过程中一行行的去扫描原始表的字段值,
    如果age在新表并不存在,那么就将他插入,count()设置为1,如果已经存在,就在count()的基础上加1。

    ps: group by后的字段是的虚拟表的主键,是不能重复的,这是报错成功的关键。

  2. 刚刚我们提到了,报错的主要原因是因为group by后的主键重复了,那么我们就来看一下他到底在哪里重复的,什么时候重复的 首先rand()函数是用来生成一个0~1的随机数, 开头写的rand(0)*2是0~2的随机数,

    ps: 因为rand()生成的数毫无规律,而rand(0)生成的数有规率可循, floor函数是往下取整,举个例子

    select floor(rand()*2) from user;   该查询语句的结果为0100010   
    
    select floor(rand()*2) from user;
    

    该查询语句的结果为0110110

    ps:如果你觉得数据不够,不能够证明rand()的随机性,你可以多插入几条数据在尝试一下

    现在我们弄清楚了group by语句的工作流程以及rand()和rand(0)的区别,那么接下来就是重点了 在执行group
    by语句的时候,group by语句后面的字段会被运算两次。

    第一次:之前不是说了会把group by后面的字段值拿到虚拟表中去对比吗,在对比之前肯定要知道group by后面字段的值,所以第一次的运算就发生在这里

    第二次

    现在假设我们下一次扫描的字段值没有在虚拟表中出现,也就是group
    by后面的字段的值在虚拟表中还不存在,那么我们就需要把他插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致错误!

报错注入流程
目前还没有找到合适的环境来演示floor报错,不过既然我们搞清楚了floor报错的基本
原理,那么事实上流程就已经是比较简单的了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值