• ctfhub技能树—sql注入—报错注入


    打开靶机

    payload

    1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.columns group by x;

     payload拆分讲解

    1 count():count()函数返回匹配指定条件的行数。count(*)函数返回表中的记录数
    2 floor():floor:函数是用来向下取整呢个的,相当于去掉小数部分
    3 rand():rand()是随机取(01)中的一个数,但是给它一个参数后0,即rand(0),并且传如floor()后,即:floor(rand(0)*2)它就不再是随机了,序列0110110
    4 concat():用于连接两个字符串
    5 group by x:x就是相当于 as x,设一个别名
    6 0x26:16进制数值,ASCII为“&”,在回显中起到分隔作用

    产生原因

    MySQL报错注入通过构造payload让信息通过错误提示回显出来,主要应用与查询不回现内容,会打印错误信息;Update、insert等语句,会打印错误的信息。

     报错注入实现原因(摘自:https://www.cnblogs.com/Triomphe/p/9489639.html)

    报错的原因是因为rand()函数在查询的时候会执行一次,插入的时候还会执行一次.这就是整个语句报错的关键

    前面说过floor(rand(0)*2) 前六位是0110110

    group by x先建立一个空表,用于分组.然后进行分组查询,第一次rand()执行,查询的结果是0,因为是空表所以插入这条,而插入的时候rand()又执行了一次,所以表中的结果就是

    第一次执行完,接着执行rand()的值为1,因为表中存在,所以加1,表中结果成为

    到了第三次执行rand()是值为0,因为表中不存在所以要插入新的数据,这次插入rand()再次执行,所以插入的又是1.而表中已经存在1了

    此时插入因为重复出现同一个key,就会出现报错 重复出现key.而报错中会说明那个key有问题,我们的key中结合了想要了解的字符串root@localhost

    这样就实现了报错注入,拿到了自己想要的数据

    这就是整个报错注入的原理了,rand(),floor() group by 函数缺一不可.

    具体实验过程如下

    查看页面信息

    查询数据库名

    查询数据表信息

     查询字段

    查询字段数据信息

  • 相关阅读:
    【Angular】笔记(2):从前端基本知识认识Angular
    【Angular】笔记(1):使用.NET Framework类比认识Angular
    【C#】笔记(2):哈希表
    【WinForm】杂记(6):C#之DataTable类(总结)
    【C#】笔记(1):科学计算
    【WinForm】杂记(5):C#导入Excel到DataTable
    【WinForm】杂记(4):C#编写和调用exe程序(带参数)
    从mixin到new和prototype:Javascript原型机制详解
    亲身体验函数的柯里化
    简单理解jsonp原理
  • 原文地址:https://www.cnblogs.com/anweilx/p/12464859.html
Copyright © 2020-2023  润新知