mysql报错注入ctf_ctfhub技能树—sql注入—报错注入

打开靶机

91b91253ae541dbac1db883c83a8eb59.png

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()是随机取(0,1)中的一个数,但是给它一个参数后0,即rand(0),并且传如floor()后,即:floor(rand(0)*2)它就不再是随机了,序列01101104 concat():用于连接两个字符串5 group by x:x就是相当于 asx,设一个别名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()又执行了一次,所以表中的结果就是

c2fb1d438b51c77551e5b9bf46e90a75.png

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

6156fd8c270abb1e64d7cbbee3ec0c5b.png

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

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

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

960363b8eb4216e1124d50e71b3de1f3.png

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

具体实验过程如下

查看页面信息

2d678a2fa154ece663eddaf98f299473.png

查询数据库名

89e0a37e3b05eab11c9d1f24cd72db73.png

查询数据表信息

137f16a8f0681a6ffd8d5eacf95b27d0.png

189e9132ec8ca71dd872d605a8c5b8e2.png

3932f186e229e0a3286fad7b581c3004.png

查询字段

5b467aaa7e7c8c7cef1c7fbd67e514eb.png

af78d098ab93845957f1c1321e71bf5f.png

查询字段数据信息

dc1f0b3f85e3dd408ad23852f49001a2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值